El algoritmo Berlekamp–Massey es un algoritmo que encontrará el registro de desplazamiento de retroalimentación lineal (LFSR) más corto para una secuencia de salida binaria dada. El algoritmo también encontrará el polinomio mínimo de una secuencia linealmente recurrente en un campo arbitrario . El requisito del campo significa que el algoritmo Berlekamp–Massey requiere que todos los elementos distintos de cero tengan un inverso multiplicativo. [1] Reeds y Sloane ofrecen una extensión para manejar un anillo . [2]
Elwyn Berlekamp inventó un algoritmo para decodificar códigos de Bose–Chaudhuri–Hocquenghem (BCH) . [3] [4] James Massey reconoció su aplicación a los registros de desplazamiento de retroalimentación lineal y simplificó el algoritmo. [5] [6] Massey denominó al algoritmo Algoritmo de síntesis LFSR (Algoritmo iterativo de Berlekamp), [7] pero ahora se lo conoce como el algoritmo Berlekamp–Massey.
El algoritmo de Berlekamp–Massey es una alternativa al decodificador Reed–Solomon Peterson para resolver el conjunto de ecuaciones lineales. Puede resumirse como la búsqueda de los coeficientes Λ j de un polinomio Λ( x ) de modo que para todas las posiciones i en un flujo de entrada S :
En los ejemplos de código siguientes, C ( x ) es una instancia potencial de Λ ( x ). El polinomio localizador de errores C ( x ) para L errores se define como:
o al revés:
El objetivo del algoritmo es determinar el grado mínimo L y C ( x ) que resulta en todos los síndromes.
siendo igual a 0:
Algoritmo: C ( x ) se inicializa a 1, L es el número actual de errores asumidos y se inicializa a cero. N es el número total de síndromes. n se utiliza como iterador principal y para indexar los síndromes de 0 a N −1. B ( x ) es una copia del último C ( x ) desde que L se actualizó e inicializó a 1. b es una copia de la última discrepancia d (explicada a continuación) desde que L se actualizó e inicializó a 1. m es el número de iteraciones desde que L , B ( x ) y b se actualizaron e inicializaron a 1.
Cada iteración del algoritmo calcula una discrepancia d . En la iteración k esto sería:
Si d es cero, el algoritmo supone que C ( x ) y L son correctos por el momento, incrementa m y continúa.
Si d no es cero, el algoritmo ajusta C ( x ) de modo que un recálculo de d sea cero:
El término x m desplaza B(x) de modo que sigue los síndromes correspondientes a b . Si la actualización anterior de L se produjo en la iteración j , entonces m = k − j , y una discrepancia recalculada sería:
Esto cambiaría una discrepancia recalculada a:
El algoritmo también debe aumentar L (número de errores) según sea necesario. Si L es igual al número real de errores, entonces durante el proceso de iteración, las discrepancias se convertirán en cero antes de que n sea mayor o igual a 2 L . De lo contrario, L se actualiza y el algoritmo actualizará B ( x ), b , aumentará L y restablecerá m = 1. La fórmula L = ( n + 1 − L ) limita L al número de síndromes disponibles utilizados para calcular discrepancias, y también maneja el caso donde L aumenta en más de 1.
El algoritmo de Massey (1969, pág. 124) para un campo arbitrario:
polinomio ( campo K ) s ( x ) = ... /* los coeficientes son s_j; secuencia de salida como polinomio de grado N-1) */ /* polinomio de conexión */ polinomio ( campo K ) C ( x ) = 1 ; /* los coeficientes son c_j */ polinomio ( campo K ) B ( x ) = 1 ; int L = 0 ; int m = 1 ; campo K b = 1 ; int n ; /* pasos 2. y 6. */ for ( n = 0 ; n < N ; n ++ ) { /* paso 2. calcular discrepancia */ campo K d = s_n + ; if ( d == 0 ) { /* paso 3. la discrepancia es cero; la aniquilación continúa */ m = m + 1 ; } else if ( 2 * L <= n ) { /* paso 5. */ /* copia temporal de C(x) */ polinomio ( campo K ) T ( x ) = C ( x ); C ( x ) = C ( x ) - d B ( x ); L = n + 1 - L ; B ( x ) = T ( x ); b = d ; m = 1 ; } else { /* paso 4. */ C ( x ) = C ( x ) - d B ( x ); m = m + 1 ; } } return L ;
En el caso del código binario GF(2) BCH, la discrepancia d será cero en todos los pasos impares, por lo que se puede agregar una verificación para evitar calcularla.
/* ... */ for ( n = 0 ; n < N ; n ++ ) { /* si el número de paso es impar, la discrepancia == 0, no es necesario calcularla */ if (( n & 1 ) != 0 ) { m = m + 1 ; continue ; } /* ... */
{{citation}}
: CS1 maint: location missing publisher (link)