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 determinada. El algoritmo también encontrará el polinomio mínimo de una secuencia lineal recurrente en un campo arbitrario . El requisito de campo significa que el algoritmo de 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 Bose-Chaudhuri-Hocquenghem (BCH) . [3] [4] James Massey reconoció su aplicación a registros de desplazamiento de retroalimentación lineal y simplificó el algoritmo. [5] [6] Massey denominó al algoritmo Algoritmo de síntesis LFSR (Algoritmo iterativo Berlekamp), [7] pero ahora se conoce como algoritmo Berlekamp-Massey.
El algoritmo Berlekamp-Massey es una alternativa al decodificador Reed-Solomon Peterson para resolver el conjunto de ecuaciones lineales. Se puede resumir como encontrar 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 en 1, L es el número actual de errores asumidos y se inicializa en 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 de la última C ( x ) desde que L se actualizó e inicializó en 1. b es una copia de la última discrepancia d (explicada a continuación) desde que L se actualizó e inicializó en 1. m es el número de las iteraciones desde 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 ) para que un nuevo cálculo de d sea cero:
El término x m desplaza B(x) por lo que sigue los síndromes correspondientes a b . Si la actualización anterior de L ocurrió 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 necesita 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 serán 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 las discrepancias, y también maneja el caso donde L aumenta en más de 1.
El algoritmo de Massey (1969, p. 124) para un campo arbitrario:
polinomio ( campo K ) s ( x ) = ... /* los coeficientes son s_j; secuencia de salida como polinomio de N-1 grado) */ /* polinomio de conexión */ polinomio ( campo K ) C ( x ) = 1 ; /* los coeficientes son c_j */ polinomio ( campo K ) B ( x ) = 1 ; entero L = 0 ; int metro = 1 ; campo K b = 1 ; int norte ; /* pasos 2. y 6. */ for ( n = 0 ; n < N ; n ++ ) { /* paso 2. calcular la 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 = norte + 1 - L ; B ( x ) = T ( x ); segundo = re ; metro = 1 ; } else { /* paso 4. */ C ( x ) = C ( x ) - d B ( x ); metro = metro + 1 ; } } devolver 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, discrepancia == 0, no es necesario calcularlo */ if (( n & 1 ) != 0 ) { metro = metro + 1 ; continuar ; } /* ... */
{{citation}}
: CS1 maint: location missing publisher (link)