Uranium235Ну в общем-то у меня хоги и были в одном случае, токо я их называл четностью для двух битов.
Но сама идея интересная, передавать сразу функцию вместо самого сообщения.
Добавлено через 1 час 2 минуты
Функция Ф - это хог, он же четность (0 - одинаковые символы, 1 - разные символы). Само сообщение - АБВГ, цифры - номера битов.
Бит 1: Ф(А, Б)
Бит 2: Ф(В, Г)
Бит 3: Ф(1, 2)
Видно наличие/отсутствие ошибки среди первых трех битов
Бит 4: Ф (А, Г)
Бит 5: Ф (Б, В)
Бит 6: А
Бит 7: В
Если ошибка в трех первых битах успешно читаем сообщение. Пусть там нет ошибки.
Можно проверить наличие ошибки в битах 4 и 5:
Мы точно знаем из 1го и 2го, одинаковые или разные А с Б и В с Г.
То есть 00, 01, 10 или 11.
Если 1й и 2й биты имеют значения 00 или 11, то 4 и 5 тоже должны быть либо 00, либо 11 (допустимы обе комбинации одинаковых значений).
Для 01 и 10 известных неизвестные без ошибки тоже должны быть 01 и 00.
Если ошибка среди 4 и 5 есть, мы по прежнему строим сообщение через биты 1,2,6,7. Пусть ее нету. Ошибка в А, в В либо ее вообще нету.
Если ошибки вообще нету, то подставив А и В в функции 1,2 и 3,4, получим исходное сообщение в обоих случаях, причем одинаковое. Если разное, то инвертировав либо А, либо В, можем назвать абсолютно точно Ф(А, В). Я не знаю почему, но кажется, что решив систему уравнений с этой функцией и функциями из битов 1-2, 4-5, можно найти, в А или В косяк. Но видимо нет, но думать мне уже лень. Но предыдущий результат я несколько улучшил. Я читаю сообщение в 5 случаях испорченного бита и в случае отсутствия ошибки, и только в случае порчи двух конкретных битов имею 2 варианта сообщения, причем знаю об этом.
Можно попробовать также, но контрольный (3й бит) взять как Ф (2, 6).
Пока это самое лучшее, правда, ещё не читал, что Sesame написала. Тут уже гарантированно можно обнаружить, что была ошибка! Но всё же, например...
По вашему алгоритму комбинация 0000 кодируется сообщением 0000000,
а комбинация 1111 кодируется сообщением 0000011.
А мы допустим мы получили комбинацию 0000010
Да, понятно, что испортили один бит и даже больше - это шестой или седьмой бит. Но как понять передавали 0000 и испортили шестой бит с 0 на 1 или 1111 и испортили седьмой бит с 1 на 0???
Добавлено через 11 минут
Sesameда, действительно. В моем решении в случае поломки бит5 возникает неопределенность. Так что не годится.
ладно, возвращаемся к передаче сообщения и "контрольной суммы".
Только в контрольной сумме ксорим не попарно, как Уран, а первый бит с каждым из следующих.
Сообщение: i1 i2 i3 i4
Передаем
bit1: i1
bit2: i2
bit3: i3
bit4: i4
bit5: xor(bit1,bit2)
bit6: xor(bit1,bit3)
bit7: xor(bit1,bit4)
Чуть позже проверю для всех вариантов.
Добавлено через 2 часа 58 минут
мде, все равно остались неоднозначности.
Этот вариант тоже нерабочий.
Тоже не плохо. Ошибка обнаруживается. Но вот, например, 0000 передавали или 0100 не понятно, если получили 0100000, потому что 0000 соответствует 0000000, а 0100 - 0100100 и тут та же ситуация, что и у Uranium235.