Lección 7 de 11
Códigos cíclicos: palabras que son polinomios
Un código cíclico se describe con un solo polinomio, el generador. Aprenderás a construirlo y verás que un código de Hamming es uno de ellos.
Borrador: pendiente de que lo revise el autor. Esta página no aparece en Google.
Al terminar sabrás:
- Reconocer si un código lineal es cíclico
- Pasar una palabra a polinomio y ver el desplazamiento como multiplicar por x
- Obtener el polinomio generador y la dimensión del código
- Listar los códigos cíclicos binarios de longitud 7
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 decodificamos con una tabla de síndromes. Cuando crece, guardar o una tabla grande es incómodo. ¿Hay códigos que se describan con muy poca información y se codifiquen con circuitos sencillos?
Sí: los códigos cíclicos. Son la base de los CRC que protegen las tramas de red y los archivos ZIP, y (lo verás en la lección 9) de los códigos Reed-Solomon de los QR. Hace falta una idea nueva: tratar las palabras como polinomios.
La idea
Toma y desplázala una posición a la derecha, de forma que el último símbolo vuelva al principio: . Otro desplazamiento da . Tras 7 desplazamientos vuelves a la original: es girar una rueda con 7 casillas.
Un código es cíclico si es lineal y, cada vez que una palabra está en el código, sus desplazamientos también lo están. Parece una condición caprichosa, pero el código queda determinado por una sola palabra. El truco: escribir cada palabra como los coeficientes de un polinomio. Entonces desplazar es multiplicar por , y el álgebra de polinomios hace el trabajo.
Aviso de numeración. Solo en las lecciones de códigos cíclicos, las posiciones de una palabra se numeran desde 0: . Así el coeficiente de es y no hay que restar unos.
Palabras como polinomios
A cada palabra de le asociamos el polinomio
Por ejemplo, se corresponde con . El polinomio de una palabra de longitud tiene grado menor que .
Ahora multiplica por :
Casi es el desplazamiento, pero el último coeficiente ha quedado en , fuera de rango. Para devolverlo al principio declaramos que , es decir, trabajamos con los restos de dividir entre (el recuadro lo explica). Ese conjunto se escribe . En él,
que es exactamente la palabra desplazada. Multiplicar por es desplazar.
Repaso Polinomios módulo xⁿ − 1: un reloj de polinomios
En la lección 2 viste la aritmética del reloj: en , y los números dan la vuelta, como las horas. Con polinomios hacemos lo mismo: para declaramos . Cada se cambia por ; es y es . Todo polinomio se reduce a uno de grado menor que 7, es decir, a una palabra de 7 símbolos.
Al multiplicar por , el coeficiente de pasa a y da la vuelta al principio: es la rueda de 7 casillas. Y vale en este reloj.
Repaso División de polinomios y restos módulo 2
Dividir polinomios es como dividir números, quitando el término de mayor grado. Con coeficientes en , restar es lo mismo que sumar, porque .
Divide entre :
- El primer término del cociente es , porque .
- Calcula y réstalo (súmalo, en módulo 2): .
- El resto tiene grado 2, menor que el de (grado 3): ya hemos terminado.
Cociente y resto . Se escribe . Si el resto es 0, se dice que divide al polinomio.
El polinomio generador
Un código cíclico es cerrado por multiplicar por , y por tanto por multiplicar por cualquier polinomio (multiplicar por es desplazar dos veces; sumar palabras es linealidad). Entre todos los polinomios no nulos del código, escoge el de menor grado y hazlo mónico (coeficiente principal igual a 1). Es el polinomio generador del código. Tiene tres propiedades:
- Todas las palabras son múltiplos de , y todo múltiplo de de grado menor que está en el código (es una combinación de desplazamientos de ). Es decir, .
- divide a . Si divides, . En nuestro reloj vale 0, así que el resto cumple en el reloj: es un múltiplo de , es decir, una palabra del código. Pero tiene grado menor que , que es la palabra no nula de menor grado: luego .
- La dimensión es . Hay un polinomio de grado menor que por cada palabra, así que .
Y al revés: cada divisor mónico de genera un código cíclico de dimensión . Por eso, para encontrar todos los códigos cíclicos de longitud basta factorizar y combinar los factores.
Los códigos cíclicos binarios de longitud 7
Sobre , el polinomio se factoriza en irreducibles (no se puede romper más) como
(Compruébalo: , y al multiplicar por queda .) Tiene 3 factores irreducibles distintos, luego hay divisores mónicos y 8 códigos cíclicos binarios de longitud 7:
| generador | qué es | ||
|---|---|---|---|
| 7 | 1 | todo | |
| 6 | 2 | palabras de peso par | |
| 4 | 3 | Hamming | |
| 4 | 3 | Hamming (otro) | |
| 3 | 4 | dual de un Hamming | |
| 3 | 4 | dual del otro | |
| 1 | 7 | repetición | |
| 0 | no hay | solo la palabra |
Los extremos son triviales. El de es el código de paridad (palabras de peso par) de longitud 7, la versión larga del de la primera lección. El de repite el mismo bit 7 veces. Lo interesante está en medio: para buscar buenos códigos ya no exploras subespacios a ciegas, factorizas un polinomio.
Un código de Hamming cíclico
Toma . Como , la dimensión es . Sus palabras son los con : hay 1 de peso 0, 7 de peso 3, 7 de peso 4 y 1 de peso 7. Es la distribución de pesos del Hamming del hilo, y no por casualidad: este código es equivalente al del hilo, es decir, se obtiene de él reordenando las posiciones. Ojo: el código del hilo, con la de las lecciones 3 a 6, no es cíclico; lo es su versión reordenada. Tiene y corrige 1 error.
Este ya lo conoces: es el polinomio con el que construimos en la lección 2, y es una raíz suya (). Raíces y códigos volverán a juntarse con Reed-Solomon.
Las siete palabras de peso 3 son los siete desplazamientos de :
Las cuatro primeras son las filas de la matriz generatriz cíclica (). Las de peso 4 se obtienen sumando a estas (cambia ceros por unos), y faltan y .
Ejemplo resuelto
Pregunta: ¿es una palabra del código cíclico de generador ?
- Pasa a polinomio, con índices desde 0: .
- Está en el código si y solo si divide a . Divide: el término principal es , así que resta . Queda .
- Ahora el término principal es . Resta . Queda , de grado menor que 3.
El resto no es 0: no es palabra del código.
Y una que sí: , es decir, . Resta : queda . Resta : queda . Resta : queda . Resta : queda . El resto es 0, así que sí está en el código (es ).
Ejercicios
Ejercicio 1
Halla todos los códigos cíclicos binarios de longitud 3. Para cada uno, da el generador, y las palabras. Pista: es raíz de , luego lo divide.
Ver la solución
Al dividir entre sale , que no tiene raíces en (vale 1 en 0 y en 1). Así, . Hay 2 factores irreducibles distintos, luego divisores y 4 códigos:
- : , es todo .
- : , palabras (las de peso par).
- : , palabras y (el código de repetición).
- : , solo la palabra .
Ejercicio 2
Considera el código cíclico de longitud 7 con . Calcula su dimensión, escribe sus palabras y halla su distancia mínima.
Ver la solución
Como , la dimensión es y hay palabras. Como , sus desplazamientos son
siete palabras distintas; con completan las 8. Todas las no nulas tienen peso 4, así que y el código es un . Es el que aparece en la tabla como «dual de un Hamming».
Comprobación: , y en efecto .
En resumen
- Un código es cíclico si es lineal y cerrado por desplazamientos cíclicos. Con polinomios, desplazar es multiplicar por módulo .
- Todo código cíclico tiene un polinomio generador , divisor de , y sus palabras son los múltiplos de . La dimensión es .
- Los códigos cíclicos de longitud se obtienen factorizando . Sobre y hay 8, entre ellos dos .
- Un código de Hamming (equivalente al del hilo: el mismo con las posiciones reordenadas) es cíclico, con .
- Una palabra está en el código si y solo si el resto de dividirla entre es 0.
Siguiente lección: Codificar un código cíclico, y de ahí los CRC
Para profundizar
- W. C. Huffman y V. Pless, Fundamentals of Error-Correcting Codes (2003).
- R. Hill, A First Course in Coding Theory (1986).
- F. J. MacWilliams y N. J. A. Sloane, The Theory of Error-Correcting Codes (1977).