Saltar al contenido
El bit perdido
Newsletter

Lección 3 de 11

Códigos lineales: un código que es un subespacio

Qué es un código lineal, por qué basta mirar el peso mínimo para conocer la distancia y cómo se ve todo en el código de Hamming [7,4,3].

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

Al terminar sabrás:

  • Reconocer si un código es lineal
  • Calcular la dimensión k y el número de palabras q^k
  • Hallar la distancia mínima como peso mínimo no nulo
  • Leer los parámetros [n,k,d] de un código

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 construimos los alfabetos buenos: los cuerpos finitos, donde se puede sumar, restar, multiplicar y dividir. Ahora los usamos. Un código de bloque, tal como lo vimos en la primera lección, es una lista de palabras. Si la lista tiene millones de palabras, ¿cómo la guardas? ¿Cómo calculas su distancia mínima sin comparar todas las parejas? Los códigos lineales contestan a las dos preguntas a la vez: toda la lista cabe en unas pocas filas de números.

La idea

Imagina un código con 2202^{20} palabras, algo más de un millón. Para hallar su distancia mínima habría que comparar cada palabra con todas las demás: del orden de medio billón de parejas. Y para codificar haría falta una tabla enorme que dijera qué palabra corresponde a cada mensaje.

Los códigos lineales evitan todo eso con una condición muy sencilla: si sumas dos palabras del código, el resultado sigue siendo una palabra del código. Lo mismo si multiplicas una palabra por un escalar. Los matemáticos dicen que el código es un subespacio vectorial.

Esa estructura tiene dos premios. Primero, el código se describe con unas pocas palabras «ladrillo» (una base) y todas las demás salen de combinarlas. Segundo, desde cualquier palabra el código se ve igual: si le restas a todas las palabras una palabra del código, obtienes el mismo conjunto. Por eso la distancia mínima se calcula mirando solo desde la palabra cero.

Repaso Repaso: subespacio, base y dimensión

Recuerda que Fqn\mathbb{F}_q^n es el conjunto de todas las filas de nn símbolos del cuerpo Fq\mathbb{F}_q. Se suma posición a posición (en F2\mathbb{F}_2, con 1+1=01+1=0) y se multiplica por un escalar del cuerpo.

Un subespacio es un subconjunto que contiene al vector cero y es cerrado: la suma de dos vectores suyos y cualquier múltiplo escalar de uno suyo siguen dentro.

Una base es una lista de vectores del subespacio tal que ninguno es combinación de los otros (son linealmente independientes) y que entre todos generan el subespacio: cada vector del subespacio es, de una única manera, una combinación a1v1+⋯+akvka_1v_1+\dots+a_kv_k. El número kk de vectores de una base es la dimensión, y no depende de la base que elijas.

Consecuencia que usaremos: si hay kk vectores en la base y cada coeficiente aia_i puede tomar qq valores, el subespacio tiene exactamente qkq^k vectores.

Definición

Sea Fq\mathbb{F}_q un cuerpo finito. Un código lineal CC de longitud nn sobre Fq\mathbb{F}_q es un subespacio vectorial de Fqn\mathbb{F}_q^n. Dicho con palabras de andar por casa:

  • la palabra cero (0,…,0)(0,\dots,0) está en CC;
  • si x,y∈Cx, y \in C, entonces x+y∈Cx+y \in C;
  • si x∈Cx \in C y a∈Fqa \in \mathbb{F}_q, entonces ax∈Cax \in C.

En el caso binario, F2={0,1}\mathbb{F}_2=\{0,1\}, multiplicar por un escalar solo puede dar 0⋅x=00\cdot x = 0 o 1⋅x=x1\cdot x = x, así que basta comprobar que la suma de dos palabras del código es del código.

La dimensión kk del código es la dimensión de ese subespacio. Como una base tiene kk vectores y cada coeficiente toma qq valores,

∣C∣=qk.|C| = q^k.

El peso wt(x)\mathrm{wt}(x) de una palabra es el número de posiciones distintas de cero. Se tiene d(x,y)=wt(x−y)d(x,y)=\mathrm{wt}(x-y): los símbolos en que dos palabras difieren son exactamente los símbolos no nulos de su diferencia.

Un código lineal de longitud nn, dimensión kk y distancia mínima dd se llama código [n,k,d]q[n,k,d]_q (o [n,k,d][n,k,d] si el cuerpo se sobreentiende). Observa los corchetes: la notación (n,M,d)(n,M,d) de la primera lección hablaba de un código cualquiera con MM palabras; en un lineal, M=qkM=q^k. La tasa es R=k/nR=k/n: la fracción de cada palabra que lleva información.

La distancia mínima es el peso mínimo no nulo

En un código cualquiera, la distancia mínima exige comparar todas las parejas. En un código lineal basta esto:

d=min⁡{wt(c):c∈C, c≠0}.d = \min\{\mathrm{wt}(c) : c \in C,\ c \neq 0\}.

La razón cabe en una línea: si xx e yy son palabras distintas del código, x−yx-y es una palabra del código no nula y d(x,y)=wt(x−y)d(x,y)=\mathrm{wt}(x-y); recíprocamente, cada palabra no nula cc cumple wt(c)=d(c,0)\mathrm{wt}(c)=d(c,0), con 00 también del código. Así que el conjunto de distancias entre parejas y el conjunto de pesos de palabras no nulas son el mismo.

Pasamos de comparar del orden de ∣C∣2|C|^2 parejas a mirar ∣C∣−1|C|-1 pesos. Y en la lección siguiente veremos que ni siquiera hace falta listar las palabras.

Ejemplo resuelto

Tomamos el código de Hamming [7,4,3][7,4,3] binario, nuestro ejemplo hilo. Sus palabras son todas las combinaciones de las cuatro filas de

G=(1000110010010100100110001111).G=\begin{pmatrix}1&0&0&0&1&1&0\\0&1&0&0&1&0&1\\0&0&1&0&0&1&1\\0&0&0&1&1&1&1\end{pmatrix}.

(En la próxima lección veremos por qué esta matriz «fabrica» el código; de momento, solo nos interesan las filas.)

Paso 1: dimensión y número de palabras. Hay k=4k=4 filas independientes (las cuatro primeras columnas forman la matriz identidad: cada fila es la única con un 1 en su columna, así que ninguna es combinación de las otras). Entonces ∣C∣=24=16|C|=2^4=16 palabras, de longitud n=7n=7.

Paso 2: cerrado por la suma. Sumamos las dos primeras filas, módulo 2:

(1,0,0,0,1,1,0)+(0,1,0,0,1,0,1)=(1,1,0,0,0,1,1).(1,0,0,0,1,1,0)+(0,1,0,0,1,0,1)=(1,1,0,0,0,1,1).

Es otra palabra del código, porque es la suma de las filas 1 y 2 de GG. De hecho, la suma de dos palabras cualesquiera sigue siendo combinación de las filas, es decir, palabra del código. En cambio, (1,0,0,0,0,0,0)(1,0,0,0,0,0,0) no está en el código. Como las cuatro primeras columnas de GG son la identidad, los cuatro primeros símbolos de una combinación son sus coeficientes. Una combinación que empiece por 1,0,0,01,0,0,0 solo puede ser la fila 1, que es (1,0,0,0,1,1,0)≠(1,0,0,0,0,0,0)(1,0,0,0,1,1,0)\neq(1,0,0,0,0,0,0).

Paso 3: lista de pesos. Las 16 palabras son las combinaciones mGmG, con mm uno de los 16 mensajes de 4 bits. Puedes verlas todas aquí:

Repaso Las 16 palabras del código de Hamming

Cada palabra es la suma de las filas de GG que indica el mensaje (por ejemplo, 10111011 suma las filas 1, 3 y 4).

mensajepalabrapesomensajepalabrapeso
000000000000100010001103
000100011114100110010013
001000100113101010101014
001100111003101110110104
010001001013110011000114
010101010103110111011004
011001101104111011100003
011101110014111111111117

Contando los pesos:

peso0347
número de palabras1771

(1 + 7 + 7 + 1 = 16, como debe ser.) Por ejemplo, la suma del paso 2, 11000111100011, tiene peso 4.

Paso 4: distancia mínima. El peso mínimo no nulo es 3, así que d=3d=3 sin comparar las (162)=120\binom{16}{2}=120 parejas. Los parámetros son [7,4,3][7,4,3], y como t=⌊(3−1)/2⌋=1t=\lfloor (3-1)/2\rfloor=1, el código corrige un error. Su tasa es R=4/7R=4/7: de cada 7 símbolos, 4 son información y 3 son la redundancia que permite corregir.

Ejercicios

Ejercicio 1

Decide si son lineales (sobre F2\mathbb{F}_2):

a) C1={000, 110, 011, 101}C_1=\{000,\,110,\,011,\,101\}

b) C2={0000, 1100, 0011, 1110}C_2=\{0000,\,1100,\,0011,\,1110\}

Ver la solución

a) Contiene la palabra cero. Sumamos las parejas de palabras no nulas: 110+011=101110+011=101, 110+101=011110+101=011 y 011+101=110011+101=110, todas en C1C_1. Luego C1C_1 es lineal. Tiene 4=224=2^2 palabras, así que k=2k=2. Sus pesos no nulos son 2, 2 y 2, luego d=2d=2: es un código [3,2,2][3,2,2] (el código de paridad de la primera lección).

b) Contiene el cero, pero 1100+0011=11111100+0011=1111 no está en C2C_2. No es cerrado por la suma, así que no es lineal. (Que ∣C2∣=4|C_2|=4 sea potencia de 2 no basta para ser lineal.)

Ejercicio 2

Sea CC el código binario de longitud 5 generado por las palabras 1011010110 y 0110101101. Escribe todas sus palabras, y halla nn, kk, dd y la tasa.

Ver la solución

Las combinaciones posibles de las dos palabras (cada coeficiente es 0 o 1) son:

  • 0⋅(10110)+0⋅(01101)=000000\cdot(10110)+0\cdot(01101)=00000
  • 1⋅(10110)+0⋅(01101)=101101\cdot(10110)+0\cdot(01101)=10110
  • 0⋅(10110)+1⋅(01101)=011010\cdot(10110)+1\cdot(01101)=01101
  • 10110+01101=1101110110+01101=11011

Hay ∣C∣=4=22|C|=4=2^2 palabras: n=5n=5 y k=2k=2. Los pesos no nulos son 33, 33 y 44, así que d=3d=3. Es un código [5,2,3][5,2,3], con tasa R=2/5R=2/5, y corrige un error.

Ejercicio 3

Sobre F3={0,1,2}\mathbb{F}_3=\{0,1,2\} (suma módulo 3) considera el código CC generado por (1,0,1,1)(1,0,1,1) y (0,1,1,2)(0,1,1,2).

a) ¿Cuántas palabras tiene?

b) Escribe las 9 palabras.

c) Calcula dd.

Ver la solución

a) Hay k=2k=2 vectores independientes y q=3q=3, así que ∣C∣=32=9|C|=3^2=9.

b) Las palabras son a (1,0,1,1)+b (0,1,1,2)a\,(1,0,1,1)+b\,(0,1,1,2) con a,b∈{0,1,2}a,b\in\{0,1,2\}, haciendo las cuentas módulo 3:

(a,b)(a,b)palabra
(0,0)(0,0)00000000
(1,0)(1,0)10111011
(2,0)(2,0)20222022
(0,1)(0,1)01120112
(0,2)(0,2)02210221
(1,1)(1,1)11201120
(1,2)(1,2)12021202
(2,1)(2,1)21012101
(2,2)(2,2)22102210

Por ejemplo, (1,1)(1,1): (1,0,1,1)+(0,1,1,2)=(1,1,2,3)=(1,1,2,0)(1,0,1,1)+(0,1,1,2)=(1,1,2,3)=(1,1,2,0). Y (2,2)(2,2): (2,0,2,2)+(0,2,2,4)=(2,2,4,6)=(2,2,1,0)(2,0,2,2)+(0,2,2,4)=(2,2,4,6)=(2,2,1,0).

c) Las ocho palabras no nulas tienen peso 3. Luego d=3d=3 y CC es un código [4,2,3]3[4,2,3]_3. (Se conoce como el tetracódigo, y lo volveremos a ver.)

En resumen

  • Un código lineal es un subespacio de Fqn\mathbb{F}_q^n: contiene al cero y es cerrado por suma y por múltiplos escalares.
  • Si tiene dimensión kk, tiene qkq^k palabras, y se describe con [n,k,d]q[n,k,d]_q; la tasa es k/nk/n.
  • En un código lineal, la distancia mínima es el peso mínimo de una palabra no nula.
  • El código de Hamming [7,4,3][7,4,3] tiene 16 palabras con pesos 00 (una), 33 (siete), 44 (siete) y 77 (una).

Siguiente lección: Matriz generatriz y matriz de paridad

Para profundizar