Debemos encontrar una forma sistemática de generar códigos lineales así como métodos rápidos de decodificación. Examinando las propiedades de la matriz H y eligiendo H cuidadosamente, es posible desarrollar métodos muy eficientes para codificar y decodificar mensajes. Con este objetivo, introduciremos la matriz generadora estándar y la matriz verificadora canónica.
Supongamos que H es una matriz de m×n con coeficiente en Z2 y n>m. las últimas m columnas de la matriz forman la matriz identidad de m×m,Im, entonces la matriz es una matriz verificadora canónica. Más específicamente, H=(A∣Im), donde A es la matriz de m×(n−m)
(a11a12⋯a1,n−ma21a22⋯a2,n−m⋮⋮⋱⋮am1am2⋯am,n−m)
y Im es la matriz identidad de m×m
(10⋯001⋯0⋮⋮⋱⋮00⋯1).
Con cada matriz verificadora canónica podemos asociar una matriz generadora estándar de n×(n−m)
G=(In−mA).
Nuestro objetivo será mostrar que existe un x que satisfaga Gx=y si y solo si Hy=0. dado un bloque x a ser codificado, la matriz G nos permitirá codificarlo rápidamente a una palabra y del código lineal.
Ejemplo8.23
Supongamos que tenemos las siguientes ocho palabras por codificar:
(000),(001),(010),…,(111).
Para
A=(011110101),
la matrices generadora estándar y verificadora canónica son
G=(100010001011110101)
y
H=(011100110010101001),
respectivamente.
Observe que las filas en H representan las verificaciones de paridad en ciertas posiciones de las 6-tuplas. Los unos en la matriz identidad sirven como verificadores de paridad para los unos en la misma fila. Si x=(x1,x2,x3,x4,x5,x6), entonces
0=Hx=(x2+x3+x4x1+x2+x5x1+x3+x6),
lo que produce un sistema de ecuaciones:
x2+x3+x4=0x1+x2+x5=0x1+x3+x6=0.
Acá x4 sirve como bit de control para x2 y x3;x5 es un bit de control para x1 y x2; y x6 es un bit de control para x1 y x3. La matriz identidad impide que x4,x5, y x6 tengan que controlarse entre ellos. Luego, x1,x2, y x3 pueden ser arbitrarios pero x4,x5, y x6 deben ser escogidos de manera de asegurar las paridades respectivas. Se calcula fácilmente que el espacio nulo de H es
Una forma aún más fácil de calcular el espacio nulo es con la matriz generadora G (Tabla 8.24).
Palabra de Mensaje x
Palabra del código Gx
000
000000
001
001101
010
010110
011
011011
100
100011
101
101110
110
110101
111
111000
Cuadro8.24Un código generado por una matriz
Teorema8.25
Si H∈Mm×n(Z2) es una matriz verificadora canónica, entonces Null(H) consiste de todas las x∈Zn2 cuyos primeros n−m bits son arbitrarios pero cuyos últimos m bits están determinados por Hx=0. Cada uno de los últimos m bits sirve como control de paridad para algunos de los primeros n−m bits. Luego, H da lugar a un código de bloque (n,n−m).
Dejamos la demostración de este teorema como ejercicio. A la luz del teorema, los primeros n−m bits de x se denominan bits de información y los últimos m bits se denominan bits de verificación. En el Ejemplo 8.23, los primeros tres bits son de información y los últimos tres son bits de verificación.
Teorema8.26
Supongamos que G es una matriz generadora estándar de n×k. Entonces C={y:Gx=y para x∈Zk2} es un código de bloque (n,k). Más específicamente, C es un código de grupo.
Sean \(G {\mathbf x}_1 = {\mathbf y}_1\) y \(G {\mathbf x}_2 ={\mathbf y}_2\) dos palabras del código. Entonces \({\mathbf y}_1 + {\mathbf y}_2\) está en \(C\) pues
Debemos mostrar además que dos bloques de mensaje diferentes no pueden ser codificados a la misma palabra del código. Es decir, debemos mostrar que si \(G {\mathbf x} = G {\mathbf y}\text{,}\) entonces \({\mathbf x} = {\mathbf y}\text{.}\) Supongamos que \(G {\mathbf x} = G {\mathbf y}\text{.}\) Entonces
\begin{equation*}
G {\mathbf x} - G {\mathbf y} = G( {\mathbf x} - {\mathbf y}) = {\mathbf 0}.
\end{equation*}
Pero las primeras \(k\) coordenadas en \(G( {\mathbf x} - {\mathbf y})\) son exactamente \(x_1 -y_1, \ldots, x_k - y_k\text{,}\) pues están determinadas por la matriz identidad, \(I_k\text{,}\) que es parte de \(G\text{.}\) Luego, \(G( {\mathbf x} - {\mathbf y}) = {\mathbf 0}\) si y solo si \({\mathbf x} = {\mathbf y}\text{.}\)
Antes de demostrar la relación entre la matriz verificadora canónica y la matriz generadora estándar, demostraremos un lema.
Lema8.27
Sea H=(A∣Im) una matriz verificadora canónica de m×n y G=(In−mA) la correspondiente matriz generadora estándar de n×(n−m). Entonces HG=0.
\begin{equation*}
\delta_{ij} =
\begin{cases}
1, & i = j \\
0, & i \neq j
\end{cases}
\end{equation*}
es la delta de Kronecker.
Teorema8.28
Sea H=(A∣Im) una matriz verificadora canónica de m×n y sea G=(In−mA) la correspondiente matriz generadora estándar de n×(n−m). Sea C el código generado por G. Entonces y está en C si y solo si Hy=0. En particular, C es un código lineal con matriz verificadora canónica H.
Primero supongamos que \({\mathbf y} \in C\text{.}\) Entonces \(G {\mathbf x} = {\mathbf y}\) para algún \({\mathbf x} \in {\mathbb Z}_2^m\text{.}\) Por el Lema 8.27, \(H {\mathbf y} = HG {\mathbf x} = {\mathbf 0}\text{.}\)
Recíprocamente, supongamos que \({\mathbf y} = (y_1, \ldots, y_n)^{\rm t}\) está en el espacio nulo de \(H\text{.}\) Debemos encontrar \({\mathbf x}\) en \({\mathbb Z}_2^{n-m}\) tal que \(G {\mathbf x}^{\rm t} = {\mathbf y}\text{.}\) Como \(H {\mathbf y} = {\mathbf 0}\text{,}\) se debe satisfacer el siguiente conjunto de ecuaciones:
Por ende podemos tomar \(x_i = y_i\) para \(i= 1, \ldots, n - m\text{.}\)
Sería bueno poder calcular la distancia mínima de un código lineal directamente a partir de su matriz H para poder determinar las capacidades de detección y corrección de errores del código. Supongamos que
e1=(100⋯00)te2=(010⋯00)t⋮en=(000⋯01)t
son la n-tuplas en Zn2 de peso 1. Para una matriz binaria H de m×n,Hei es exactamente la columna i-ésima de la matriz H.
Ejemplo8.29
Observe que
(111001001011001)(01000)=(101).
Enunciamos el resultado en la siguiente proposición y dejamos su demostración como ejercicio.
Proposición8.30
Sea ei la n-tupla binaria con un 1 en la i-ésima coordenada y 0 en todas las demás y supongamos que H∈Mm×n(Z2). Entonces Hei es la i-ésima columna de la matriz H.
Teorema8.31
Sea H una matriz binaria de m×n. Entonces el espacio nulo de H es un código que puede detectar un error si y solo si ninguna columna de H consiste solamente de ceros.
Supongamos que \({\rm Null}(H)\) es un código que detecta un error. Entonces la distancia mínima del código debe ser al menos 2. Como el espacio nulo es un código de grupo, es necesario que el código no tenga ninguna palabra de peso menor a 2 aparte de la palabra cero. Es decir, \({\mathbf e}_i\) no debe ser una palabra del código para \(i = 1, \ldots, n\text{.}\) Como \(H{\mathbf e}_i\) es la \(i\)-ésima columna de \(H\text{,}\) la \(i\)-ésima columna no tiene puros ceros.
Recíprocamente, supongamos que ninguna columna de \(H\) es la columna cero. Por la Proposición 8.30, \(H{\mathbf e}_i \neq {\mathbf 0}\text{;}\) luego, la distancia mínima del código es al menos 2, y el código tiene la capacidad de detectar un error..
Ejemplo8.32
Si consideramos las matrices
H1=(111001001011001)
y
H2=(111001000011001),
entonces el espacio nulos de H1 es un código que detecta un error y el espacio nulo de H2 no lo es.
Podemos mejorar el Teorema 8.31. Este teorema nos entrega condiciones sobre la matriz H que nos dicen cuándo el peso mínimo del código formado por el espacio nulo de H es 2. También podemos determinar cuándo la distancia mínima de un código lineal es 3 examinando la matriz correspondiente.
Ejemplo8.33
Si hacemos
H=(111010011100)
y queremos determinar si H es la matriz verificadora canónica para un código corrector de un error, es necesario asegurarse que Null(H) no contenga ninguna 4-tupla de peso 2. Es decir, (1100),(1010),(1001),(0110),(0101), y (0011) no deben estar en Null(H). El próximo teorema establece que podemos saber si el código determinado por H es corrector de errores examinando las columnas de H. Note en este ejemplo que no solo H no tiene columnas nulas, sino que tampoco tiene columnas repetidas.
Teorema8.34
Sea H una matriz binaria. El espacio nulo de H es un código corrector de un error si H no contiene columnas de puros ceros ni dos columnas iguales.
La \(n\)-tupla \({\mathbf e}_{i} +{\mathbf e}_{j}\) tiene unos en la posiciones \(i\)-ésima y \(j\)-ésima y ceros en las demás, y \(w( {\mathbf e}_{i} +{\mathbf e}_{j}) = 2\) para \(i \neq j\text{.}\) Como
Solo puede ocurrir si la \(i\)-ésima y la \(j\)-ésima columnas son idénticas. Como no contiene palabras de peso menor o igual a 2, el espacio nulo de \(H\) es un código corrector de un error.
Supongamos ahora que tenemos una matriz verificadora canónica H con tres filas. Nos podemos preguntar cuántas columnas le podemos agregar a la matriz y seguir teniendo un espacio nulo que sea un código que detecte y corrija un error. Como cada columna tiene tres entradas, hay 23=8 columnas diferentes posibles. No podemos agregar las columnas
(000),(100),(010),(001).
Podemos entonces agregar hasta cuatro columnas manteniendo una distancia mínima de 3.
En general, si H es una matriz verificadora canónica de m×n, entonces hay n−m posiciones de información en cada palabra del código. Cada columna tiene m bits, así es que hay 2m posibles columnas diferentes. Es necesario que las columnas 0,e1,…,em sean excluidas, dejando 2m−(1+m) columnas restantes para información si queremos mantener la habilidad de no solo detectar sino también corregir un error.