Saltar al contenido
El bit perdido
Newsletter

Lección 2 de 11

Cuerpos finitos: sumar y multiplicar con pocos símbolos

Qué es un cuerpo finito, por qué los códigos lo necesitan y cómo se construyen Z_p, F_4 y F_8 con sus tablas de sumar y multiplicar.

Borrador: pendiente de que lo revise el autor. Esta página no aparece en Google.

Al terminar sabrás:

  • Explicar por qué el alfabeto de un código lineal debe ser un cuerpo
  • Calcular en Z_p con p primo y ver por qué Z_4 no es un cuerpo
  • Sumar y multiplicar en F_4 y en F_8
  • Saber para qué tamaños existe un cuerpo finito

Si sabes multiplicar matrices, resolver un sistema de ecuaciones lineales y operar con polinomios (sumar, multiplicar, dividir), puedes seguirlo. Lo demás (aritmética módulo 2, subespacios, cuerpos finitos) se explica sobre la marcha.

En la lección anterior los símbolos eran bits y casi no necesitamos hacer cuentas con ellos. A partir de ahora sí: para construir códigos buenos hay que sumar palabras, multiplicarlas por números y resolver sistemas de ecuaciones, igual que en álgebra lineal. Para eso los símbolos deben comportarse como números normales. Los bits lo hacen (con 1+1=01+1=0), pero un código potente como el de los QR o el de un CD trabaja con bytes, que son 256 símbolos distintos. ¿Cómo se suman y se multiplican bytes de forma que todo siga funcionando? La respuesta son los cuerpos finitos.

La idea

En álgebra lineal usas los números reales: puedes sumar, restar, multiplicar y, lo importante, dividir entre cualquier número distinto de cero. Eso es lo que permite despejar una incógnita o aplicar Gauss sin que nada se rompa. Un conjunto con esas cuatro operaciones y las propiedades de siempre se llama cuerpo.

Los reales son infinitos, y en un código necesitamos un alfabeto finito. ¿Existen cuerpos con un número finito de elementos? Sí, y se llaman cuerpos finitos. Los bits {0,1}\{0,1\} con la aritmética módulo 2 son el más pequeño. Hay cuerpos de 3, 4, 5, 7, 8, 9, 11… elementos, y uno de 256 elementos, que es el que usan los QR y la demo del curso.

Repaso Qué es un cuerpo

Un cuerpo es un conjunto con una suma y una multiplicación que cumplen: son conmutativas y asociativas, la multiplicación se reparte sobre la suma, existen el 0 (neutro de la suma) y el 1 (neutro de la multiplicación, con 1≠01\neq 0), todo elemento tiene opuesto y, además, todo elemento distinto de 0 tiene inverso multiplicativo. Esa última condición es la que permite dividir. Los racionales, los reales y los complejos son cuerpos; los enteros no lo son, porque el 2 no tiene inverso entero.

Los enteros módulo p

La construcción más sencilla es la «aritmética del reloj». Fijado un entero n≥2n\ge 2, Zn={0,1,…,n−1}\mathbb{Z}_n=\{0,1,\dots,n-1\} con la suma y el producto usuales, tomando siempre el resto de dividir entre nn. Por ejemplo, en Z7\mathbb{Z}_7: 5+4=9=25+4=9=2 y 3⋅5=15=13\cdot 5=15=1.

Si pp es primo, Zp\mathbb{Z}_p es un cuerpo, que se escribe también Fp\mathbb{F}_p. La razón es que todo elemento no nulo tiene inverso. En Z7\mathbb{Z}_7, los inversos son:

aa123456
a−1a^{-1}145236

(por ejemplo 2⋅4=8=12\cdot 4=8=1). Con inversos, se puede dividir: a/b=a⋅b−1a/b=a\cdot b^{-1}.

Si nn no es primo, Zn\mathbb{Z}_n no es un cuerpo. Mira Z4\mathbb{Z}_4: 2⋅2=4=02\cdot 2=4=0. Dos números no nulos que al multiplicarse dan 0. Entonces el 2 no puede tener inverso (si lo tuviera, multiplicando 2⋅2=02\cdot 2=0 por él saldría 2=02=0) y ecuaciones tan simples como 2x=12x=1 no tienen solución, mientras que 2x=02x=0 tiene dos: x=0x=0 y x=2x=2. Por eso Z4n\mathbb{Z}_4^n no es un espacio vectorial y la teoría de este curso (subespacios, bases, dimensión, Gauss) no se le aplica. Existen códigos sobre el anillo Z4\mathbb{Z}_4, como los de Kerdock y Preparata, pero son otra historia. Para tener 4 símbolos usaremos otro conjunto de 4 elementos que sí es un cuerpo, y lo construimos enseguida.

Cuerpos de pmp^m elementos

¿Qué tamaños admiten un cuerpo? Se sabe que existe un cuerpo finito de qq elementos si y solo si qq es una potencia de un primo, q=pmq=p^m, y que, salvo renombrar los elementos, es único. Se escribe Fq\mathbb{F}_q. Así que hay un cuerpo de 2, 3, 4, 5, 7, 8, 9… elementos, pero ninguno de 6, 10 ni 12.

Para construir Fpm\mathbb{F}_{p^m} se usa una idea que ya conoces de Zp\mathbb{Z}_p, pero con polinomios: se trabaja con polinomios en xx con coeficientes en Fp\mathbb{F}_p y se toma el resto al dividir entre un polinomio irreducible de grado mm (que no se pueda factorizar), igual que antes se tomaba el resto al dividir entre un primo.

Repaso Restos de polinomios

Dividir polinomios es como dividir enteros: el resto tiene grado menor que el divisor. Trabajar «módulo x2+x+1x^2+x+1» significa sustituir cada polinomio por su resto. Basta con recordar la regla x2=x+1x^2=x+1 (en coeficientes módulo 2, −1=1-1=1, así que x2+x+1=0x^2+x+1=0 equivale a x2=x+1x^2=x+1) y aplicarla cada vez que aparece x2x^2. Con coeficientes binarios todo polinomio de grado menor que 2 es 00, 11, xx o x+1x+1: cuatro posibilidades.

El cuerpo F4\mathbb{F}_4

El polinomio x2+x+1x^2+x+1 es irreducible sobre F2\mathbb{F}_2: no vale 0 ni en x=0x=0 ni en x=1x=1, así que no tiene raíces, y un polinomio de grado 2 sin raíces no se factoriza (si se factorizara, tendría un factor de grado 1, es decir, una raíz). Así que nos inventamos una.

Repaso Inventar una raíz

La ecuación x2+1=0x^2+1=0 no tiene solución real, así que se inventa un número ii con i2=−1i^2=-1 y se trabaja con a+bia+bi; cada vez que sale i2i^2, se cambia por −1-1. Aquí hacemos lo mismo: x2+x+1x^2+x+1 no tiene raíces en {0,1}\{0,1\}, así que inventamos un símbolo α\alpha con α2+α+1=0\alpha^2+\alpha+1=0 y trabajamos con a+bαa+b\alpha, con a,b∈{0,1}a,b\in\{0,1\}. Cada vez que sale α2\alpha^2, se cambia por α+1\alpha+1. Por ejemplo, α3=α⋅α2=α2+α=(α+1)+α=1\alpha^3=\alpha\cdot\alpha^2=\alpha^2+\alpha=(\alpha+1)+\alpha=1. No hace falta saber «qué es» α\alpha: basta con la regla.

Sea, pues, α\alpha una raíz de x2+x+1x^2+x+1, es decir, α2=α+1\alpha^2=\alpha+1. Entonces

F4={0, 1, α, α+1}.\mathbb{F}_4=\{0,\ 1,\ \alpha,\ \alpha+1\}.

La suma es la de polinomios con coeficientes módulo 2. La multiplicación usa la regla α2=α+1\alpha^2=\alpha+1. Las tablas son:

++01α\alphaα+1\alpha+1
001α\alphaα+1\alpha+1
110α+1\alpha+1α\alpha
α\alphaα\alphaα+1\alpha+101
α+1\alpha+1α+1\alpha+1α\alpha10
⋅\cdot01α\alphaα+1\alpha+1
00000
101α\alphaα+1\alpha+1
α\alpha0α\alphaα+1\alpha+11
α+1\alpha+10α+1\alpha+11α\alpha

Por ejemplo, α⋅α=α2=α+1\alpha\cdot\alpha=\alpha^2=\alpha+1 y α⋅(α+1)=α2+α=(α+1)+α=1\alpha\cdot(\alpha+1)=\alpha^2+\alpha=(\alpha+1)+\alpha=1. Ahora sí: en cada fila de la tabla del producto, salvo la del 0, aparece un 1, es decir, todo elemento no nulo tiene inverso. Nótese que F4\mathbb{F}_4 no es Z4\mathbb{Z}_4: aquí 1+1=01+1=0 (todos los elementos son su propio opuesto), mientras que en Z4\mathbb{Z}_4 1+1=21+1=2.

El cuerpo F8\mathbb{F}_8

Igual, pero con un polinomio irreducible de grado 3: x3+x+1x^3+x+1. No tiene raíces en F2\mathbb{F}_2, y un polinomio de grado 3 que se factoriza tiene un factor de grado 1, es decir, una raíz; así que es irreducible. Sea α\alpha una raíz: α3=α+1\alpha^3=\alpha+1. Los elementos son los polinomios de grado menor que 3 en α\alpha, es decir, a0+a1α+a2α2a_0+a_1\alpha+a_2\alpha^2 con ai∈{0,1}a_i\in\{0,1\}: ocho en total. Y aquí ocurre algo muy útil. Calculando las potencias de α\alpha aparecen todos los elementos no nulos:

potenciapolinomio en α\alphavector (1,α,α2)(1,\alpha,\alpha^2)
α0\alpha^011(1,0,0)(1,0,0)
α1\alpha^1α\alpha(0,1,0)(0,1,0)
α2\alpha^2α2\alpha^2(0,0,1)(0,0,1)
α3\alpha^3α+1\alpha+1(1,1,0)(1,1,0)
α4\alpha^4α2+α\alpha^2+\alpha(0,1,1)(0,1,1)
α5\alpha^5α2+α+1\alpha^2+\alpha+1(1,1,1)(1,1,1)
α6\alpha^6α2+1\alpha^2+1(1,0,1)(1,0,1)

y α7=1\alpha^7=1. Ojo con el orden: el vector (a0,a1,a2)(a_0,a_1,a_2) es a0+a1α+a2α2a_0+a_1\alpha+a_2\alpha^2, con el término constante primero. Cada fila sale de la anterior multiplicando por α\alpha y usando α3=α+1\alpha^3=\alpha+1: por ejemplo, α4=α⋅α3=α2+α\alpha^4=\alpha\cdot\alpha^3=\alpha^2+\alpha y α5=α3+α2=α2+α+1\alpha^5=\alpha^3+\alpha^2=\alpha^2+\alpha+1.

Esta tabla es una «calculadora» completa de F8\mathbb{F}_8 con dos reglas:

  • Sumar es sumar los vectores módulo 2 (columna de la derecha).
  • Multiplicar es sumar los exponentes módulo 7: αi⋅αj=αi+j\alpha^i\cdot\alpha^j=\alpha^{i+j}, con α7=1\alpha^7=1.

Todo elemento no nulo es una potencia de α\alpha; a un elemento con esa propiedad se le llama primitivo. Todo cuerpo finito tiene alguno (es un teorema que aquí aceptamos sin demostrar), y eso es lo que hace tan cómodo calcular con ellos, y lo usaremos para los códigos de Reed-Solomon.

Ejemplo resuelto

Vamos a calcular en F8\mathbb{F}_8 el producto (α2+α)(α2+1)(\alpha^2+\alpha)(\alpha^2+1) de dos maneras y a resolver un sistema.

Producto, a la fuerza bruta. Desarrollamos y reducimos con α3=α+1\alpha^3=\alpha+1 y α4=α2+α\alpha^4=\alpha^2+\alpha:

(α2+α)(α2+1)=α4+α2+α3+α=(α2+α)+α2+(α+1)+α=α+1,(\alpha^2+\alpha)(\alpha^2+1)=\alpha^4+\alpha^2+\alpha^3+\alpha=(\alpha^2+\alpha)+\alpha^2+(\alpha+1)+\alpha=\alpha+1,

porque los dos α2\alpha^2 se anulan y de los tres α\alpha queda uno.

Producto, con la tabla. Según la tabla, α2+α=α4\alpha^2+\alpha=\alpha^4 y α2+1=α6\alpha^2+1=\alpha^6. Multiplicamos sumando exponentes: α4+6=α10=α3=α+1\alpha^{4+6}=\alpha^{10}=\alpha^3=\alpha+1. Sale lo mismo, y mucho más rápido.

Un sistema. Resolvamos en F8\mathbb{F}_8

{x+αy=α2αx+y=1\begin{cases}x+\alpha y=\alpha^2\\ \alpha x+y=1\end{cases}

De la primera, x=α2+αyx=\alpha^2+\alpha y. Sustituimos en la segunda: α3+α2y+y=1\alpha^3+\alpha^2y+y=1, es decir, (α2+1)y=1+α3(\alpha^2+1)y=1+\alpha^3. Como 1+α3=1+α+1=α1+\alpha^3=1+\alpha+1=\alpha y α2+1=α6\alpha^2+1=\alpha^6:

y=αα6=α1−6=α−5=α2.y=\frac{\alpha}{\alpha^6}=\alpha^{1-6}=\alpha^{-5}=\alpha^{2}.

(Dividir es restar exponentes, siempre módulo 7: −5≡2-5\equiv 2.) Y entonces x=α2+α⋅α2=α2+α3=(0,0,1)+(1,1,0)=(1,1,1)=α5x=\alpha^2+\alpha\cdot\alpha^2=\alpha^2+\alpha^3=(0,0,1)+(1,1,0)=(1,1,1)=\alpha^5. Comprobamos en la segunda ecuación: α⋅α5+α2=α6+α2=(1,0,1)+(0,0,1)=(1,0,0)=1\alpha\cdot\alpha^5+\alpha^2=\alpha^6+\alpha^2=(1,0,1)+(0,0,1)=(1,0,0)=1. La solución es x=α5x=\alpha^5, y=α2y=\alpha^2, única: justo lo que garantiza que estemos en un cuerpo.

Para qué sirve esto

Cuando en las próximas lecciones el alfabeto sea Fq\mathbb{F}_q, los códigos lineales serán subespacios de Fqn\mathbb{F}_q^n y todo el álgebra lineal funcionará como la conoces. En los códigos binarios, q=2q=2. En los de Reed-Solomon de las lecciones 9 a 11 usaremos F8\mathbb{F}_8 para el ejemplo. En la práctica, los QR, los CD y la demo usan F256\mathbb{F}_{256} (llamado a veces GF(256), de 256=28256=2^8): cada símbolo es un byte, sumar bytes es hacer el «o exclusivo» bit a bit y multiplicarlos sigue la misma idea que en F8\mathbb{F}_8, con un polinomio irreducible de grado 8.

Ejercicios

Ejercicio 1

En Z7\mathbb{Z}_7, calcula 3−13^{-1} y resuelve 3x=43x=4.

Ver la solución

Buscamos bb con 3b≡1(mod7)3b\equiv 1 \pmod 7. Probando, 3⋅5=15=2⋅7+13\cdot 5=15=2\cdot 7+1, así que 3−1=53^{-1}=5. Entonces x=4⋅3−1=4⋅5=20=2⋅7+6x=4\cdot 3^{-1}=4\cdot 5=20=2\cdot7+6, es decir, x=6x=6. Comprobación: 3⋅6=18=2⋅7+43\cdot 6=18=2\cdot7+4, que da 4.

Ejercicio 2

Con la tabla de F8\mathbb{F}_8, calcula: a) α3⋅α5\alpha^3\cdot\alpha^5; b) α4+α5\alpha^4+\alpha^5; c) α3+α6\alpha^3+\alpha^6; d) el inverso de α5\alpha^5.

Ver la solución

a) Sumamos exponentes: α3+5=α8=α7⋅α=α\alpha^{3+5}=\alpha^8=\alpha^7\cdot\alpha=\alpha.

b) α4=(0,1,1)\alpha^4=(0,1,1) y α5=(1,1,1)\alpha^5=(1,1,1). Su suma es (1,0,0)=1=α0(1,0,0)=1=\alpha^0.

c) α3=(1,1,0)\alpha^3=(1,1,0) y α6=(1,0,1)\alpha^6=(1,0,1). Su suma es (0,1,1)=α4(0,1,1)=\alpha^4.

d) Buscamos jj con 5+j≡0(mod7)5+j\equiv 0 \pmod 7: j=2j=2. El inverso de α5\alpha^5 es α2\alpha^2, porque α5⋅α2=α7=1\alpha^5\cdot\alpha^2=\alpha^7=1.

Ejercicio 3

Explica por qué Z6\mathbb{Z}_6 no es un cuerpo. Después resuelve en F8\mathbb{F}_8 la ecuación α2x=α5+1\alpha^2x=\alpha^5+1.

Ver la solución

En Z6\mathbb{Z}_6, 2⋅3=6=02\cdot 3=6=0 con 22 y 33 no nulos, así que ni el 2 ni el 3 tienen inverso (como en Z4\mathbb{Z}_4 con el 2). Tampoco existe ningún cuerpo de 6 elementos, porque 6 no es potencia de un primo.

Para la ecuación en F8\mathbb{F}_8: α5+1=(1,1,1)+(1,0,0)=(0,1,1)=α4\alpha^5+1=(1,1,1)+(1,0,0)=(0,1,1)=\alpha^4. Entonces x=α4/α2=α2x=\alpha^4/\alpha^2=\alpha^2. Comprobación: α2⋅α2=α4\alpha^2\cdot\alpha^2=\alpha^4.

En resumen

  • Para hacer álgebra lineal con los símbolos de un código necesitamos un cuerpo: sumar, restar, multiplicar y dividir entre lo no nulo.
  • Zp\mathbb{Z}_p con pp primo es un cuerpo; Z4\mathbb{Z}_4 o Z6\mathbb{Z}_6 no lo son, porque tienen divisores de cero.
  • Existe un cuerpo de qq elementos si y solo si qq es potencia de un primo, y se construye con polinomios módulo uno irreducible.
  • En F8\mathbb{F}_8, sumar es sumar vectores módulo 2 y multiplicar es sumar exponentes de α\alpha módulo 7.
  • Los QR, los CD y la demo trabajan con F256\mathbb{F}_{256}: cada símbolo es un byte.

Siguiente lección: Códigos lineales: un código que es un subespacio

Pruébalo: Raya y corrige

Para profundizar