Unidad 3 · Códigos de bloque lineales · H = [Pᵀ I], el criterio de pertenencia, las columnas de H, el dual, la paridad simple y la repetición, y el (8,4) auto-dual
La matriz generadora describe un código desde adentro: dice cómo fabricar cada palabra de código. El receptor no fabrica nada. Tiene en la mano bits y una sola pregunta: ¿esto es una palabra o no? Para contestarla hace falta la otra descripción, desde afuera: la lista de condiciones que toda palabra cumple. Esa lista es la matriz de paridad . Y sus filas, tomadas como palabras, forman otro código: el dual.
Sea un código : un subespacio de de dimensión . Su espacio dual es el conjunto de todos los vectores de ortogonales a todas las palabras de , con el producto interno de :
es un subespacio de dimensión . Una matriz de paridad de es cualquier matriz de cuyas filas sean una base de . Cada fila de es ortogonal a cada fila de , y eso, escrito de una vez, es
De ahí sale el criterio de pertenencia. Un vector de es palabra de si y sólo si
La ida es una línea: si , entonces . La vuelta es por dimensiones. Los vectores con son el espacio nulo de , que tiene dimensión porque tiene rango . Ese espacio contiene a , que también tiene dimensión : son el mismo. El código queda descripto dos veces, como el espacio fila de y como el espacio nulo de .
Cada fila de es una ecuación de control de paridad: una suma módulo 2 de ciertas posiciones de que tiene que dar cero. junta las sumas en un vector. Cuando es lo que llegó del canal y ese vector no da cero, se llama síndrome, y es el tema de la nota que sigue.
Paso 1: la G sistemática. Se lleva a su forma sistemática, con de :
El mensaje sale intacto en las primeras posiciones y la paridad en las últimas .
Paso 2: proponer H. Se traspone el bloque de paridad y se le pega una identidad del otro lado:
Paso 3: comprobar que G Hᵀ da cero. Por bloques, es arriba de , y el producto da dos veces lo mismo:
En todo elemento es su propio opuesto, así que sumar un bloque consigo mismo lo anula.
Paso 4: comprobar que sus filas son una base. El bloque identidad hace que las filas sean independientes: cada una tiene un 1 en una posición donde las demás tienen 0. Son vectores independientes de , que tiene dimensión , así que son una base.
Para el (7,4) del curso, con y :
Las tres filas de , como ecuaciones:
Pasando el último término de cada una al otro lado, que en no le cambia el signo, quedan , y : las tres paridades del codificador. La sistemática es el codificador escrito como verificación. La palabra 1001 011 las cumple: , y dan cero. Contando sobre los 128 vectores de , cada ecuación sola la cumplen 64, y las tres juntas, 16: las palabras.
H no es única. Cualquier base de sirve. Reemplazando la primera fila por la suma de las dos primeras sale 0101110 en lugar de 1011100: cambian las ecuaciones, y el conjunto de vectores que las cumple, comprobado sobre los 128, es el mismo. Una base ordenada de un espacio de dimensión 3 sobre se elige de maneras, así que el (7,4) tiene 168 matrices de paridad. La de la forma es la que se escribe sin hacer cuentas.
Y G tiene que poder ser sistemática. Si las primeras columnas de son dependientes, no hay sin permutar columnas. Con de filas 1100 y 0011, las dos primeras columnas son iguales. Intercambiando las posiciones 1 y 2 queda , la receta da , y hay que deshacer el intercambio en para volver al código original: sale con filas 1100 y 0011, igual a . No es casualidad, y vuelve en la sección 06.
Leída por filas, son ecuaciones. Leída por columnas dice otra cosa. La columna es lo que aporta la posición a las sumas: si tiene unos en las posiciones , y , entonces es la suma de , y , puestas en fila. Las siete columnas de la del (7,4) son
Son los siete vectores no nulos de , cada uno una sola vez. De ahí salen dos cosas que la no deja ver. Ninguna columna es nula, así que cambiar un solo bit de una palabra rompe al menos una ecuación. Y no hay dos columnas iguales, así que cambiar dos bits tampoco las deja en cero: dos columnas distintas no se cancelan. La distancia mínima es justamente la menor cantidad de columnas de que suman cero, y en el (7,4) son tres: , que es la palabra 1000 110.
La segunda consecuencia es la que corrige. Con un solo bit cambiado, en la posición , las tres sumas dan exactamente . Como las siete columnas son distintas, el resultado dice cuál bit fue. Ésa es la definición de los códigos de Hamming —columnas distintas y no nulas, todas las que entran en — y la Unidad 4 los construye así, eligiendo la antes que la .
Desde 1000 000 fallan las dos primeras ecuaciones: la columna . Tocá sólo los tres últimos bits, a . Cada uno aparece en una sola ecuación —es el bloque identidad de —, así que cada uno arregla o rompe la suya sin tocar las otras, y para el mensaje 1000 hay exactamente una paridad que cumple las tres: 110. Lo mismo con cualquier mensaje: las 16 palabras son los 16 mensajes, cada uno con su única paridad. Después, desde una palabra, cambiá un bit cualquiera: se rompen una, dos o tres ecuaciones, según cuántos unos tenga su columna, y nunca ninguna.
El botón del dual cambia la matriz por la del (7,4): cuatro ecuaciones, ocho palabras, y cada palabra que encuentres tiene peso 4 o es la nula. Con el (8,4) la matriz es otra vez una , pero las palabras que salen esconden algo: las dos secciones que siguen lo explican.
es un subespacio de , así que es a su vez un código lineal, de parámetros : el código dual de . Su matriz generadora es la de , y su matriz de paridad es la de . Los roles se cambian: lo que para uno es verificar, para el otro es fabricar. Y la relación es simétrica: el dual del dual es el código original.
El dual del (7,4) es un (7,3), con tasa y palabras: las combinaciones de las tres filas de .
0000000 · 1011100 · 1110010 · 0101110 · 0111001 · 1100101 · 1001011 · 0010111
Las siete no nulas tienen peso 4. Su enumerador de pesos es , y su distancia mínima, 4: un código donde todas las palabras no nulas están a la misma distancia de todas las demás. Se lo llama símplex.
El dual sirve también para contar. La identidad de MacWilliams da el enumerador de un código a partir del de su dual:
Con , y devuelve , la distribución del (7,4), sin enumerar sus 16 palabras. Cuando es chico y el dual tiene pocas palabras, ése es el camino corto. Para un código con 16 bits de paridad son 65 536 palabras del dual contra las del código.
El código de paridad simple agrega a bits de mensaje un único bit que deja par la cantidad de unos. Su matriz de paridad es una sola fila de unos,
y la única ecuación dice que la suma de todos los bits es cero. Todas sus palabras tienen peso par, así que : detecta cualquier cantidad impar de errores y no corrige ninguno. Su tasa, , es casi 1.
El código de repetición tiene dos palabras, la nula y la de todos unos. Su matriz generadora es
la misma fila. La de uno es la del otro: son duales. Medido con : la repetición (5,1) tiene , y su dual, un (5,4) con 10 palabras de peso 2 y 5 de peso 4, tiene .
El par marca los dos extremos. Con fijo, la paridad simple tiene la mayor tasa posible para un código que detecte algo, y la repetición la mayor posible, . Con impar la repetición corrige hasta errores votando por mayoría, y es un código perfecto. Todo código interesante vive en algún punto entre los dos.
Un código es auto-dual si coincide con su dual: . Las dimensiones ya ponen la condición: , así que es par y la tasa es exactamente . El (7,4) no puede serlo.
Que existan depende de algo que en los reales no pasa: en un vector no nulo puede ser ortogonal a sí mismo, porque es la cantidad de unos de módulo 2. pide que cada palabra sea ortogonal a todas, ella incluida, así que todas las palabras de un código auto-dual tienen peso par. Con alcanza mirar las filas: si y sólo si . Y si , entonces : el código es auto-dual cuando y , o sea cuando es la inversa de .
El ejemplo que importa es el Hamming extendido (8,4): el (7,4) con un octavo bit de paridad global, que deja par cada palabra.
, y su enumerador es : catorce palabras de peso 4, la nula y la de todos unos, todas de peso par. Su es 4. Las dos matrices son distintas y generan el mismo código: las filas de son las palabras de los mensajes 1011, 1110, 0111 y 1101. Cada palabra del (8,4) es a la vez algo que se transmite y una ecuación que toda palabra cumple. El (7,4), en cambio, tiene filas de peso 3 en su , y una fila de peso impar no es ortogonal a sí misma: .
El auto-dual más chico es la repetición (2,1), 00 y 11, que es también la paridad simple de largo 2: con el par dual de la sección anterior colapsa en un solo código. Y el (4,2) de filas 1100 y 0011 de la sección 02 es otro: por eso ahí la salía igual a la .
Con vectores reales, un subespacio y su complemento ortogonal sólo comparten el cero y, juntos, generan todo el espacio. Es tentador pensar el dual así, y en se rompe. El dual del (7,4) no está al costado del código: está adentro. Las ocho palabras del (7,3) son exactamente las ocho palabras de peso par del (7,4), comprobado sobre las 16. Entonces , y , de dimensión 4: no es . En el (8,4) es el caso extremo, la intersección es todo.
Lo único que sobrevive es la cuenta de dimensiones, : . No hay una descomposición de un vector en «parte en el código más parte en el dual», porque las dos partes juntas no llegan a todo . Dual quiere decir ortogonal, no complementario.
Y el criterio de pertenencia tiene su propio límite. dice si es una palabra, no si es la que se mandó. Un patrón de error que sea él mismo una palabra de código pasa las ecuaciones sin dejar rastro: en el (7,4) son 15 de los 127 patrones no nulos, y un síndrome cero no prueba nada.