Алгоритм Берлекэмпа –Мэсси — это алгоритм , который находит кратчайший регистр сдвига с линейной обратной связью (LFSR) для заданной двоичной выходной последовательности. Алгоритм также находит минимальный полином линейно рекуррентной последовательности в произвольном поле . Требование поля означает, что алгоритм Берлекэмпа–Мэсси требует, чтобы все ненулевые элементы имели мультипликативную инверсию. [1] Ридс и Слоан предлагают расширение для обработки кольца . [2]
Элвин Берлекэмп изобрел алгоритм декодирования кодов Бозе-Чоудхури-Хоквингема (БЧХ) . [3] [4] Джеймс Мэсси распознал его применение в линейных регистрах сдвига с обратной связью и упростил алгоритм. [5] [6] Мэсси назвал алгоритм алгоритмом синтеза LFSR (итеративный алгоритм Берлекэмпа), [7] но теперь он известен как алгоритм Берлекэмпа-Месси.
Алгоритм Берлекэмпа–Мэсси является альтернативой декодеру Рида–Соломона Петерсона для решения набора линейных уравнений. Его можно обобщить как нахождение коэффициентов Λ j полинома Λ( x ) так, чтобы для всех позиций i во входном потоке S :
В примерах кода ниже C ( x ) является потенциальным экземпляром Λ ( x ). Полином локатора ошибок C ( x ) для L ошибок определяется как:
или наоборот:
Цель алгоритма — определить минимальную степень L и C ( x ), которая приводит ко всем синдромам.
равно 0:
Алгоритм: C ( x ) инициализируется значением 1, L — текущее количество предполагаемых ошибок, инициализируется значением 0. N — общее количество синдромов. n используется в качестве основного итератора и для индексации синдромов от 0 до N −1. B ( x ) — копия последнего C ( x ), так как L был обновлен и инициализирован значением 1. b — копия последнего несоответствия d (объясняется ниже), так как L был обновлен и инициализирован значением 1. m — количество итераций, так как L , B ( x ) и b были обновлены и инициализированы значением 1.
Каждая итерация алгоритма вычисляет расхождение d . На итерации k это будет:
Если d равно нулю, алгоритм предполагает, что C ( x ) и L на данный момент верны, увеличивает m и продолжает работу.
Если d не равно нулю, алгоритм корректирует C ( x ) таким образом, чтобы пересчет d был равен нулю:
Член x m сдвигает B(x) так, чтобы он следовал синдромам, соответствующим b . Если предыдущее обновление L произошло на итерации j , то m = k − j , и пересчитанное расхождение будет:
Это изменит пересчитанное расхождение на:
Алгоритм также должен увеличивать L (количество ошибок) по мере необходимости. Если L равно фактическому количеству ошибок, то в процессе итерации расхождения станут равными нулю до того, как n станет больше или равным 2 L . В противном случае L обновляется, и алгоритм обновляет B ( x ), b , увеличивает L и сбрасывает m = 1. Формула L = ( n + 1 − L ) ограничивает L числом доступных синдромов, используемых для расчета расхождений, а также обрабатывает случай, когда L увеличивается более чем на 1.
Алгоритм Мэсси (1969, стр. 124) для произвольного поля:
полином ( поле K ) s ( x ) = ... /* коэффициенты равны s_j; выходная последовательность как полином степени N-1) */ /* полином связи */ полином ( поле K ) C ( x ) = 1 ; /* коэффициенты равны c_j */ полином ( поле K ) B ( x ) = 1 ; int L = 0 ; int m = 1 ; поле K b = 1 ; int n ; /* шаги 2. и 6. */ for ( n = 0 ; n < N ; n ++ ) { /* шаг 2. вычислить расхождение */ field K d = s_n + ; if ( d == 0 ) { /* шаг 3. расхождение равно нулю; аннигиляция продолжается */ m = m + 1 ; } else if ( 2 * L <= n ) { /* шаг 5. */ /* временная копия C(x) */ полином ( поле 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 { /* шаг 4. */ C ( x ) = C ( x ) - d B ( x ); m = m + 1 ; } } return L ;
В случае двоичного кода GF(2) BCH расхождение d будет равно нулю на всех нечетных шагах, поэтому можно добавить проверку, чтобы избежать его вычисления.
/* ... */ for ( n = 0 ; n < N ; n ++ ) { /* если нечетное число шагов, расхождение == 0, нет необходимости его вычислять */ if (( n & 1 ) != 0 ) { m = m + 1 ; continue ; } /* ... */
{{citation}}
: CS1 maint: location missing publisher (link)