#checksum #data-entry #error-correction
#контрольная сумма #ввод данных #исправление ошибок
Вопрос:
У меня есть короткие десятичные числа переменной длины, такие как: #41551
, которые вручную расшифровываются людьми. Неправильный ввод приведет к нежелательным результатам, поэтому моя первая мысль — использовать алгоритм Луна для добавления контрольной суммы — #41551-3
. Однако это только обнаружит ошибку, а не исправит ее. Кажется, добавление еще одной контрольной цифры должно позволять обнаруживать и исправлять ошибку, состоящую из одной цифры, поэтому задается #41515-3?
(ошибка транспонирования) Я был бы в состоянии восстановить правильную #41551
.
Что-то вроде кода Хэмминга кажется подходящим местом для поиска, но я не смог выяснить, как применить их к десятичным данным вместо двоичных. Существует ли алгоритм, предназначенный для такого использования, или можно ли адаптировать Хэмминга / Рида-Соломона и т.д. К этой ситуации?
Комментарии:
1. Я думаю, что это очень сложная проблема из-за странных ошибок «канала»: пропущенная цифра, замена двух цифр и т.д.
2. Вау, люди действительно не хотят даже нажимать на этот вопрос.
Ответ №1:
Да, вы можете использовать коды Хэмминга в дополнение к контрольным уравнениям для исправления. Используйте суммирование данных по модулю 10 для нахождения контрольных цифр. Поместите контрольные цифры в позиции 1,2,4,8, ….
Ответ №2:
Я могу предоставить алгоритм только с ПЯТЬЮ дополнительными цифрами. Примечание: 5 исходных цифр — это действительно наихудший случай. С ПЯТЬЮ дополнительными цифрами вы можете выполнить ECC для 11 исходных цифр. Это похоже на классические вычисления ECC, но в десятичном:
Исходное (десятичное) 5-значное число: o0, o1, o2, o3, o4
Распределите цифры по позициям 0..9 следующим образом:
0 1 2 3 4 5 6 7 8 9
o0 o1 o2 o3 o4
c4 c0 c1 c2 c3 <- will be calculated check digits
Вычислите цифры в позициях 1,2,4,8 следующим образом:
c0, pos 1: (10 - (Sum positions 3,5,7,9))
c1, pos 2: (10 - (Sum positions 3,6,7))
c2, pos 4: (10 - (Sum positions 5,6,7))
c3, pos 8: (10 - (Sum positions 9))
ПОСЛЕ этого вычисления вычислите цифру в позиции:
c4, pos 0: (10 - (Sum positions 1..9))
Затем вы можете произвести перестановку следующим образом:
o0o1o2o3o4-c0c1c2c3c4
Для проверки запишите все цифры в следующем порядке:
0 1 2 3 4 5 6 7 8 9
c4 c0 c1 o0 c2 o1 o2 o3 c3 o4
Затем вычислите:
c0' = (Sum positions 1,3,5,7,9)
c1' = (Sum positions 2,3,6,7)
c2' = (Sum positions 4,5,6,7)
c3' = (Sum positions 8,9)
c4' = (Sum all positions)
Если c0′, c1′, c2′, c3′, c4′ равны нулю, то ошибки нет.
Если есть некоторые c[0..3]’, которые не равны нулю, и ВСЕ ненулевые c [0..3]’ имеют значение c4′, то ошибка в одной цифре.
Вы можете вычислить положение ошибочной цифры и исправить. (Упражнение оставлено читателю).
Если все c [0 ..3]’ равны нулю, и только c4′ неравен нулю, то в c4 ошибка в одну цифру.
Если c[0 ..3]’ неравно нулю и имеет значение, отличное от c4′, то у вас (как минимум) неисправимая двойная ошибка в двух цифрах.
Ответ №3:
Я пытался использовать Reed-Solomon, генерируя 3-значный код, который может исправлять до 1 цифры: https://epxx.co/artigos/edc2_en.html