Saltar al contenido
El bit perdido
Newsletter

Lección 4 de 11

Matriz generatriz y matriz de paridad

Cómo codificar con una matriz G, comprobar si una palabra es del código con una matriz H, pasar de una a otra y leer en H la distancia mínima.

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

Al terminar sabrás:

  • Codificar un mensaje con la matriz generatriz G
  • Pasar G a forma sistemática y obtener H, o hallar G a partir de H
  • Comprobar si una palabra pertenece al código con H
  • Deducir d mirando las columnas de H

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.

Un código lineal es un subespacio, y un subespacio se puede describir de dos maneras: dando una base (las palabras «ladrillo» con las que se construye todo) o dando ecuaciones (las condiciones que cumplen sus vectores). Cada descripción da una matriz y cada matriz sirve para algo distinto: la primera, para codificar; la segunda, para comprobar si lo que ha llegado es una palabra del código. Es una idea parecida a la del dígito de control del DNI o del IBAN, pero para códigos que además corrigen.

La idea

Piensa en el código de Hamming [7,4,3][7,4,3]. Para enviar 4 bits necesitas una regla que los convierta en una palabra de 7: multiplicar el mensaje por una matriz. Si el mensaje se copia en las primeras 4 posiciones y se añaden 3 bits de control, el receptor lo lee sin hacer cuentas.

La otra cara es el control. Cada bit de control es una ecuación: «la suma de estas posiciones ha de ser 0». Si una palabra cumple las tres ecuaciones, es del código. Si falla alguna, algo ha ido mal. Escribir las ecuaciones como filas de una matriz da la matriz de paridad.

Matriz generatriz

Una matriz generatriz de un código [n,k]q[n,k]_q es una matriz GG de tamaño k×nk\times n cuyas filas forman una base del código. Codificar es multiplicar:

c=mG,m∈Fqk, c∈C.c = mG, \qquad m\in\mathbb{F}_q^k,\ c\in C.

Como las palabras son vectores fila, mGmG es la combinación de las filas de GG con los coeficientes de mm. Cada mensaje da una palabra distinta (las filas son independientes), y se recorren las qkq^k palabras del código.

Un código tiene muchas matrices generatrices (una por base), pero la más cómoda es la forma sistemática

G=[ Ik∣P ],G=[\,I_k \mid P\,],

con IkI_k la identidad k×kk\times k y PP una matriz k×(n−k)k\times(n-k). Entonces c=mG=(m∣mP)c=mG=(m \mid mP): los primeros kk símbolos son el propio mensaje y los n−kn-k restantes son la redundancia.

Si G no está en forma sistemática

Se aplica el método de Gauss a las filas: intercambiarlas, multiplicar una por un escalar no nulo y sumar a una un múltiplo de otra. Así cambia la base, pero no el código: cada operación se puede deshacer.

Ejemplo: el código binario con filas F1=1101000F_1=1101000, F2=0110100F_2=0110100, F3=0011010F_3=0011010 y F4=0001101F_4=0001101 (volverá a salir en la lección 7). Vamos limpiando columnas, módulo 2:

  • Columna 2: F1+F2=1011100F_1+F_2=1011100 pasa a ser la fila 1.
  • Columna 3: la fila 1 pasa a 1011100+F3=10001101011100+F_3=1000110 y la fila 2 a F2+F3=0101110F_2+F_3=0101110.
  • Columna 4: la fila 2 pasa a 0101110+F4=01000110101110+F_4=0100011 y la fila 3 a F3+F4=0010111F_3+F_4=0010111.
G′=(1000110010001100101110001101)=[ I4∣P′ ].G'=\begin{pmatrix}1&0&0&0&1&1&0\\0&1&0&0&0&1&1\\0&0&1&0&1&1&1\\0&0&0&1&1&0&1\end{pmatrix}=[\,I_4\mid P'\,].

Si falta algún pivote, hay que reordenar las posiciones: sale un código equivalente (mismos parámetros), no el mismo.

Matriz de paridad

Una matriz de paridad (o matriz de control) de un código [n,k]q[n,k]_q es una matriz HH de tamaño (n−k)×n(n-k)\times n y rango n−kn-k tal que

c∈C  ⟺  HcT=0.c\in C \iff Hc^T=0.

Aquí cTc^T es cc escrita en columna. Cada fila de HH es una ecuación: n−kn-k ecuaciones independientes dejan kk grados de libertad.

Si G=[ Ik∣P ]G=[\,I_k\mid P\,], una matriz de paridad se obtiene sin cálculo:

H=[ −PT∣In−k ].H=[\,-P^T \mid I_{n-k}\,].

La razón tiene dos partes. Primero, GHT=−P+P=0GH^T = -P + P = 0 al multiplicar por bloques: cada fila de GG cumple las ecuaciones de HH, y con eso todas sus combinaciones, así que CC está dentro de las soluciones de HcT=0Hc^T=0. Segundo, como HH contiene la identidad In−kI_{n-k}, tiene rango n−kn-k, y las soluciones forman un subespacio de dimensión n−(n−k)=kn-(n-k)=k, la misma que CC. Por eso coinciden. En binario, −PT=PT-P^T=P^T.

Para comprobar una palabra recibida rr se multiplica: si HrT=0Hr^T=0, es del código; si no, hay un error (la lección 6 llama a HrTHr^T síndrome).

De H a G

Si te dan HH, las palabras del código son las soluciones del sistema HcT=0Hc^T=0. Basta resolverlo: una base de soluciones es una matriz generatriz. Si H=[ A∣In−k ]H=[\,A\mid I_{n-k}\,], la receta de antes al revés da G=[ Ik∣−AT ]G=[\,I_k\mid -A^T\,].

Ejemplo: la matriz de paridad del Hamming «de manual», cuya columna ii es el número ii escrito en binario:

H=(000111101100111010101).H=\begin{pmatrix}0&0&0&1&1&1&1\\0&1&1&0&0&1&1\\1&0&1&0&1&0&1\end{pmatrix}.

Sus ecuaciones son c4=c5+c6+c7c_4=c_5+c_6+c_7, c2=c3+c6+c7c_2=c_3+c_6+c_7 y c1=c3+c5+c7c_1=c_3+c_5+c_7 (en binario, restar es sumar). Las incógnitas libres son c3,c5,c6,c7c_3,c_5,c_6,c_7. Dando a una de ellas el valor 1 y a las demás 0 salen cuatro soluciones:

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

Son independientes (cada una es la única con un 1 en su incógnita libre), así que forman una base. El mensaje va en las posiciones 3, 5, 6 y 7, y el control en las 1, 2 y 4.

Código dual

Las filas de HH son n−kn-k vectores independientes de Fqn\mathbb{F}_q^n. Generan otro código, de dimensión n−kn-k, que se llama el código dual C⊥C^\perp: el formado por todas las palabras yy con y⋅c=0y\cdot c=0 para toda c∈Cc\in C. Así, HH es matriz generatriz de C⊥C^\perp y GG es matriz de paridad de C⊥C^\perp. Por ejemplo, el dual del código de repetición [3,1][3,1] es el código de paridad [3,2][3,2]. Ojo: en un cuerpo finito un vector puede ser ortogonal a sí mismo, como (1,1)⋅(1,1)=1+1=0(1,1)\cdot(1,1)=1+1=0 en binario; no pasa nada.

Leer la distancia mínima en H

Llama h1,…,hnh_1,\dots,h_n a las columnas de HH. Entonces

HcT=c1h1+c2h2+⋯+cnhn.Hc^T=c_1h_1+c_2h_2+\dots+c_nh_n.

Una palabra de peso ww es, por tanto, una combinación nula de ww columnas con coeficientes no nulos. En binario: cc es del código si y solo si suman cero las columnas de las posiciones donde cc tiene un 1. Es decir:

La distancia mínima dd de un código es el menor número de columnas de HH que son linealmente dependientes.

Consecuencias inmediatas, y la clave de los códigos de Hamming:

  • Si ninguna columna de HH es nula, no hay palabras de peso 1: d≥2d\ge 2.
  • Si además ninguna columna es múltiplo de otra (en binario: si todas son distintas), no hay palabras de peso 2: d≥3d\ge 3.

En F3\mathbb{F}_3 no basta con que sean distintas: las columnas (1,0)(1,0) y (2,0)(2,0) son distintas, pero su suma es cero.

Códigos de Hamming

Para r≥2r\ge 2 tomamos como columnas de HH todos los vectores no nulos de F2r\mathbb{F}_2^r, cada uno una vez. Hay 2r−12^r-1, y esa es la longitud. El código resultante es el código de Hamming de parámetros

[ 2r−1, 2r−1−r, 3 ].[\,2^r-1,\ 2^r-1-r,\ 3\,].

Tiene d≥3d\ge3 porque las columnas son binarias, distintas y no nulas, y d=3d=3 porque hay tres columnas dependientes: (1,0,…,0)(1,0,\dots,0), (0,1,0,…,0)(0,1,0,\dots,0) y su suma, que también es columna de HH. Para r=2r=2, las columnas (1,0)(1,0), (0,1)(0,1) y (1,1)(1,1) dan el código de repetición [3,1,3][3,1,3]; para r=3r=3, el [7,4,3][7,4,3]; para r=4r=4, el [15,11,3][15,11,3]. Todos corrigen un error, y la tasa crece con rr: 1/31/3, 4/74/7, 11/1511/15.

Ejemplo resuelto

Con el ejemplo hilo: el código de Hamming [7,4,3][7,4,3] con

G=(1000110010010100100110001111),H=(110110010110100111001).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},\qquad H=\begin{pmatrix}1&1&0&1&1&0&0\\1&0&1&1&0&1&0\\0&1&1&1&0&0&1\end{pmatrix}.

Paso 1: forma sistemática. G=[I4∣P]G=[I_4\mid P] con

P=(110101011111).P=\begin{pmatrix}1&1&0\\1&0&1\\0&1&1\\1&1&1\end{pmatrix}.

Trasponemos PP y la ponemos a la izquierda de I3I_3: H=[PT∣I3]H=[P^T\mid I_3], la matriz de arriba.

Paso 2: codificar. El mensaje m=(1,0,1,1)m=(1,0,1,1) da c=mGc=mG, la suma de las filas 1, 3 y 4 de GG:

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

Los cuatro primeros símbolos son el mensaje, 10111011, y los tres últimos, la redundancia, 010010.

Paso 3: comprobar GHT=0GH^T=0. Por bloques, GHT=P+P=0GH^T=P+P=0 en binario. A mano, la fila 1 de GG, (1,0,0,0,1,1,0)(1,0,0,0,1,1,0), coincide con la fila 1 de HH en las posiciones 1 y 5 (1+1=01+1=0), con la fila 2 en las posiciones 1 y 6 (1+1=01+1=0) y con la fila 3 en ninguna.

Paso 4: ¿es palabra del código? Para r=(1,0,1,1,0,1,0)r=(1,0,1,1,0,1,0), fila por fila:

  • Fila 1: 1+0+0+1+0+0+0=01+0+0+1+0+0+0=0.
  • Fila 2: 1+0+1+1+0+1+0=01+0+1+1+0+1+0=0.
  • Fila 3: 0+0+1+1+0+0+0=00+0+1+1+0+0+0=0.

Sale (0,0,0)T(0,0,0)^T: sí es palabra del código. Si cambiamos el bit de la posición 6 y recibimos r′=(1,0,1,1,0,0,0)r'=(1,0,1,1,0,0,0), resulta Hr′T=(0,1,0)T≠0Hr'^T=(0,1,0)^T\neq 0: no es palabra del código, ha habido un error.

Paso 5: distancia mínima en HH. Las siete columnas de HH son (1,1,0)(1,1,0), (1,0,1)(1,0,1), (0,1,1)(0,1,1), (1,1,1)(1,1,1), (1,0,0)(1,0,0), (0,1,0)(0,1,0) y (0,0,1)(0,0,1): los siete vectores no nulos de F23\mathbb{F}_2^3, todos distintos. Luego d≥3d\ge3. Y las columnas 1, 2 y 3 suman (0,0,0)(0,0,0), así que d=3d=3.

Paso 6: el dual. Las combinaciones de las filas de HH son 00000000000000, las filas 11011001101100, 10110101011010, 01110010111001 y sus sumas 01101100110110, 10101011010101, 11000111100011 y 00011110001111. Las siete no nulas pesan 4: el dual es un [7,3,4][7,3,4].

Ejercicios

Ejercicio 1

Codifica m=(0,1,1,0)m=(0,1,1,0) con la GG del ejemplo y comprueba con HH que sale palabra del código. ¿Lo es r=(0,1,1,0,0,1,1)r=(0,1,1,0,0,1,1)?

Ver la solución

mGmG es la suma de las filas 2 y 3 de GG: (0,1,0,0,1,0,1)+(0,0,1,0,0,1,1)=(0,1,1,0,1,1,0)(0,1,0,0,1,0,1)+(0,0,1,0,0,1,1)=(0,1,1,0,1,1,0).

Con HH: fila 1, posiciones 1, 2, 4, 5: 0+1+0+1=00+1+0+1=0; fila 2, posiciones 1, 3, 4, 6: 0+1+0+1=00+1+0+1=0; fila 3, posiciones 2, 3, 4, 7: 1+1+0+0=01+1+0+0=0. Es palabra del código.

Para rr: fila 1: 0+1+0+0=10+1+0+0=1; fila 2: 0+1+0+1=00+1+0+1=0; fila 3: 1+1+0+1=11+1+0+1=1. Resulta (1,0,1)T≠0(1,0,1)^T\neq 0: rr no es palabra del código.

Ejercicio 2

Un código binario [5,2][5,2] tiene matriz generatriz

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

Halla una matriz de paridad HH, comprueba GHT=0GH^T=0 y averigua dd a partir de las columnas de HH.

Ver la solución

Está en forma sistemática, G=[I2∣P]G=[I_2\mid P] con P=(110101)P=\begin{pmatrix}1&1&0\\1&0&1\end{pmatrix}. En binario, H=[PT∣I3]H=[P^T\mid I_3]:

H=(111001001001001).H=\begin{pmatrix}1&1&1&0&0\\1&0&0&1&0\\0&1&0&0&1\end{pmatrix}.

Comprobación: por bloques, GHT=P+P=0GH^T=P+P=0; a mano, cada fila de GG coincide con cada fila de HH en un número par de unos.

Las columnas de HH son (1,1,0)(1,1,0), (1,0,1)(1,0,1), (1,0,0)(1,0,0), (0,1,0)(0,1,0) y (0,0,1)(0,0,1): binarias, no nulas y distintas, así que d≥3d\ge3. Además, las columnas 1, 3 y 4 suman (0,0,0)(0,0,0), por lo que d=3d=3. Coincide con el ejercicio 2 de la lección anterior.

Ejercicio 3

Sobre F3\mathbb{F}_3, el tetracódigo tiene matriz generatriz

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

Halla H=[−PT∣I2]H=[-P^T\mid I_2]. Codifica el mensaje m=(2,1)m=(2,1) y comprueba el resultado con HH.

Ver la solución

Aquí P=(1112)P=\begin{pmatrix}1&1\\1&2\end{pmatrix}, que es simétrica: PT=PP^T=P. Cambiamos el signo módulo 3: −1=2-1=2 y −2=1-2=1. Entonces

H=(22102101).H=\begin{pmatrix}2&2&1&0\\2&1&0&1\end{pmatrix}.

Codificamos: c=mG=2 (1,0,1,1)+1 (0,1,1,2)=(2,1,3,4)=(2,1,0,1)c=mG=2\,(1,0,1,1)+1\,(0,1,1,2)=(2,1,3,4)=(2,1,0,1) módulo 3.

Comprobamos: fila 1 de HH: 2⋅2+2⋅1+1⋅0+0⋅1=6=02\cdot2+2\cdot1+1\cdot0+0\cdot1=6=0; fila 2: 2⋅2+1⋅1+0⋅0+1⋅1=6=02\cdot2+1\cdot1+0\cdot0+1\cdot1=6=0. Resulta HcT=(0,0)THc^T=(0,0)^T. Los dos primeros símbolos de cc son el mensaje (2,1)(2,1).

Ejercicio 4

Halla el código dual C⊥C^\perp del código [5,2,3][5,2,3] del ejercicio 2: escribe sus palabras y da sus parámetros. Comprueba su distancia mínima mirando las columnas de su matriz de paridad.

Ver la solución

C⊥C^\perp está generado por las filas de la HH del ejercicio 2: 1110011100, 1001010010 y 0100101001. Sus 23=82^3=8 palabras son 0000000000, las tres filas y sus sumas:

11100+10010=01110,11100+01001=10101,10010+01001=11011,11100+10010+01001=00111.11100+10010=01110,\quad 11100+01001=10101,\quad 10010+01001=11011,\quad 11100+10010+01001=00111.

Los pesos no nulos son 3,2,2,3,3,4,33, 2, 2, 3, 3, 4, 3. El mínimo es 2: C⊥C^\perp es un [5,3,2][5,3,2].

Comprobación: una matriz de paridad de C⊥C^\perp es la GG del ejercicio 2. Sus columnas son (1,0)(1,0), (0,1)(0,1), (1,1)(1,1), (1,0)(1,0) y (0,1)(0,1). La 1 y la 4 son iguales, así que suman cero y d=2d=2: es la palabra 1001010010.

En resumen

  • La matriz generatriz GG (k×nk\times n) codifica: c=mGc=mG. Con el método de Gauss se lleva a la forma sistemática G=[Ik∣P]G=[I_k\mid P], en la que el mensaje aparece en las primeras kk posiciones.
  • La matriz de paridad HH ((n−k)×n(n-k)\times n) comprueba: c∈C  ⟺  HcT=0c\in C\iff Hc^T=0. Si G=[Ik∣P]G=[I_k\mid P], entonces H=[−PT∣In−k]H=[-P^T\mid I_{n-k}]. Al revés, GG sale de resolver el sistema HcT=0Hc^T=0.
  • El código dual C⊥C^\perp tiene a HH como matriz generatriz y a GG como matriz de paridad.
  • La distancia mínima es el menor número de columnas de HH linealmente dependientes. Columnas no nulas y sin ninguna múltiplo de otra dan d≥3d\ge3; en binario, basta con que sean no nulas y distintas.
  • El código de Hamming usa como columnas todos los vectores no nulos de F2r\mathbb{F}_2^r y tiene parámetros [2r−1, 2r−1−r, 3][2^r-1,\,2^r-1-r,\,3].

Siguiente lección: Errores y borrones

Para profundizar