Lección 8 de 11
Codificar códigos cíclicos: del polinomio generador a los CRC
Codifica con un polinomio generador, de forma sistemática o no, comprueba palabras con el polinomio de control y detecta errores con el resto de una división.
Borrador: pendiente de que lo revise el autor. Esta página no aparece en Google.
Al terminar sabrás:
- Codificar un mensaje multiplicando por g(x)
- Codificar de forma sistemática con el resto de x^(n-k) m(x) entre g(x)
- Obtener h(x) y las matrices generatriz y de paridad de un cíclico
- Calcular el síndrome como un resto y corregir un error en Hamming
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.
Ya sabes qué es un código cíclico: sus palabras son los múltiplos de un generador , divisor de . Queda lo práctico: ¿cómo se codifica, se comprueba y se corrige? Todo se reduce a multiplicar y dividir polinomios. Y verás qué hay detrás de la palabra «CRC» de tantos archivos y protocolos de red.
Seguimos numerando desde 0: . Trabajamos con el Hamming cíclico de la lección anterior, con .
La idea
Hay dos maneras de pasar de 4 bits de mensaje a 7 de palabra.
- Multiplicar. Ves el mensaje como un polinomio de grado menor que 4 y calculas . Es inmediato, pero el mensaje queda «mezclado» en la palabra.
- Dividir. Pones el mensaje en las últimas posiciones y rellenas las primeras con la redundancia justa para que el polinomio sea múltiplo de . La redundancia es el resto de una división, y el mensaje se lee al final de la palabra.
La segunda es la codificación sistemática, la misma idea que la forma de la lección 4, pero con polinomios. Ojo: aquí la redundancia va delante y el mensaje detrás, al revés que en la lección 4; es solo una convención. Es la idea de los CRC.
Codificación no sistemática
El código es . Para el mensaje tenemos y
es decir, ( aparece tres veces y en módulo 2 queda una). El mensaje no se ve por ninguna parte. Es lo mismo que calcular con la matriz generatriz cíclica, cuyas filas son :
Multiplicar por es sumar las filas que indica : aquí suma las filas 1, 3 y 4.
Codificación sistemática
Queremos una palabra «redundancia + mensaje», con el mensaje en los últimos coeficientes. Receta:
- Calcula : es colocar el mensaje en las últimas posiciones.
- Divide entre y quédate con el resto , de grado menor que .
- La palabra es (en módulo 2, sumar es restar).
¿Por qué es múltiplo de ? Si , entonces . Y como tiene grado menor que , solo toca las primeras posiciones y no estropea el mensaje.
Para , con :
- .
- Dividimos entre : restamos (queda ), luego (queda ), luego (queda ) y por último (queda ).
- El resto es .
- Palabra: , es decir, .
Los 3 primeros símbolos, , son la redundancia y los 4 últimos, , el mensaje. Comprobación: al dividir entre el resto es 0 (es la división del ejemplo «que sí» de la lección anterior).
El polinomio de control
El polinomio de control es . Para nuestro código,
Comprueba palabras: está en el código si y solo si . Si , entonces , que vale 0 cuando . Y al revés: si , entonces .
También da la matriz de paridad. Escribe los coeficientes de al revés, de a : . Las filas de son esa lista desplazada:
¿Por qué? Cada entrada de resulta ser un coeficiente de de grado entre 1 y 6, y todos ellos son 0. Así que . Cuidado: no es la del hilo, porque este código tiene las posiciones en otro orden (es equivalente, no igual).
El síndrome es un resto
Si recibes , con palabra y el error, entonces el resto de dividir entre es
porque es múltiplo de y su resto es 0. El síndrome es el resto de dividir entre y solo depende del error, igual que en la lección 6. Basta una división, que un circuito con registros de desplazamiento hace al vuelo.
Ojo: hay dos síndromes, el vector de la lección 6 y este resto . Son objetos distintos, pero guardan la misma información: dos palabras recibidas tienen el mismo si y solo si tienen el mismo resto (en ambos casos, si y solo si su diferencia está en el código).
Un error en la posición es . Los restos de entre son:
| posición | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
|---|---|---|---|---|---|---|---|
Los 7 restos son distintos y no nulos (son los 7 polinomios no nulos de grado menor que 3): el síndrome señala la posición del error.
CRC: detectar con el mismo truco
Los CRC (comprobación de redundancia cíclica) son, en esencia, la codificación sistemática de arriba, con un elegido para detectar y mensajes larguísimos. El emisor ve la trama como un polinomio, calcula el resto de dividir entre y lo añade como redundancia. (Se transmite primero el coeficiente de mayor grado, así que el resto, de grados bajos, va al final de la trama.) El receptor divide lo que le llega; si el resto no es cero, hay un error y el dato no se acepta: Ethernet descarta la trama y un descompresor ZIP avisa de que el archivo está dañado. Los estándares reales, como el CRC-32 de Ethernet y ZIP, añaden detalles (un valor inicial y un complemento final) que no cambian la idea. En el ejercicio 3 calculas un CRC a mano.
Una ráfaga de longitud es un error cuyas posiciones dañadas caben en un tramo de símbolos seguidos (no tienen por qué cambiar todos). Si el término independiente de es 1, se detecta toda ráfaga de longitud menor o igual que , sea cual sea la longitud del mensaje. La razón: esa ráfaga es con y ; como no tiene factor , para dividir a tendría que dividir a , y no puede. Sin esa condición falla: divide a la ráfaga . Los generadores de códigos cíclicos y de CRC estándar la cumplen.
Ejemplo resuelto
Enviamos con el código sistemático y hay un error en la posición 4.
1. Palabra enviada. Como arriba, .
2. Palabra recibida. El error cambia el coeficiente de : , es decir, .
3. Síndrome. Divide entre :
- Resta : queda .
- Resta : queda .
- Resta : queda .
El resto es : hay un error.
4. Posición. En la tabla, es el resto de . Error en la posición 4.
5. Corrección. Cambia : , la palabra enviada. Sus 4 últimos símbolos dan el mensaje, .
Ejercicios
Ejercicio 1
Codifica de forma sistemática el mensaje con .
Ver la solución
, luego . Divide entre :
- Resta : queda .
- Resta : queda .
El resto es . La palabra es , es decir, : redundancia y mensaje .
Ejercicio 2
Con la matriz de paridad de esta lección (la del código ), decide si y son palabras del código. Si alguna no lo es, di qué columna de aparece en el síndrome.
Ver la solución
Cada componente de es el producto escalar de una fila de con , módulo 2. Las filas de tienen unos en , y .
Para (unos en ) los solapes son , y , de tamaños 4, 2 y 2: todos pares. El síndrome es , luego es palabra del código.
Para (unos en ) los solapes tienen tamaños 4, 2 y 3. El síndrome es , así que no es palabra. Es la última columna de , la de la posición 6: es la palabra anterior con un error ahí.
Ejercicio 3
Calcula a mano un CRC de 3 bits con para el mensaje de 8 bits , escrito como se transmite (del coeficiente de mayor grado al de menor). Comprueba después que la trama completa da resto 0.
Ver la solución
El mensaje es , y se escribe (ojo: aquí los bits van de mayor a menor grado, como en los CRC; en el resto de la lección, era , de menor a mayor). Multiplicar por es añadir tres ceros: . Divide: pon bajo el primer 1, suma módulo 2 cifra a cifra (sin llevadas) y repite hasta que queden menos de 4 cifras.
11010011000
1011
1100011000
1011
111011000
1011
10111000
1011
1000
1011
011El resto es , es decir, : ese es el CRC. La trama enviada es .
El receptor divide entre : los pasos son los mismos, pero al final queda en lugar de , y . Resto 0: trama aceptada. Si cambia un bit (una ráfaga de longitud 1), el resto deja de ser 0.
En resumen
- No sistemática: , o sea, con de filas
- Sistemática: , con el resto de dividir entre . El mensaje se lee al final.
- El polinomio de control comprueba palabras () y da la matriz de paridad.
- El síndrome es el resto de dividir entre ; en Hamming cada resto es distinto y señala la posición del error.
- Los CRC usan este mecanismo para detectar errores en datos largos. Si , detectan toda ráfaga de longitud hasta .
Siguiente lección: Códigos Reed-Solomon
Para profundizar
- W. C. Huffman y V. Pless, Fundamentals of Error-Correcting Codes (2003).
- R. M. Roth, Introduction to Coding Theory (2006).
- R. Hill, A First Course in Coding Theory (1986).