Bitácora · FEC · Concepto

El método de Peterson

Unidad 6 · Los códigos BCH · las identidades de Newton resueltas como un sistema lineal: cuántos errores dice el primer determinante no nulo, las fórmulas cerradas hasta t = 3, el caso que las deja en cero sobre cero y lo que cuesta pasar de ahí

Decodificar un código BCH es, en el medio, encontrar el polinomio localizador a partir de los síndromes. El camino más directo lo publicó W. W. Peterson en 1960, y lo refinaron Gorenstein y Zierler: tomar las identidades de Newton como un sistema de ecuaciones lineales y resolverlo. Antes hay que saber de qué orden es el sistema, y eso lo dice un determinante.

01 · El sistema de Hankel

Sea un BCH binario de sentido estricto que corrige t errores, y supongamos que hubo ν≤t errores, en las posiciones j1,…,jν. Sus números localizadores son Xl=αjl, y los síndromes son las sumas de potencias

Si=∑l=1νXli,i=1,…,2t

y el localizador es σ(X)=∏(1+XlX)=1+σ1X+⋯+σνXν. Para cada i>ν, las identidades de Newton dicen

Si+σ1Si−1+σ2Si−2+⋯+σνSi−ν=0

Tomadas para i=ν+1,…,2ν son ν ecuaciones lineales en las ν incógnitas σi, y los coeficientes son síndromes, que se conocen. Pasando el término sin σ al otro lado:

(S1S2⋯SνS2S3⋯Sν+1⋮⋮⋮SνSν+1⋯S2ν−1)(σνσν−1⋮σ1)=(Sν+1Sν+2⋮S2ν)

La matriz de la izquierda es Mν. Su entrada (i,j) es Si+j−1: depende sólo de i+j, así que es constante a lo largo de cada antidiagonal. Eso es una matriz de Hankel, y se arma entera con los síndromes. El vector de incógnitas va de σν a σ1, del índice mayor al menor.

En un código binario, además, la mitad de los síndromes repite a la otra: S2i=Si2, porque elevar al cuadrado una suma en característica dos es sumar los cuadrados. En el sistema aparecen S2, S4, S6, pero no aportan nada que S1, S2 y S3 no tengan.

02 · Cuántos errores: el teorema 4

El sistema pide ν, que no se conoce. Lo da el determinante:

Teorema 4. Si el patrón de error tiene exactamente ν≤t componentes no nulas, la matriz Mµ es no singular para µ=ν y singular para todo ν<µ≤t.

Paso 1: la matriz se factoriza. La entrada (i,j) de Mµ es

Si+j−1=∑l=1νXli−1XlXlj−1

que es la entrada (i,j) de un producto: Mµ=VDVT, con V la matriz de µ×ν cuya columna l es (1,Xl,Xl2,…) y D la diagonal de los Xl.

Paso 2: con µ>ν, el rango no alcanza. V tiene ν columnas, así que su rango es a lo sumo ν, y el del producto también. Una matriz de µ×µ con rango menor que µ tiene determinante nulo.

Paso 3: con µ=ν, todo es inversible. V es cuadrada de Vandermonde, y su determinante es el producto de las diferencias de los nodos, ∏l<k(Xl+Xk). Las posiciones erradas son distintas y α tiene orden n, así que los Xl son distintos y no nulos. Queda

detMν=∏lXl·∏l<k(Xl+Xk)2≠0

El teorema se lee de arriba para abajo: arriba de ν todas las matrices son singulares, y en ν la primera que no lo es. Debajo de ν no promete nada, y no hace falta: el procedimiento nunca llega ahí.

03 · El procedimiento

Paso 1. Formar Mt y calcular su determinante. Si no es cero, hubo t errores.

Paso 2. Si es cero, bajar a Mt−1, y así hasta la primera no singular. Su orden es ν. Si son todas singulares, no hubo errores.

Paso 3. Resolver el sistema de orden ν y armar σ(X). Sus raíces, por la búsqueda de Chien, dan las posiciones.

En la práctica los pasos 1 y 2 son una sola cuenta: la eliminación gaussiana sobre GF(2m) da el determinante como el producto de los pivotes, y si en alguna columna no hay pivote, el determinante es cero y se baja. Si hay, la misma eliminación resuelve el sistema.

El ejemplo 6 del apunte: el (15,5), con t=3, sobre GF(24) construido con 1+X+X4, con errores en las posiciones 3, 5 y 12. Los seis síndromes son

S1=1,S2=1,S3=α10,S4=1,S5=α10,S6=α5

y la primera matriz ya es no singular:

M3=(11α101α101α101α10),detM3=1

Hubo tres errores. El sistema, con (S4,S5,S6)=(1,α10,α5) a la derecha, da σ3=α5, σ2=0 y σ1=1: σ(X)=1+X+α5X3, el mismo que da el algoritmo iterativo. La primera fila se comprueba a mano, con α5=α+α2 y α10=1+α+α2:

1·α5+1·0+α10·1=(α+α2)+(1+α+α2)=1=S4

Con dos errores, ¿cuál de las tres matrices es la primera no singular? ¿Y con cuatro, que es uno más de los que el código corrige?

Simulación Las tres matrices del (15,5), de M₃ para abajo — tocá las posiciones para poner o sacar errores. Antes de calcular, apostá cuál es la primera matriz no singular; después el procedimiento baja de a una.
Posiciones erradas · en rojo
Los seis síndromes · los pares, en gris, son S₂ᵢ = Sᵢ²
errores puestos — ν de Peterson — S₁³ + S₃ —

caminoσ(X)posiciones

Arranca con dos errores y sin ningún determinante calculado. Apostá, bajá, y después probá con uno y con tres. Con cuatro errores el teorema ya no vale: probá 0, 1, 2 y 3; después 0, 1, 2 y 4; después 0, 1, 2 y 9. Y con tres errores, poné 0, 5 y 10, y mirá las de abajo.

04 · Debajo de ν, el teorema no dice nada

Con errores en 0, 5 y 10 los síndromes son S1=S2=0 y S3=1. M3 es no singular, con determinante 1, y el procedimiento para ahí con ν=3 y σ(X)=1+X3. Pero M2 y M1, que no se miran, son singulares las dos: M1=(S1)=(0).

Pasa cada vez que S1=X1+X2+X3=0, o sea, cuando el tercer localizador es la suma de los otros dos. Recorridos todos los patrones de tres errores, son 35 de 455 en el (15,5) y 155 de 4495 en el (31,16). Por eso el procedimiento baja desde t: si subiera desde M1 y se detuviera en la primera singular, en estas ternas concluiría que no hubo ningún error.

05 · Las fórmulas cerradas

Para t chico el sistema se resuelve a mano una vez, y lo que queda es una fórmula. La cuenta sale más corta por las identidades de Newton de índice impar que por el sistema de Hankel. Escritas con σj=0 para j>ν, valen para todo i:

Si+σ1Si−1+⋯+σi−1S1+iσi=0

con el coeficiente i reducido módulo dos. Con ν≤3:

Paso 1: i=1. S1+σ1=0, así que σ1=S1.

Paso 2: i=3. S3+σ1S2+σ2S1+σ3=0. Con σ1=S1 y S2=S12: σ3=(S13+S3)+S1σ2.

Paso 3: i=5. S5+σ1S4+σ2S3+σ3S2=0. Con S4=S14 y el σ3 del paso 2, los S15 se cancelan y queda σ2(S13+S3)=S12S3+S5.

Para t=2 alcanza el paso 2 con σ3=0. Las tres juntas, como en la ecuación (48) del apunte:

t=1:σ1=S1t=2:σ1=S1σ2=S3+S13S1t=3:σ1=S1σ2=S12S3+S5S13+S3σ3=(S13+S3)+S1σ2

Con el ejemplo 6: S13+S3=1+α10=α5, el numerador α10+α10 es cero, así que σ2=0 y σ3=α5. El mismo σ(X), sin eliminar nada.

La cantidad S13+S3 está en todas partes, y tiene una lectura limpia. En característica dos, (a+b+c)3+a3+b3+c3=(a+b)(b+c)(c+a), y entonces

S13+S3=(X1+X2)(X2+X3)(X3+X1)

con X3=0 si hubo dos errores, y X2=X3=0 si hubo uno. Con tres errores es un producto de diferencias de localizadores distintos, y no se anula. Con dos vale X1X2(X1+X2), que tampoco. Y los tres determinantes del procedimiento salen en función de ella:

detM1=S1detM2=S1(S13+S3)detM3=(S13+S3)2σ3

El teorema 4 de t=3 se lee ahí entero. Con dos errores σ3=0 y M3 es singular; con uno se anula S13+S3, y caen M3 y M2 juntas. Las tres igualdades se comprobaron en cada patrón de hasta tres errores del (15,5) y del (31,16), contra el determinante calculado por eliminación.

06 · Verificadas patrón por patrón

Las fórmulas (48) contra la eliminación gaussiana del procedimiento completo, en todos los patrones de hasta t errores de cuatro códigos. «Coincide» quiere decir el mismo σ(X), coeficiente por coeficiente, una vez quitado el σ3=0 que la fórmula de t=3 entrega con dos errores:

códigofórmulaνpatronescoincidedenominador nulo
(15,5)t = 3115015
(15,5)t = 321051050
(15,5)t = 334554550
(31,16)t = 3131031
(31,16)t = 324654650
(31,16)t = 33449544950
(15,7)t = 21 y 21201200
(31,21)t = 21 y 24964960

En todos los casos el procedimiento completo encontró el ν verdadero, y la búsqueda de Chien sobre su σ(X) devolvió exactamente las posiciones puestas. La fórmula de t=3 acierta siempre que hubo dos o tres errores, y no da nada en ninguno de los patrones de un error.

07 · Lo que la rompe: un error solo

Con un error, S1=X1 y S3=X13: el denominador S13+S3 es cero, y el numerador S12S3+S5=X15+X15 también. La fórmula de t=3 da 0/0.

No es una falla de Peterson. La fórmula es la solución del sistema de orden 3, y el procedimiento, con un error, nunca lo resuelve: M3 y M2 son singulares y baja a M1, que da σ1=S2/S1=S1. Que la fórmula siga sirviendo con dos errores es la excepción: σ3 sale cero solo, porque S13+S3 no se anula.

Un circuito que implemente sólo la fórmula tiene que mirar S13+S3. Si es cero y S1 no, hubo un error y σ(X)=1+S1X. Si los dos son cero, no hubo errores. La fórmula de t=2 no tiene este problema: con un error su numerador S3+S13 es cero pero su denominador S1 no, y da σ2=0, que es lo correcto.

08 · Con más de t errores

El teorema 4 supone ν≤t. Con más, el procedimiento igual encuentra una primera matriz no singular, y resuelve. Recorridos los 1365 patrones de cuatro errores del (15,5):

cuatro errorespatronesPeterson diceChienlo que sale
declarados750ν = 3menos de 3 raícesfalla
mal corregidos525ν = 33 raícesotra palabra, a 7 de la enviada
S₁³ + S₃ = 090ν = 11 raízuna palabra que no es del código

En los 1275 de las dos primeras filas Peterson da el mismo σ(X) que el algoritmo iterativo, y el reparto es el del decodificador: 525 se entregan como otra palabra. Los 90 de la última son los patrones de cuatro errores con S13+S3=0: M3 y M2 son singulares, Peterson concluye que hubo un error y σ(X)=1+S1X, que tiene siempre exactamente una raíz. Las dos comprobaciones de falla —grado de σ(X) a lo sumo t, y tantas raíces como el grado— pasan las dos, y se invierte un bit.

Lo que sale no es una palabra: un patrón de cuatro errores más un bit corregido daría, si lo fuera, una palabra de peso a lo sumo 5, y la distancia mínima es 7. El algoritmo iterativo declara falla en esos 90, porque su σ(X) sale de grado mayor. En el (31,16) pasa lo mismo con 930 de los 31 465 patrones de cuatro errores. Peterson necesita una comprobación más: que el σ(X) encontrado reproduzca todos los síndromes, no sólo los 2ν que usó. Con ν=1 es preguntar si S5=S15, y en los 90, y en los 930, no lo es.

09 · Cuánto cuesta

Las fórmulas cerradas se cuentan a mano. Elevar al cuadrado en GF(2m) es lineal sobre los bits —un puñado de XOR—, así que se cuenta aparte. Para t=2: S12, un cuadrado; S13=S12·S1, una multiplicación; la inversa de S1 y el producto por ella: dos multiplicaciones, un cuadrado y una inversión. Para t=3: el cuadrado, S13, S12S3, la inversa de S13+S3, el producto por ella y S1σ2: cuatro multiplicaciones, un cuadrado y una inversión, sin iteraciones y con latencia fija.

La forma general se midió. Peterson con eliminación gaussiana —una inversión por pivote, sin multiplicar por los ceros ya conocidos, bajando desde Mt—, y el algoritmo iterativo binario, contando cada multiplicación y cada inversión sobre GF(28). Cada cifra es el promedio sobre 100 patrones al azar, con el número de errores de la columna, en los BCH de largo 255:

códigot(48)Peterson, ν = tPeterson, peor νiterativo binario
(255,247)10 · 01 · 11 · 1 (ν = 1)2 · 1
(255,239)22 · 16 · 26 · 2 (ν = 2)5 · 2
(255,231)34 · 117 · 317 · 4 (ν = 2)10 · 3
(255,223)4—36 · 443 · 6 (ν = 3)17 · 4
(255,215)5—65 · 590 · 9 (ν = 3)26 · 5
(255,207)6—105 · 6168 · 12 (ν = 4)37 · 6
(255,191)8—231 · 8463 · 20 (ν = 5)65 · 8
(255,131)16—1610 · 166010 · 72 (ν = 9)256 · 16

Cada celda es «multiplicaciones · inversiones». Tres lecturas.

La forma general pierde enseguida. Ya en t=2 la eliminación hace 6 multiplicaciones contra 5 del iterativo binario, y desde ahí la brecha es la de t3/3 contra t2: en t=8, 231 contra 65.

El peor caso de Peterson no es ν=t. Con menos errores hay que pagar las matrices singulares de arriba: en el (255,191), con cinco errores, M8, M7 y M6 se eliminan antes de llegar a M5, y la cuenta sube a 463.

La fórmula cerrada gana mientras existe. En t=3, cuatro multiplicaciones y una inversión contra diez y tres del iterativo, y sin control secuencial.

Sobre dónde se cambia de método. Las curvas de costo asintótico que se suelen comparar son t3/3 para Peterson, 2t2 para el algoritmo iterativo general y t2 para el binario. t3/3 alcanza a t2 en t=3 y a 2t2 en t=6. El cambio que se hace en la práctica, alrededor de t=4, no es el corte de dos de esas curvas: es donde se termina la fórmula cerrada. Hasta t=3 se usa (48), que no crece y le gana a todo; desde t=4 la fórmula se vuelve inmanejable, y entre la forma general y el iterativo, la tabla ya decidió.

10 · La cuenta en Python

El procedimiento entero sobre GF(24), sin librerías: la tabla de potencias de α, los síndromes como sumas de potencias, la eliminación que devuelve el determinante y la solución a la vez, y la fórmula de t=3 al lado. Lo de los comentarios es la salida de correrlo.

# GF(16) con 1 + X + X⁴: EXP[i] es α^i como entero de 4 bits, LOG lo inverso.
EXP = [1]
for _ in range(14):
    x = EXP[-1] << 1
    EXP.append(x ^ 0b10011 if x & 0b10000 else x)
LOG = {v: i for i, v in enumerate(EXP)}

def mul(a, b):
    return 0 if a == 0 or b == 0 else EXP[(LOG[a] + LOG[b]) % 15]

def inv(a):
    return EXP[(15 - LOG[a]) % 15]

def alfa(x):
    return '0' if x == 0 else '1' if x == 1 else f'α^{LOG[x]}'

def sindromes(pos, t=3):
    """S_i = Σ X_l^i, con X_l = α^j por cada posición errada j."""
    S = []
    for i in range(1, 2 * t + 1):
        s = 0
        for j in pos:
            s ^= EXP[i * j % 15]
        S.append(s)
    return S

def eliminar(A):
    """Gauss sobre GF(16) de la matriz ampliada: devuelve (det, solución)."""
    A = [f[:] for f in A]
    n, det = len(A), 1
    for c in range(n):
        p = next((i for i in range(c, n) if A[i][c]), None)
        if p is None:
            return 0, None                    # sin pivote: det M = 0
        A[c], A[p] = A[p], A[c]               # en característica 2, sin signo
        det = mul(det, A[c][c])
        k = inv(A[c][c])
        A[c] = [mul(v, k) for v in A[c]]
        for i in range(n):
            if i != c and A[i][c]:
                f = A[i][c]
                A[i] = [v ^ mul(f, w) for v, w in zip(A[i], A[c])]
    return det, [f[-1] for f in A]

def peterson(S, t=3):
    for mu in range(t, 0, -1):
        M = [[S[i + j] for j in range(mu)] + [S[mu + i]] for i in range(mu)]
        det, x = eliminar(M)
        print(f'  det M{mu} = {alfa(det)}')
        if det:
            return [1] + x[::-1]              # x = (σ_µ, …, σ_1)
    return [1]

def cerrada_t3(S):
    S1, S3, S5 = S[0], S[2], S[4]
    D = mul(mul(S1, S1), S1) ^ S3             # S1³ + S3
    if D == 0:
        return None
    s2 = mul(mul(mul(S1, S1), S3) ^ S5, inv(D))
    return [1, S1, s2, D ^ mul(S1, s2)]

for pos in [(3, 5, 12), (4, 9), (6,), (0, 5, 10)]:
    S = sindromes(pos)
    print('errores en', pos, ' S =', ' '.join(alfa(s) for s in S))
    sigma = peterson(S)
    c = cerrada_t3(S)
    print('  Peterson:', ', '.join(alfa(s) for s in sigma),
          '  (48):', ', '.join(alfa(s) for s in c) if c else 'S1³ + S3 = 0')
# errores en (3, 5, 12)  S = 1 1 α^10 1 α^10 α^5
#   det M3 = 1
#   Peterson: 1, 1, 0, α^5   (48): 1, 1, 0, α^5
# errores en (4, 9)  S = α^14 α^13 0 α^11 α^10 0
#   det M3 = 0
#   det M2 = α^11
#   Peterson: 1, α^14, α^13   (48): 1, α^14, α^13, 0
# errores en (6,)  S = α^6 α^12 α^3 α^9 1 α^6
#   det M3 = 0
#   det M2 = 0
#   det M1 = α^6
#   Peterson: 1, α^6   (48): S1³ + S3 = 0
# errores en (0, 5, 10)  S = 0 0 1 0 0 1
#   det M3 = 1
#   Peterson: 1, 0, 0, 1   (48): 1, 0, 0, 1

Los cuatro casos son los de esta nota: el ejemplo 6, dos errores con σ3 en cero, el error único con la fórmula en 0/0, y la terna con S1=0, donde la fórmula da 1+X3 con σ1=0 sin ningún problema. La línea return [1] + x[::-1] es la del orden de las incógnitas.

Para tener a mano

  1. Las identidades de Newton para i=ν+1,…,2ν son un sistema lineal: Mν, de Hankel, con entradas Si+j−1, por (σν,…,σ1), igual a (Sν+1,…,S2ν).
  2. Teorema 4: Mµ=VDVT; singular para ν<µ≤t, no singular en µ=ν. Debajo de ν, nada: con S1=0 y tres errores, M2 y M1 son singulares.
  3. Se baja desde Mt hasta la primera no singular; su orden es ν. La eliminación da el determinante y la solución en la misma pasada.
  4. Las fórmulas (48): σ1=S1; σ2=(S3+S13)/S1 para t=2; σ2=(S12S3+S5)/(S13+S3) y σ3=(S13+S3)+S1σ2 para t=3.
  5. S13+S3=(X1+X2)(X2+X3)(X3+X1); detM2=S1(S13+S3) y detM3=(S13+S3)2σ3.
  6. Verificadas contra la eliminación en todos los patrones de hasta tres errores del (15,5) y del (31,16): coinciden con dos y tres errores; con uno, la de t=3 da 0/0 y hay que caer a σ(X)=1+S1X.
  7. Con cuatro errores en el (15,5), 90 patrones tienen S13+S3=0: Peterson dice ν=1, Chien encuentra una raíz y sale algo que no es palabra. Falta verificar que σ(X) reproduzca los 2t síndromes.
  8. Costo: (48) son 4 multiplicaciones y una inversión en t=3; la forma general, del orden de t3/3 y peor con menos errores (463 en el (255,191) con cinco); el iterativo binario, t2. Se cambia en t=4 porque ahí se termina la fórmula.
← Anterior Siguiente → Inicio
Relacionados Los síndromes y el polinomio localizador El algoritmo de Berlekamp-Massey La búsqueda de Chien La cota BCH El decodificador BCH en hardware El (15,5) de punta a punta Pasado t, la cuenta la hacen las palabras livianas