Алгоритм Верхуффа: различия между версиями

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
[непроверенная версия][непроверенная версия]
Содержимое удалено Содержимое добавлено
Нет описания правки
Строка 405: Строка 405:
[[en:Verhoeff algorithm]]
[[en:Verhoeff algorithm]]


[[Category:Modular arithmetic]]
[[Category:Матрицы]]
[[Category:Теория групп]]
[[Category:Контрольная сумма]]
[[Category:Контрольная сумма]]
[[Category:Циклические коды]]
[[Category:Циклические коды]]
[[Category:Обнаружение и исправление ошибок]]
[[Category:Обнаружение и исправление ошибок]]
[[Категория:Алгоритмы]]
[[Category:Checksum algorithms]]
[[Category:Error detection and correction]]

Версия от 13:51, 22 марта 2010

Алгоритм Верхоффа (Verhoeff) - алгоритм рассчёта контрольной суммы выполняющих обнаружение ошибок. Впервые издан в 1969, датским математиком Jacobus Verhoeff (1927 гр). Призван находить большее число ошибок чем аналогичный по назначению Алгоритм Луна.

С помощью одной контрольной цифры определить все возможные ошибки перестановки или одиночные ошибки не возможно. Однако при этом можно покрыть наиболее часто встречающиеся.

Диэдрическая группа D5

Вместо суммирования произведений цифр на весовые коэффициенты Верхофф решил использовать операцию над группой, известной как диэдрическая группа D5.

d(j,k) k
j         0     1     2     3     4     5     6     7     8     9  
0 0 1 2 3 4 5 6 7 8 9
1 1 2 3 4 0 6 7 8 9 5
2 2 3 4 0 1 7 8 9 5 6
3 3 4 0 1 2 8 9 5 6 7
4 4 0 1 2 3 9 5 6 7 8
5 5 9 8 7 6 0 4 3 2 1
6 6 5 9 8 7 1 0 4 3 2
7 7 6 5 9 8 2 1 0 4 3
8 8 7 6 5 9 3 2 1 0 4
9 9 8 7 6 5 4 3 2 1 0

Результат операции d(i, k) проще всего определить по таблице, где он располагается на пересечении j-й строки и k-того столбца таблицы. Выбранная Верхоффом операция не является коммутативной, то есть для нее не всегда выполняется условие d(i, k) = d(k, j).

Последовательно выполняя операцию d(j, k), где j – результат предыдущей итерации (0 для первой итерации), а k – очередная цифра числа, можно получить алгоритм вычисления контрольной цифры, превосходящий обычное сложение по модулю 10. Действительно, несмотря на то, что оба алгоритма и выявляют одиночные ошибки, приведенный выше способ позволяет, в отличие от сложения по модулю 10, определить 60 из 90 возможных ошибок перестановки соседних цифр.

Однако Верхофф пошел дальше. Он предложил использовать в качестве второго параметра d(j, k) не саму цифру, а результат еще одной операции – p(x, y). Результат этой операции также удобно определять по таблице.

p(x,y) y
x         0     1     2     3     4     5     6     7     8     9  
0 0 1 2 3 4 5 6 7 8 9
1 1 5 7 6 2 8 3 0 9 4
2 5 8 0 3 7 9 6 1 4 2
3 8 9 1 6 0 4 3 5 2 7
4 9 4 5 3 1 2 6 8 7 0
5 4 2 8 6 5 7 3 9 0 1
6 2 7 9 3 8 0 6 4 1 5
7 7 0 4 6 9 1 3 2 5 8

Как видим, в таблице только 8 строк. Поэтому значение x берется по модулю 8.

Алгоритм проверки

  1. Взять исходное значение c = 0.
  2. Для каждой цифры проверяемого числа, начиная с наименее значимой (справа), вычислить c = d(c, p(i, ni)), где i — порядковый номер цифры, а ni — значение цифры.
  3. Если c = 0, контрольная цифра верна.

Алгоритм вычисления

  1. Взять исходное значение c = 0.
  2. Для каждой цифры исходного числа, начиная с наименее значимой (справа), вычислить c = d(c, p(i, ni)), где i — порядковый номер цифры, а ni — значение цифры.
  3. Добавить справа к исходному числу результат операции inv(c), определяемый по еще одной таблице:
j   0     1     2     3     4     5     6     7     8     9  
inv(j) 0 4 3 2 1 5 6 7 8 9

Достоинства и недостатки

Процент ошибок, выявляемый при помощи алгоритма Верхоффа:

  1. Одиночные ошибки (6 вместо 7) — 100% ошибок;
  2. Перестановки соседних цифр (67 вместо 76) — 100% ошибок;
  3. Двойные ошибки (66 вместо 77) — 95,5% ошибок;
  4. Перестановки несоседних цифр (637 вместо 736) — 94,2% ошибок;
  5. Двойные ошибки в несоседних цифрах (636 вместо 737) — 94,2% ошибок.

К недостаткам алгоритма традиционно относили его высокую, по сравнению с другими алгоритмами, сложность. Достаточно сложно произвести все вычисления вручную, особенно для длинных последовательностей. Однако при машинной проверке сложность вычислений не играет решающей роли, что позволяет использовать алгоритм Верхоффа при проверке введенных значений в различных устройствах.

Ссылки