Bitácora · FEC · Concepto

Los síndromes y el polinomio localizador

Unidad 6 · Los códigos BCH · lo recibido evaluado en las raíces, la mitad que sale gratis, el cambio de incógnitas que lineariza el sistema y la lectura de Newton: los síndromes son la salida de un registro

Un código BCH se define por raíces: su generador se anula en 2t potencias consecutivas de un elemento β. Decodificarlo empieza por preguntarle a lo recibido cuánto vale en esas raíces. Lo que contesta son los síndromes, y lo que hay que sacar de ellos son las posiciones de los errores: un sistema no lineal que se vuelve lineal al cambiar de incógnita, y que resulta ser la descripción de un registro de desplazamiento.

01 · Lo recibido, evaluado en las raíces

Sea un BCH binario (n,k) que corrige t errores, con g(X)=MCM{φ1(X),…,φ2t(X)}, donde φi(X) es el polinomio mínimo de βi y β tiene orden n en GF(2m). Llega r(X)=v(X)+e(X). El componente i del síndrome es

Si=r(βi),i=1,2,…,2t

Cada Si es un elemento de GF(2m), no un bit: el síndrome entero son 2t elementos del cuerpo, 2tm bits escritos. Los índices empiezan en 1 porque las raíces pedidas empiezan en β; con otro primer exponente se corren igual. Dos pasos lo llevan del canal al error.

Paso 1: lo transmitido no aporta. Toda palabra v(X) es múltiplo de g(X), que se anula en βi. Entonces v(βi)=0 y Si=e(βi): el síndrome depende sólo del patrón de error, como en todo código lineal.

Paso 2: el error, posición por posición. Si hubo ν errores, en las posiciones j1,…,jν, entonces e(X)=Xj1+⋯+Xjν, y evaluado en βi:

Si=∑l=1ν(βjl)i

Siendo binario, no hay magnitudes de error que averiguar: conocida una posición errada, se invierte el bit. Todo el problema es encontrar las ν posiciones.

Es el mismo síndrome de la Unidad 5, leído en otro cuerpo. Allá el síndrome era el resto s(X)=Rg(X){r(X)}, que calcula el registro divisor de el síndrome cíclico. Como r(X)=a(X)g(X)+s(X) y g(X) se anula en las raíces,

Si=s(βi)=bi(βi),bi(X)=Rφi(X){r(X)}

y la segunda igualdad sale igual, con φi(X) en el lugar de g(X): alcanza un divisor de m etapas por síndrome. En el (15,7), con r(X)=1+X8: el resto por φ1=1+X+X4 es b1=X2, y da S1=α2, S2=α4 y S4=α8, porque α, α2 y α4 comparten polinomio mínimo; el resto por φ3 es 1+X3, y S3=1+α9=α7. La igualdad Si=s(βi) se comprobó sobre los 32 768 vectores de quince bits, en el (15,7) y en el (15,5).

02 · Los de índice par salen gratis

En un cuerpo de característica dos, (a+b)2=a2+b2, porque el término cruzado 2ab es cero. Aplicado a la suma del paso 2:

Si2=(∑l=1νXli)2=∑l=1νXl2i=S2i

con Xl=βjl, que en la sección 03 recibe nombre. El paso descansa en que los coeficientes de e(X) son 0 o 1, que al cuadrado no cambian: es propio del caso binario. Vale para cualquier patrón, con cualquier cantidad de errores, y por eso también para r entero: r(β2i)=r(βi)2. La consecuencia práctica: sólo hay que evaluar los t síndromes de índice impar, y los otros t salen de elevar al cuadrado, que en hardware es lógica fija. Con tres errores en las posiciones 3, 5 y 12 del (15,5):

S1=1,S3=α10,S5=α10S2=S12=1,S4=S22=1,S6=(α10)2=α5

Y la cuenta de información cierra con lo que ya se sabía. Los 2t elementos ocupan 2tm bits, 24 en el (15,5), pero el síndrome cíclico tenía n−k=10, y los Si son evaluaciones suyas: no pueden decir más. Recorridos los 32 768 vectores de quince bits, salen exactamente 1024 vectores de síndromes distintos en el (15,5) y 256 en el (15,7), 2n−k en los dos. En el (15,5) los diez bits se reparten así: S1 y S3 toman los 16 valores del cuerpo, cuatro bits cada uno, y S5 toma sólo cuatro: 0, 1, α5 y α10. La razón es la misma propiedad, aplicada dos veces: S54=S20=S5, porque α20=α5, y los únicos elementos de GF(24) con x4=x son esos cuatro. Es la clase conjugada {5,10}, de dos elementos: φ5 tiene grado 2 y su síndrome, dos bits. 4+4+2=10.

03 · Los números localizadores

Conviene abreviar. El número localizador del error l es

Xl=βjl,l=1,…,ν

Como β tiene orden n, sus potencias β0,…,βn−1 son todas distintas: conocer Xl es conocer la posición. En el ejemplo, los localizadores son α3, α5 y α12. Con esta notación, lo que hay que resolver es

S1=X1+X2+⋯+XνS2=X12+X22+⋯+Xν2⋮S2t=X12t+X22t+⋯+Xν2t

Tiene tres dificultades a la vez. Es no lineal: las incógnitas aparecen elevadas hasta la 2t. La cantidad de incógnitas, ν, no se conoce. Y es simétrico: intercambiar dos localizadores no cambia ninguna ecuación, así que no hay forma de despejarlos de a uno, porque nada distingue al primero del segundo.

Además tiene muchas soluciones. Todos los patrones de un mismo coset dan los mismos síndromes: 2k patrones por vector de síndromes, 32 en el (15,5). La que se busca es la de menos errores, y si ν≤t es única: dos patrones de peso ≤t con los mismos síndromes sumarían una palabra no nula de peso ≤2t, por debajo de la distancia diseñada. Probar los patrones uno por uno son ∑i≤t(ni) intentos: 576 en el (15,5), 32 641 en el (255,239). Hace falta otra cosa.

04 · El polinomio localizador

La salida es no buscar los Xl, sino un polinomio que los tenga a todos adentro. El polinomio localizador de errores es

σ(X)=∏l=1ν(1+XlX)=1+σ1X+σ2X2+⋯+σνXν

Tres cosas salen de la definición. Sus raíces son los inversos de los localizadores, X1−1,…,Xν−1: el factor 1+XlX vale 1+1=0 en X=Xl−1. Su grado es la cantidad de errores, porque σν=X1X2⋯Xν es un producto de elementos no nulos. Y sus coeficientes son las funciones simétricas elementales de los localizadores:

σ1=∑lXl,σ2=∑l<l′XlXl′,…,σν=X1X2⋯Xν

Ahí está la ganancia del cambio de incógnitas. Los Xl no tienen orden; los σi sí están determinados, porque son simétricos: el mismo conjunto de posiciones da el mismo σ(X) en cualquier orden. Y en la sección siguiente se relacionan con los síndromes por ecuaciones lineales.

En el ejemplo, con α3, α5 y α12:

σ(X)=(1+α3X)(1+α5X)(1+α12X)=1+X+α5X3

El término en X2 falta: σ2=0, y sin embargo son tres errores. Lo que cuenta los errores es el grado, no la cantidad de términos. De los 455 patrones de tres errores del largo 15, 35 tienen σ2=0. Encontrar las raíces de σ(X) probando las n potencias de β es la búsqueda de Chien.

05 · Las identidades de Newton

Las sumas de potencias Si y las funciones simétricas σi están ligadas por las identidades de Newton, que son clásicas. Sobre un cuerpo de característica dos tienen dos tramos. Para i≤ν:

S1+σ1=0S2+σ1S1+2σ2=0S3+σ1S2+σ2S1+3σ3=0⋮Sν+σ1Sν−1+⋯+σν−1S1+νσν=0

donde el entero que multiplica al último término se reduce módulo 2: en las de índice par desaparece, en las de índice impar queda σi. Y para i>ν:

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

Las incógnitas σi aparecen a la primera potencia, multiplicadas por síndromes, que se conocen. El sistema no lineal en los Xl se volvió lineal en los σi, y resolverlo así es el método de Peterson. El segundo tramo se prueba en tres pasos, con un polinomio auxiliar: el recíproco de σ(X),

σ∗(X)=Xνσ(X−1)=∏l=1ν(X+Xl)=Xν+σ1Xν−1+⋯+σν

que tiene por raíces a los localizadores mismos.

Paso 1: cada localizador anula al recíproco. Xlν+σ1Xlν−1+⋯+σν=0, para cada l.

Paso 2: correrla en potencias. Multiplicada por Xli−ν, con i>ν, queda Xli+σ1Xli−1+⋯+σνXli−ν=0.

Paso 3: sumar sobre los errores. Sumando las ν igualdades, cada columna es una suma de potencias, ∑lXlh=Sh, y queda la identidad.

El primer tramo pide más cuenta, la de la fórmula clásica entre sumas de potencias y funciones simétricas, y está en el apunte y en el libro. En el ejemplo se comprueba a mano. Con S1=S2=1, S3=α10 y σ(X)=1+X+α5X3: S1+σ1=1+1=0; S2+σ1S1=0; y S3+σ1S2+σ2S1+σ3=α10+1+0+α5=0, porque α10=1+α+α2 y α5=α+α2.

06 · Los síndromes salen de un registro

El segundo tramo, despejado, dice otra cosa:

Si=σ1Si−1+σ2Si−2+⋯+σνSi−ν,i>ν

Cada síndrome es una combinación fija de los ν anteriores. Es una recurrencia lineal de orden ν, y eso es un LFSR: ν etapas que guardan cada una un elemento de GF(2m), cargadas con S1,…,Sν, y una realimentación que multiplica la etapa j por la constante σj. Cada ciclo sale el síndrome que sigue. En el ejemplo, cargado con 1,1,α10:

S4=σ1S3+σ2S2+σ3S1=α10+0+α5=1S5=S4+α5S2=1+α5=α10S6=S5+α5S3=α10+α15=α5

exactamente los de la sección 02. El registro no es nuevo. El LFSR de la Unidad 5 dividía por un polinomio y su salida cumplía la recurrencia del recíproco. Acá la recurrencia es la de σ(X), así que el registro divide por σ∗(X), el polinomio cuyas raíces son los localizadores. Y se entiende por qué: Xli es una progresión geométrica de razón Xl, que la genera un registro de una etapa; los síndromes son la suma de ν de esas progresiones.

El registro no se detiene en 2t. La recurrencia vale para todo i>ν, y Si=e(βi) tiene sentido para cualquier i. Como βn=1, la sucesión es periódica de período n. En el ejemplo, de S7 a S15 el registro da 0, 1, α5, α5, 0, α10, 0, 0, 1, lo mismo que evaluar e(X) directamente, y S16=S1. El decodificador ve sólo los primeros 2t.

Con eso el problema cambia de forma. Lo que hay que hacer es encontrar el registro más corto que genera S1,…,S2t, y eso es lo que hace Berlekamp-Massey. Que el más corto sea σ(X) no es obvio, y vale si ν≤t. Sea otro registro, de L etapas con L≤t, que también genera los 2t.

Paso 1: si coinciden en 2t, coinciden siempre. La diferencia entre lo que sale de los dos registros cumple la recurrencia del producto de sus dos polinomios, que tiene orden L+ν≤2t. Sus primeros 2t términos son cero, así que la recurrencia sólo puede seguir produciendo ceros: el otro registro genera la sucesión entera Si=e(βi), no sólo los 2t que se ven.

Paso 2: la sucesión entera pide los ν localizadores. Si un registro con coeficientes c1,…,cL la genera, el mismo cálculo de la sección 05 al revés da ∑lXli−LC(Xl)=0 para todo i>L, con C(X)=XL+c1XL−1+⋯+cL. Tomando ν valores seguidos de i queda un sistema de Vandermonde en los Xl, que son distintos y no nulos: la única solución es C(Xl)=0 para cada l. Un polinomio mónico de grado L con ν raíces distintas pide L≥ν, y si L=ν, es σ∗(X).

Con un Berlekamp-Massey general, que no usa la simplificación binaria, sobre todos los patrones de hasta t errores: el registro más corto es el de σ(X) en los 575 patrones no nulos del (15,5) y en los 120 del (15,7).

Simulación Seis síndromes y el registro que los genera — tocá posiciones del (15,5) para poner errores, hasta seis. Los síndromes impares se evalúan; los pares salen de elevar al cuadrado. Abajo, un registro cargado con los primeros síndromes: dale ciclos y compará lo que sale con lo que de verdad vale e(αⁱ). Lo punteado el decodificador no lo ve.
Patrón de error e · posición 0 a la izquierda
errores — localizadores — σ(X) —
iSᵢde dónde sale
conexiones — etapas —
arriba, lo que sale del registro; abajo, e(αⁱ) evaluado directo

Arranca sin errores, y no hay nada que ver: seis ceros y σ(X)=1. Poné un error y mirá qué valen los seis. Después el patrón de las secciones de arriba, en 3, 5 y 12, y corré el registro hasta S15. Pasá al registro más corto: con tres errores no cambia nada. Ahora cuatro, en 0, 1, 2 y 4, y compará los dos registros más allá de S6.

07 · Con un error de más

Las identidades de Newton valen para cualquier ν. Con cuatro errores en el (15,5), el registro de cuatro etapas de σ(X) genera los seis síndromes en los 1365 patrones. Lo que deja de valer es la unicidad: el paso 1 pedía L+ν≤2t, y un registro de tres etapas contra el verdadero de cuatro suma 7, uno más que los seis síndromes que hay. Recorridos los 1365 patrones con Berlekamp-Massey:

registro más cortopatroneslo que pasa
3 etapas, 3 raíces525corrige tres: otra palabra
3 etapas, sin raíces750falla declarada
4 etapas90falla: grado mayor que t

En 1275 de los 1365 hay un registro más corto que el verdadero que genera los mismos seis síndromes, y el decodificador se queda con él porque es el más corto: es lo único que puede saber. En los 750 del medio, el registro corto no tiene ni una raíz en el cuerpo. Las fallas suman 840 y las palabras equivocadas 525: el mismo reparto que da el decodificador de Meggitt con cuatro errores, ahora visto desde el registro.

Un caso: errores en 0, 1, 2 y 4. Los síndromes son α2, α4, α9, α8, α5, α3, y hay dos registros que los generan:

σ(X)=1+α2X+α10X2+α14X3+α7X4σ′(X)=1+α2X+α2X2+α8X3

Las raíces de σ′(X) señalan las posiciones 5, 8 y 10. El decodificador las invierte y entrega una palabra de código que difiere de la transmitida en las siete posiciones 0, 1, 2, 4, 5, 8 y 10: es g(X) mismo, de peso 7. Los dos registros coinciden hasta S6 y se separan en el primer síndrome que el decodificador no calcula: en S7 el verdadero da α11 y el corto α12. Con 2t síndromes, un registro de ν etapas queda determinado si 2ν≤2t; con uno más, los síndromes que se ven ya no alcanzan para distinguirlo. Cuántas veces termina en una palabra equivocada depende del código, y está en pasado t, la cuenta la hacen las palabras livianas.

08 · Las tres etapas

El decodificador de un BCH binario queda partido en tres etapas independientes, y esta nota cubre la primera y el planteo de la segunda.

Síndromes. Evaluar r(X) en las t raíces de índice impar, por Horner, con un multiplicador por constante en cada celda, y elevar al cuadrado para los pares. El costo es fijo y lineal en n. Entra binario, sale en GF(2m).

Polinomio localizador. Sacar σ(X) de los síndromes: resolviendo el sistema lineal de Newton, que es el método de Peterson, o sintetizando el registro más corto, que es Berlekamp-Massey. Es la etapa difícil.

Raíces. Encontrar los ceros de σ(X) entre las n potencias de β, invertirlos para tener los localizadores, y corregir: la búsqueda de Chien. Si el grado de σ(X) pasa de t, o no tiene tantas raíces distintas como su grado, el decodificador declara falla. Las tres etapas, sobre un mismo ejemplo de punta a punta, están en el (15,5) de punta a punta.

09 · La cuenta en Python

El ejemplo de las secciones 02 a 06, sin librerías: GF(24) por tablas de potencias, los síndromes como sumas de potencias de los localizadores, σ(X) multiplicando los factores de a uno, y el registro de Newton cargado con los tres primeros. Lo de los comentarios es la salida de correrlo.

EXP = [1]                                 # GF(2⁴) con 1 + X + X⁴: EXP[i] = α^i
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 sum_gf(xs):
    s = 0
    for x in xs:
        s ^= x
    return s

def pot(x):                               # un elemento como potencia de α
    return '0' if x == 0 else '1' if x == 1 else f'α^{LOG[x]}'

def sindromes(errores, cuantos):
    """S_i = e(α^i) = Σ X_l^i, con X_l = α^(j_l)."""
    return [sum_gf(EXP[i * j % 15] for j in errores) for i in range(1, cuantos + 1)]

def localizador(errores):
    """σ(X) = Π (1 + X_l X), coeficientes de menor a mayor grado."""
    sigma = [1]
    for j in errores:
        Xl = EXP[j]
        sigma = [a ^ mul(Xl, b) for a, b in zip(sigma + [0], [0] + sigma)]
    return sigma

def registro(sigma, iniciales, hasta):
    """El registro de Newton: S_i = σ1 S_(i-1) + ... + σν S_(i-ν)."""
    S = list(iniciales)
    nu = len(sigma) - 1
    while len(S) < hasta:
        S.append(sum_gf(mul(sigma[k], S[-k]) for k in range(1, nu + 1)))
    return S

errores = [3, 5, 12]                      # el ejemplo, en el (15,5)
S = sindromes(errores, 6)
sigma = localizador(errores)
print([pot(s) for s in S])
# ['1', '1', 'α^10', '1', 'α^10', 'α^5']
print([pot(c) for c in sigma])
# ['1', '1', '0', 'α^5']
print([pot(s) for s in registro(sigma, S[:3], 6)])
# ['1', '1', 'α^10', '1', 'α^10', 'α^5']
print(all(S[2 * i + 1] == mul(S[i], S[i]) for i in range(3)))
# True
print([pot(s) for s in registro(sigma, S[:3], 16)[6:]])
# ['0', '1', 'α^5', 'α^5', '0', 'α^10', '0', '0', '1', '1']

La segunda línea es 1+X+α5X3, con el cero de σ2 a la vista. La tercera es el registro cargado con S1,S2,S3: devuelve los seis. La última sigue de S7 a S16, y el 1 final es S1 otra vez. La línea de localizador que hace el zip es multiplicar por 1+XlX: el coeficiente nuevo de Xi es el viejo más Xl por el viejo de Xi−1.

Para tener a mano

  1. Si=r(βi)=e(βi), para i=1,…,2t: elementos de GF(2m). También Si=s(βi)=bi(βi), con los restos por g(X) o por φi(X).
  2. S2i=Si2 en el caso binario: se evalúan los t impares. Los 2t llevan n−k bits de información: 1024 vectores distintos en el (15,5), con S5 en {0,1,α5,α10}.
  3. Localizadores Xl=βjl y Si=∑lXli: un sistema no lineal, simétrico, con ν desconocido.
  4. σ(X)=∏(1+XlX): raíces en los inversos de los localizadores, grado ν, coeficientes simétricos. Un coeficiente nulo no es un error menos.
  5. Newton, para i>ν: Si=σ1Si−1+⋯+σνSi−ν. Lineal en los σi. Para i≤ν, con el término iσi, que sólo queda en los impares.
  6. Leída como registro: ν etapas sobre GF(2m), conexiones σj, cargado con S1,…,Sν. Divide por σ∗(X)=∏(X+Xl), y su salida tiene período n.
  7. Con ν≤t, el registro más corto que genera S1,…,S2t es σ(X) y es único. Con ν=t+1 deja de serlo: en el (15,5), 1275 de 1365 patrones tienen uno de tres etapas.
  8. Tres etapas: síndromes, localizador (Peterson o Berlekamp-Massey), raíces (Chien). Falla si el grado pasa de t o no hay tantas raíces como el grado.
← Anterior Siguiente → Inicio
Relacionados El síndrome cíclico El LFSR y las m-secuencias Los códigos BCH El método de Peterson El algoritmo de Berlekamp-Massey La búsqueda de Chien El (15,5) de punta a punta