Центральный Дом Знаний - Алгоритм Берлекэмпа — Мэсси

Информационный центр "Центральный Дом Знаний"

Заказать учебную работу! Жми!



ЖМИ: ТУТ ТЫСЯЧИ КУРСОВЫХ РАБОТ ДЛЯ ТЕБЯ

      cendomzn@yandex.ru  

Наш опрос

Как Вы планируете отдохнуть летом?
Всего ответов: 922

Онлайн всего: 1
Гостей: 1
Пользователей: 0


Форма входа

Логин:
Пароль:

Алгоритм Берлекэмпа — Мэсси

Алгоритм Берлекэмпа — Мэсси, алгоритм поиска кратчайшего регистра сдвига с линейной обратной связью для поданной на вход алгоритма требуемой генерируемой последовательности.

Алгоритм был открыт Элвином Берлекэмпом  в 1968 году. Применение алгоритма к линейным кодам было найдено Джеймсом Мэсси в следующем году. Это стало ключом для практического применения кодов Рида — Соломона.

Алгоритм для двоичных последовательностей:

  • Задать требуемую последовательность битов ~s_0, s_1, ..., s_{n-1}.

  • Создать массивы ~b~t~c длины ~n, задать начальные значения b_0 \leftarrow 1c_0 \leftarrow 1N \leftarrow 1L \leftarrow 0m \leftarrow -1.

  • Пока ~N < n:

    1. Вычислить d \leftarrow s_N \oplus c_1s_{N-1} \oplus c_2s_{N-2} \oplus ... \oplus c_Ls_{N-L}.

    2. Если ~d=0, то текущая функция генерирует выбранный участок ~s_{N-L}, s_{N-L+1}, ..., s_N последовательности; оставить функцию прежней.

    3. Если ~d \not = 0:

      • Сохранить копию массива ~c в ~t.

      • Вычислить новые значения ~c_{N-m} \leftarrow c_{N-m} \oplus b_0, c_{N-m+1} \leftarrow c_{N-m+1} \oplus b_1, ..., c_{n-1} \leftarrow c_{n-1} \oplus b_{n-N+m-1}.

      • Если 2L \leqslant N, установить значения L \leftarrow N+1-Lm \leftarrow N и скопировать ~t в ~b.

    4. N \leftarrow N+1.

  • В результате массив ~c — функция обратной связи, то есть c_Ls_i \oplus c_{L-1}s_{i+1} \oplus c_{L-2}s_{i+2} \oplus ... \oplus c_0s_{i+L} = 0 для любых ~i.

Пример кода на C#:

byte[] b, c, t, s;
int N, L, m;
 
public void BerlekampRegistryTester(int sequenceLength)
{
 b = new byte[sequenceLength];
 c = new byte[sequenceLength];
 t = new byte[sequenceLength];
 s = new byte[sequenceLength];
 for (int i = 0; i < sequenceLength; i++) 
 b[i] = c[i] = t[i] = 0;
 b[0] = c[0] = 1;
 N = L = 0;
 m = -1;
}
 
private void runTest() 
{
 int d;
 while (N < s.Length)
 {
 d = 0;
 for (int i = 0; i <= L; i++) 
 d += s[N-i] * c[i];
 d = d % 2;
 
 if (d != 0)
 {
 t = (byte[])c.Clone();
 for (int i = 0; i <= s.Length + m - 1 - N; i++)
 c[N - m + i] = (byte)(c[N - m + i] ^ b[i]);
 if (L <= (N / 2))
 {
 L = N + 1 - L;
 m = N;
 b = (byte[])t.Clone();
 }
 }
 N++;
 }
}

Пример кода на Ruby:

s = [0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1]
b = Array.new(s.size){ |index| 0 }
c = Array.new(s.size){ |index| 0 }
t = Array.new(s.size){ |index| 0 }
b[0] = 1
c[0] = 1
N = 0
L = 0
m = -1
 
while N < s.size do
 d = 0
 0.upto(L) do |i|
 d += s[N - i] * c[i]
 end
 d %= 2
 
 if (d != 0)
 t = c.clone
 0.upto(s.size + m - 1 - N) do |i|
 c[N - m + i] = c[N - m + i] ^ b[i]
 end
 if (L <= (N / 2))
 L = N + 1 - L
 m = N;
 b = t.clone
 end
 end
 N = N.next
end

Лит.: Блейхут Р. Теория и практика кодов, контролирующих ошибки = Theory and Practice of Error Control Codes — М.: Мир, 1986. — 576 с.

Loading

Календарь

«  Апрель 2024  »
ПнВтСрЧтПтСбВс
1234567
891011121314
15161718192021
22232425262728
2930

Архив записей

Друзья сайта

  • Заказать курсовую работу!
  • Выполнение любых чертежей
  • Новый фриланс 24