Bitácora · FEC · Concepto

La distancia mínima

Unidad 3 · Códigos de bloque lineales · peso y distancia, el peso mínimo, las columnas de H, la distribución de pesos, la capacidad de corrección, las esferas y los modos de operación

Un código sirve si sus palabras están lejos unas de otras: para que el canal convierta una en otra tiene que dar vuelta muchos bits a la vez. La distancia mínima mide cuán lejos están las dos más cercanas, y de ese solo número salen cuántos errores se detectan y cuántos se corrigen con garantía.

01 · Peso y distancia

El peso de Hamming de un vector v de Vn, w(v), es la cantidad de componentes no nulas. La distancia de Hamming entre dos vectores, d(u,v), es la cantidad de posiciones en que difieren. Las dos se tocan en una identidad:

d(u,v)=w(u+v)

La suma módulo 2 pone un 1 exactamente donde los dos vectores difieren. Con dos palabras del (7,4): 1000 110 y 0100 011 suman 1100 101, de peso 4, y difieren en cuatro posiciones.

La distancia es una métrica de verdad: no es negativa, es simétrica, vale cero sólo entre un vector y sí mismo, y cumple la desigualdad triangular, d(u,v)+d(v,x)≥d(u,x). Por eso vale la imagen que se usa todo el tiempo: los 2n vectores son los vértices de un hipercubo de n dimensiones, la distancia es la cantidad de aristas para ir de uno a otro, y las palabras de código son un subconjunto de vértices que conviene tener separados.

02 · La distancia mínima es el peso mínimo

La distancia mínima de un código C es la menor distancia entre dos palabras distintas:

dmin=min{d(v,x):v,x∈C,v≠x}

Es tan central que un código se nombra por la terna (n,k,dmin). Por la definición hay que comparar todos los pares: en el (7,4) son (162)=120. Contados uno por uno, 56 pares están a distancia 3, 56 a distancia 4 y 8 a distancia 7. En un código lineal alcanza con mucho menos: si wmin es el menor peso de las palabras no nulas,

dmin=wmin

Paso 1: cada distancia es un peso. Por la identidad de arriba, d(v,x)=w(v+x), y como el código es lineal, v+x es otra palabra, no nula porque v≠x.

Paso 2: cada peso es una distancia. El peso de una palabra no nula v es su distancia a la palabra nula, w(v)=d(v,0), y la nula está en todo código lineal.

Paso 3: mismos conjuntos, mismo mínimo. Los números sobre los que se toman los dos mínimos coinciden, así que los mínimos coinciden.

El costo pasa de los pares a las palabras: 15 pesos en vez de 120 comparaciones. Sigue siendo exponencial en k, y hay un camino mejor, que mira la matriz de paridad en vez de las palabras. La misma cuenta dice algo más: vistas desde cualquier palabra, las demás están a las mismas distancias que vistas desde la nula. Por eso las 120 distancias son los 15 pesos vistos desde cada una de las 16 palabras, con cada par contado dos veces: los 56 pares a distancia 3 son 16·7/2. En un código lineal ninguna palabra está peor rodeada que otra.

03 · La distribución de pesos

dmin es el primer peso no nulo, pero para calcular probabilidades hace falta saber cuántas palabras hay de cada peso. La distribución de pesos es la lista A0,A1,…,An, con Ai la cantidad de palabras de peso i. Siempre A0=1 y ∑iAi=2k, y se la junta en el polinomio enumerador A(z)=∑iAizi.

códigoA₀A₁A₂A₃A₄A₅A₆A₇A₈dmin
(7,4)10077001·3
(8,4)10001400014

El (7,4) es el de la Tabla 1 del apunte, con A(z)=1+7z3+7z4+z7. El (8,4) es el mismo con un bit más de paridad global, que vuelve par toda palabra: las de peso 3 pasan a 4, las de peso 4 se quedan, y la distancia mínima sube a 4.

Lo que importa del primer coeficiente no nulo es su tamaño. Sobre el BSC con probabilidad de bit p chica, un patrón de error pasa inadvertido sólo si es una palabra, y la cuenta la dominan las más livianas: Pu≈Adminpdmin. En el (7,4), 7p3; con p=10−2 la cuenta exacta da 6,79·10−6. Dos códigos con la misma dmin pueden diferir en ese coeficiente, y la distancia mínima sola no lo ve.

Calcular la distribución de un código grande es difícil en general. La identidad de MacWilliams la saca de la del código dual, que conviene cuando el dual tiene pocas palabras.

04 · La distancia mínima, leída en las columnas de H

Con H=[h0h1⋯hn−1] escrita por columnas, el producto vHT es la suma de las columnas donde v tiene un 1, y v es palabra si y sólo si esa suma da cero. Juntando las dos cosas:

Hay una palabra de peso w con unos en las posiciones i1,…,iw si y sólo si hi1+⋯+hiw=0. Entonces dmin es la menor cantidad de columnas de H que suman cero, o sea, que son linealmente dependientes: sobre GF(2) los únicos coeficientes no nulos son unos, y «dependientes» es «alguna suma da cero». Y hay más: la cantidad de conjuntos de w columnas que suman cero es exactamente Aw, porque cada conjunto es una palabra.

De ahí salen dos criterios que se aplican mirando:

Las siete columnas de la H del (7,4) son 110 011 111 101 100 010 001: los siete vectores no nulos de V3, todos distintos. Entonces dmin≥3. Y no puede ser más, porque con todos los no nulos de V3 presentes, la suma de dos columnas cualesquiera es otra columna: h0+h1=101=h3, y la palabra con unos en 0, 1 y 3 es 1101 000.

El criterio también sirve para diseñar. Un código con dmin≥3 y n−k bits de paridad es una elección de n columnas distintas y no nulas de Vn−k, y como hay 2n−k−1, el largo queda acotado: n≤2n−k−1. Usarlas todas es la familia de Hamming. Para llegar a 4 hace falta que tampoco sume cero ninguna terna. Las ocho columnas del (8,4) son 1101 0111 1110 1011 1000 0100 0010 0001, todas de peso impar, y tres vectores de peso impar suman uno de peso impar, que nunca es cero.

Simulación El menor conjunto de columnas que suma cero — tocá columnas de H para elegirlas; a la derecha, su suma bit a bit. Cuando da cero, las posiciones elegidas forman una palabra. Buscá el conjunto más chico.
Código
columnas — suma — vector — menor hallado — conjuntos que suman cero 0 dmin sin confirmar

Una columna sola no da cero, y dos tampoco: el widget lo dice en cuanto lo probás, y son los dos criterios de recién. En el (7,4) la primera terna que suma cero aparece enseguida; hay siete, una por cada palabra de peso 3. Elegir las siete columnas también da cero: es 1111 111. En el (8,4) ninguna terna sirve, por la paridad de los pesos, y el conjunto más chico tiene cuatro columnas: hay catorce, una por cada palabra de peso 4.

05 · Detectar: hasta dmin − 1

El receptor detecta un error cuando lo recibido no es palabra, o sea cuando el síndrome no es nulo. El error pasa inadvertido sólo si el patrón e es él mismo una palabra no nula, y ninguna pesa menos que dmin:

se detectan todos los patrones de hasta dmin−1 errores

Es una garantía de peor caso. Por encima de dmin−1 no se promete nada, pero casi todo se detecta igual: de los 2n−1 patrones no nulos se escapan sólo los 2k−1 que son palabras. En el (7,4), 15 de 127, y cuáles son lo cuenta un síndrome cero no prueba nada.

06 · Corregir: t y las esferas

Corregir pide más que detectar: hay que saber qué palabra se mandó. Alrededor de cada palabra se traza una esfera de radio t, los vectores a distancia ≤t de ella. Si las esferas no se tocan, todo vector recibido con t errores o menos cae en la esfera de la palabra transmitida y en ninguna otra, y el decodificador la identifica sin ambigüedad.

Paso 1: si se tocan, las palabras están cerca. Si r está en las esferas de v1 y de v2, la desigualdad triangular da d(v1,v2)≤d(v1,r)+d(r,v2)≤2t.

Paso 2: y al revés. Si dos palabras están a dmin≤2t, dando vuelta en la primera t de las posiciones en que difieren se llega a un vector que está a ≤t de las dos.

Paso 3: la condición. Las esferas no se tocan si y sólo si 2t<dmin, y el mayor t que lo cumple es la capacidad de corrección:

t=⌊dmin−12⌋

El (7,4) y el (8,4) tienen los dos t=1: el bit que el (8,4) agrega no corrige nada más. Lo que cambia es el espacio que dejan las esferas. En el (7,4) cada una tiene 1+7=8 vectores, y las 16 juntan 128: todo V7, sin hueco. Es un código perfecto. En el (8,4) cada esfera tiene 9 y las 16 juntan 144 de los 256. Los otros 112 no están en ninguna: cada uno está a distancia 2 de exactamente cuatro palabras. Con dmin par sobra siempre esa capa de vectores equidistantes, y sirve para detectar.

07 · Los modos de operación

Detectar y corregir se reparten la misma dmin. El decodificador del modo mixto corrige si lo recibido cae a distancia ≤λ de alguna palabra y, si no, levanta una bandera. Así corrige hasta λ errores y detecta, sin corregir mal, hasta ℓ, con ℓ≥λ, siempre que

λ+ℓ+1≤dmin

Paso 1: hasta λ errores, corrige. Como ℓ≥λ, la condición implica 2λ+1≤dmin, o sea λ≤t: las esferas de radio λ no se tocan, y lo recibido cae sólo en la de la palabra transmitida.

Paso 2: entre λ + 1 y ℓ errores, avisa. Lo recibido r está a más de λ de la palabra transmitida v. Y de cualquier otra palabra x, por la desigualdad triangular, d(r,x)≥d(v,x)−d(v,r)≥dmin−ℓ≥λ+1. No cae en ninguna esfera de radio λ, y el decodificador levanta la bandera en vez de corregir hacia otra palabra.

Los dos modos puros son los extremos. Con λ=0 no se corrige nada y se detecta hasta ℓ=dmin−1: es la sección 05. Con λ=ℓ=t se corrige todo lo que se puede y no se detecta nada más allá: es la sección 06. En el medio, cada error más que se corrige es uno menos que se detecta con garantía. Los pares (λ,ℓ) que no se pueden mejorar en ninguna de las dos coordenadas:

dmindetectarmixtocorregir
3(0, 2)—(1, 1)
4(0, 3)—(1, 2)
5(0, 4)(1, 3)(2, 2)

Con dmin par el modo de corrección ya trae detección gratis: el (8,4) corrige 1 y detecta 2, y eso es la capa de 112 vectores de la sección anterior. El modo mixto es el que se usa cuando hay canal de retorno: los errores leves se corrigen en el momento y los graves se mandan a retransmitir. El decodificador que lo implementa con λ=t es la decodificación incompleta.

08 · Dónde se termina la garantía

La condición dice qué pasa hasta ℓ errores y nada más. Un error de más y el decodificador puede corregir mal sin avisar. Transmitiendo la palabra nula por el (8,4) en el modo (λ,ℓ)=(1,2) y barriendo los 256 patrones de error, por peso: cuántos corrige bien, en cuántos avisa, cuántos corrige hacia otra palabra y cuántos no ve.

w(e)patronescorrigeavisayerrano ve
188000
22802800
35600560
470056014

Hasta dos errores la garantía se cumple entera. Con tres se rompe entera: los 56 patrones de peso 3 quedan a distancia 1 de una palabra de peso 4, el decodificador los «corrige» hacia ella y entrega una palabra equivocada sin bandera. Con cuatro vuelve a avisar en 56, y los 14 que son palabras pasan sin que el síndrome los vea.

El (7,4) lo muestra con un error menos. Su único modo que corrige es (1,1), sin margen para detectar, y los 21 patrones dobles se corrigen mal: con dos errores el decodificador empeora. Por eso en un código perfecto la bandera no tiene dónde levantarse: en un código perfecto la bandera no se levanta.

09 · La cuenta en Python

La búsqueda del widget, escrita entera: recorre los conjuntos de columnas por tamaño creciente y devuelve el primero que suma cero. Las H son la del apunte para el (7,4) y la del (8,4) en la misma forma [PTI]. Lo de los comentarios es la salida de correrlo.

from itertools import combinations

def dmin_por_columnas(H):
    """La menor cantidad de columnas de H que suman cero, y cuáles."""
    m, n = len(H), len(H[0])
    columnas = [tuple(fila[i] for fila in H) for i in range(n)]
    for w in range(1, n + 1):
        for elegidas in combinations(range(n), w):
            suma = [sum(columnas[i][j] for i in elegidas) % 2 for j in range(m)]
            if not any(suma):
                return w, elegidas

H74 = [[1, 0, 1, 1, 1, 0, 0],
       [1, 1, 1, 0, 0, 1, 0],
       [0, 1, 1, 1, 0, 0, 1]]
H84 = [[1, 0, 1, 1, 1, 0, 0, 0],
       [1, 1, 1, 0, 0, 1, 0, 0],
       [0, 1, 1, 1, 0, 0, 1, 0],
       [1, 1, 0, 1, 0, 0, 0, 1]]

print(dmin_por_columnas(H74))   # (3, (0, 1, 3))
print(dmin_por_columnas(H84))   # (4, (0, 1, 2, 5))

Recorre ∑w=1dmin(nw) conjuntos en el peor caso: depende de n y de dmin, no de k. En el (7,4) no gana nada: hasta 3 columnas son 63 conjuntos contra 16 palabras. Gana cuando k es grande y dmin chica: en el Hamming (255,247), hasta 3 columnas son 2.763.775 conjuntos, y las palabras son 2247≈2,26·1074. Con dmin grande deja de servir: el problema general es difícil, y por eso las familias de las unidades que siguen se construyen para que dmin se sepa de antemano.

Para tener a mano

  1. d(u,v)=w(u+v), y en un código lineal dmin=wmin: el menor peso de una palabra no nula.
  2. dmin es la menor cantidad de columnas de H que suman cero. Ninguna nula da ≥2; además distintas, ≥3. Los conjuntos de w columnas que suman cero son Aw.
  3. (7,4): A(z)=1+7z3+7z4+z7, dmin=3. (8,4): 1+14z4+z8, dmin=4: sus columnas son todas de peso impar, y ninguna terna suma cero.
  4. Detecta hasta dmin−1; corrige hasta t=⌊(dmin−1)/2⌋, que es la condición para que las esferas de radio t no se toquen.
  5. Modo mixto: corrige λ y detecta ℓ≥λ si λ+ℓ+1≤dmin. Los modos puros son λ=0 y λ=ℓ=t.
  6. Las garantías son de peor caso, hacia los dos lados: casi todo lo que pasa de dmin−1 se detecta igual, y un error más que ℓ puede corregirse mal y en silencio.
  7. La probabilidad de que un error pase la decide Admin además de dmin: Pu≈Adminpdmin.
← Anterior Siguiente → Inicio
Relacionados La matriz de paridad y el código dual El síndrome El standard array y la decodificación por síndrome Las cotas de Singleton y de Hamming El código lineal y la matriz G Un síndrome cero no prueba nada Corregir uno en vez de detectar dos cuesta 3/p El Hamming extendido y el SEC-DED La distribución de pesos de los códigos BCH