Berlekamp-Massey- algoritmen är en algoritm för att hitta det kortaste skiftregistret med linjär återkoppling för en binär sekvens som ges som ingång. Algoritmen låter dig också hitta minimipolynomet för den ingående linjära återkommande sekvensen över ett godtyckligt fält .
Algoritmen upptäcktes av Alvin Berlekamp 1968 [1] . En tillämpning av algoritmen på linjära koder hittades av James Massey följande år [2] . Detta blev nyckeln till den praktiska tillämpningen av Reed-Solomon-koder .
Algoritm B.M. är en alternativ metod för att lösa SLAE, som kan beskrivas enligt följande:
I kodexemplen nedan representerar C(x) Λ(x). Fellokaliseraren C(x) för L -fel definieras som:
eller bakifrån:
Syftet med algoritmen är att bestämma minimum L och motsvarande C(x), vilket ger fel i hela syndromet
resulterar i noll:
Algoritm: C(x) initieras till 1, L betecknar det aktuella antalet fel som hittills hittats och initieras till noll. N är det totala antalet felsyndromelement. n är huvudräknaren, det är också indexet för syndromelementen från 0 till ( N -1). B(x) är en kopia av den sista C(x) vid tidpunkten för uppdateringen av L , och initieras till 1. b är en kopia av den senaste avvikelsen d (se nedan), återigen, vid tidpunkten för uppdateringen av L och initieras till 1. m är antalet iterationer som har passerat sedan uppdateringen L , B(x) och b och som också initierats till en.
Vid varje iteration beräknas diskrepansen d . Vid den k: te iterationen blir det:
Om d är noll betyder det att C(x) och L är korrekta för närvarande, det räcker med att öka m och fortsätta iterationen.
Om d inte är noll, korrigerar algoritmen C(x) för att sätta d till noll :
Multiplicering med x m är i huvudsak en förskjutning av B(x)-koefficienterna med m, dvs varje koefficient sker m högre för att matcha syndromet för b . Om senaste gången L uppdaterades vid iteration j (och nu har vi den k: te iterationen), då är m = k - j , och den omräknade avvikelsen är:
Det vill säga, genom att ersätta, ser vi att det försvinner:
Dessutom måste värdet på L (antalet fel hittade) ibland korrigeras. Om L är lika med det faktiska antalet felaktiga symboler, så nollställs avvikelserna under iterationerna innan n blir större än eller lika med (2 L ). Annars uppdateras L och algoritmen uppdaterar B(x), b, L själv (ökar) och m återställs till 1. Uttrycket L = (n + 1 - L) begränsar L till antalet tillgängliga syndromelement som används för att beräkna avvikelserna, och löser samtidigt problemet med att öka L med mer än ett.
Algoritm från Massey (1969 , s. 124):
polynom ( fält K ) s ( x ) = ... /* koeffs är s_j; utdatasekvens som N-1 grads polynom) */ /* anslutningspolynom */ polynom ( fält K ) C ( x ) = 1 ; /* koeffs är c_j */ polynom ( fält K ) B ( x ) = 1 ; int L = 0 ; int m = 1 ; fält Kb = 1 ; _ int n ; /* steg 2. och 6. */ för ( n = 0 ; n < N ; n ++ ) { /* steg 2. beräkna avvikelse */ fält Kd = s_n + \ Sigma_ { i = 1 } ^ L c_i * s_ { n - i } ; om ( d == 0 ) { /* steg 3. avvikelsen är noll; förintelsen fortsätter */ m = m + 1 _ } annat om ( 2 * L <= n ) { /* steg 5. */ /* tillfällig kopia av C(x) */ polynom ( fält K ) T ( x ) = C ( x ); C ( x ) = C ( x ) -db ^ { - 1 } x ^ mB ( x ) ; _ L = n + 1 - L ; B ( x ) = T ( x ); b = d ; m = 1 ; } annan { /* steg 4. */ C ( x ) = C ( x ) -db ^ { - 1 } x ^ mB ( x ) ; _ m = m + 1 _ } } retur L ;