Алгоритм Б.М. — это альтернативный метод решения СЛАУ, который может быть описан так:
В примерах кода ниже, C(x) представляет Λ(x). Локатор ошибки C(x) для
L
ошибок определён как:
или задом наперёд:
Цель алгоритма — определить минимальное
L
и соответствующее ему C(x), которое даёт во всём синдроме ошибки
в итоге ноль:
Алгоритм:
C(x) инициализирован величиной 1,
L
обозначает текущее количество найденных ошибок на данный момент, и инициализирован нулём.
N
— общее количество элементов синдрома ошибки.
n
— главный счётчик, он же индекс элементов синдрома от 0 до (
N
-1). B(x) — копия последнего C(x) на момент обновления
L
, и инициализируется 1.
b
— копия последнего расхождения
d
(см.ниже) опять же, на момент обновления
L
и инициализируется 1.
m
— номер итераций, прошедших с обновления
L
, B(x), and
b
и тоже инициализирован единицей.
На каждой итерации вычисляется расхождение
d
. На
k
-й итерации оно будет:
Если
d
равно нулю, это значит C(x) и L на данный момент верны, достаточно инкрементировать
m
и продолжить итерации.
Если
d
ненулевое, алгоритм поправляет C(x) так, чтобы его обнулить
d
:
Умножение на x
m
— это, по сути, сдвиг коэффициентов B(x) на m, т. е. каждый коэффициент занимает место на m более старшего, чтобы соответствовать синдрому для
b
. Если в последний раз L обновляли на итерации
j
(а сейчас у нас
k
-я итерация), то
m = k - j
, а пересчитанное расхождение имеет вид:
То есть, подставляя, увидим, что оно обращается в нуль:
Также величину
L
(число найденных ошибок) иногда надо поправлять. Если
L
равно действительному числу ошибочных символов, то по ходу итераций расхождения обнулятся раньше, чем
n
станет более или равно (2
L
). В противном случае L обновляется и алгоритм обновляет B(x), b, само L (увеличивается), а m сбрасывается в 1. Выражение L = (n + 1 - L) ограничивает L до количества доступных элементов синдрома, использованных для вычисления расхождений, и заодно решает задачу увеличения L более чем на единицу.
Пример кода
Алгоритм из
, p. 124)
harvtxt error: якоря не существует: CITEREFMassey1969 (
помощь
)
:
polynomial(fieldK)s(x)=.../* coeffs are s_j; output sequence as N-1 degree polynomial) *//* connection polynomial */polynomial(fieldK)C(x)=1;/* coeffs are c_j */polynomial(fieldK)B(x)=1;intL=0;intm=1;fieldKb=1;intn;/* steps 2. and 6. */for(n=0;n<N;n++){/* step 2. calculate discrepancy */fieldKd=s_n+\Sigma_{i=1}^Lc_i*s_{n-i};if(d==0){/* step 3. discrepancy is zero; annihilation continues */m=m+1;}elseif(2*L<=n){/* step 5. *//* temporary copy of C(x) */polynomial(fieldK)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;}else{/* step 4. */C(x)=C(x)-db^{-1}x^mB(x);m=m+1;}}returnL;
Алгоритм для двоичных последовательностей
Задать требуемую последовательность битов
.
Создать массивы
,
,
длины
, задать начальные значения
,
,
,
,
.
Пока
:
Вычислить
.
Если
, то текущая функция генерирует выбранный участок
последовательности; оставить функцию прежней.
Если
:
Сохранить копию массива
в
.
Вычислить новые значения
.
Если
, установить значения
,
и скопировать
в
.
.
В результате массив
— функция обратной связи, то есть
для любых
.
Примечания
Elwyn R. Berlekamp
, Algebraic Coding Theory, New York: McGraw-Hill, 1968. Revised ed., Aegean Park Press, 1984,
ISBN 0-89412-063-8
.
J. L. Massey
,
от 27 сентября 2011 на
Wayback Machine
, IEEE Trans. Information Theory, IT-15 (1969), 122—127.
Литература
Теория и практика кодов, контролирующих ошибки = Theory and Practice of Error Control Codes. —
М.
:
Мир
, 1986. — 576 с.
V. L. Kurakin, A. S. Kuzmin, A. V. Mikhalev, A. A. Nechaev.
Linear recurring sequences over rings and modules. // I. of Math. Science. Contemporary Math. and it’s Appl. Thematic surveys, vol. 10, 1994, I. of Math. Sciences, vol. 76, № 6, 1995.
MR
: