Berlekamp–Massey algorithm

From Wikipedia, the free encyclopedia
(Redirected from Berlekamp-Massey algorithm)
Jump to navigation Jump to search
File:Berlekamp–Massey algorithm.png
Berlekamp–Massey algorithm

The Berlekamp–Massey algorithm is an algorithm that will find the shortest linear-feedback shift register (LFSR) for a given binary output sequence. The algorithm will also find the minimal polynomial of a linearly recurrent sequence in an arbitrary field. The field requirement means that the Berlekamp–Massey algorithm requires all non-zero elements to have a multiplicative inverse.[1] Reeds and Sloane offer an extension to handle a ring.[2]

Elwyn Berlekamp invented an algorithm for decoding Bose–Chaudhuri–Hocquenghem (BCH) codes.[3][4] James Massey recognized its application to linear feedback shift registers and simplified the algorithm.[5][6] Massey termed the algorithm the LFSR Synthesis Algorithm (Berlekamp Iterative Algorithm),[7] but it is now known as the Berlekamp–Massey algorithm.

Description of algorithm

[edit | edit source]

The Berlekamp–Massey algorithm is an alternative to the Reed–Solomon Peterson decoder for solving the set of linear equations. It can be summarized as finding the coefficients Λj of a polynomial Λ(x) so that for all positions i in an input stream S:

Si+ν+Λ1Si+ν1++Λν1Si+1+ΛνSi=0.

In the code examples below, C(x) is a potential instance of Λ(x). The error locator polynomial C(x) for L errors is defined as:

C(x)=CLxL+CL1xL1++C2x2+C1x+1

or reversed:

C(x)=1+C1x+C2x2++CL1xL1+CLxL.

The goal of the algorithm is to determine the minimal degree L and C(x) which results in all syndromes

Sn+C1Sn1++CLSnL

being equal to 0:

Sn+C1Sn1++CLSnL=0,LnN1.

Algorithm: C(x) is initialized to 1, L is the current number of assumed errors, and initialized to zero. N is the total number of syndromes. n is used as the main iterator and to index the syndromes from 0 to N−1. B(x) is a copy of the last C(x) since L was updated and initialized to 1. b is a copy of the last discrepancy d (explained below) since L was updated and initialized to 1. m is the number of iterations since L, B(x), and b were updated and initialized to 1.

Each iteration of the algorithm calculates a discrepancy d. At iteration k this would be:

dSk+C1Sk1++CLSkL.

If d is zero, the algorithm assumes that C(x) and L are correct for the moment, increments m, and continues.

If d is not zero, the algorithm adjusts C(x) so that a recalculation of d would be zero:

C(x)C(x)(d/b)xmB(x).

The xm term shifts B(x) so it follows the syndromes corresponding to b. If the previous update of L occurred on iteration j, then m = kj, and a recalculated discrepancy would be:

dSk+C1Sk1+(d/b)(Sj+B1Sj1+).

This would change a recalculated discrepancy to:

d=d(d/b)b=dd=0.

The algorithm also needs to increase L (number of errors) as needed. If L equals the actual number of errors, then during the iteration process, the discrepancies will become zero before n becomes greater than or equal to 2L. Otherwise L is updated and the algorithm will update B(x), b, increase L, and reset m = 1. The formula L = (n + 1 − L) limits L to the number of available syndromes used to calculate discrepancies, and also handles the case where L increases by more than 1.

Pseudocode

[edit | edit source]

The algorithm from Massey (1969, p. 124) for an arbitrary field:

   polynomial(field K) s(x) = ... /* coeffs are sj; output sequence as N-1 degree polynomial) */
   /* connection polynomial */
   polynomial(field K) C(x) = 1;  /* coeffs are cj */
   polynomial(field K) B(x) = 1;
   int L = 0;
   int m = 1;
   field K b = 1;
   int n;
   /* steps 2. and 6. */
   for (n = 0; n < N; n++) {
       /* step 2. calculate discrepancy */
       field K d = sn +  L
i=1
ci sn - i
if (d == 0) { /* step 3. discrepancy is zero; annihilation continues */ m = m + 1; } else if (2 * L <= n) { /* step 5. */ /* temporary copy of C(x) */ polynomial(field K) T(x) = C(x); C(x) = C(x) - d b−1 xm B(x); L = n + 1 - L; B(x) = T(x); b = d; m = 1; } else { /* step 4. */ C(x) = C(x) - d b−1 xm B(x); m = m + 1; } } return L;

In the case of binary GF(2) BCH code, the discrepancy d will be zero on all odd steps, so a check can be added to avoid calculating it.

    /* ... */
    for (n = 0; n < N; n++) {
        /* if odd step number, discrepancy == 0, no need to calculate it */
        if ((n&1) != 0) {
            m = m + 1;
            continue;
        }
    /* ... */

See also

[edit | edit source]

References

[edit | edit source]
  1. ^ Reeds & Sloane 1985, p. 2
  2. ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
  3. ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
  4. ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).. Previous publisher McGraw-Hill, New York, NY.
  5. ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
  6. ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
  7. ^ Massey 1969, p. 124
[edit | edit source]