Сообщения от Викторина
Все случаи не проверяла, но навскидку везде двойная проверка и можно восстановить, какой бит битый и его реальное значение.
Вот только совсем не легкий пример получился. Возможно, кто-то найдет решение попроще.
Добавлено через 2 минуты
Так что можно отгадывать дальше.
Но сама идея интересная, передавать сразу функцию вместо самого сообщения.
Добавлено через 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).
ладно, возвращаемся к передаче сообщения и "контрольной суммы".
Только в контрольной сумме ксорим не попарно, как Уран, а первый бит с каждым из следующих.
Сообщение: 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 минут
мде, все равно остались неоднозначности.
Этот вариант тоже нерабочий.
Знание некоторых закономерностей освобождает от изучения многих фактов.
Мечты сбываются рано или поздно, так или иначе.
Ну в общем-то у меня хоги и были в одном случае, токо я их называл четностью для двух битов.
Но сама идея интересная, передавать сразу функцию вместо самого сообщения.
Добавлено через 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 минут
да, действительно. В моем решении в случае поломки бит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 минут
мде, все равно остались неоднозначности.
Этот вариант тоже нерабочий.
bit1=xor(i1,i2)
bit2=xor(i1,i3)
bit3=xor(i1,i4)
bit4=xor(i2,i3)
bit5=xor(i2,i4)
bit6=xor(i3,i4)
bit7=i1
Сфейлилось на 1001 и 0110.
1001:
0011001
0110:
0011000
Если в одном варианте немцы испортят последний бит, то они совпадут. А жаль... Ну, я тоже пытался.
bit1=xor(i1,i2)
bit2=xor(i1,i3)
bit3=xor(i1,i4)
bit4=xor(i2,i3)
bit5=xor(i2,i4)
bit6=i2
bit7=i1
Ой, только я ступил, у меня там обратный xor в проверках фигурировал. Ошибся ) То есть 1, когда операнды одинаковые. Но да не суть, с нормальным тоже проверка проходится. Они симметрично работают.
Хм, а вот этот алгоритм вроде не сфейлился:
bit1=xor(i1,i2)
bit2=xor(i1,i3)
bit3=xor(i1,i4)
bit4=xor(i2,i3)
bit5=xor(i2,i4)
bit6=i2
bit7=i1
Ой, только я ступил, у меня там обратный xor в проверках фигурировал. Ошибся ) То есть 1, когда операнды одинаковые. Но да не суть, с нормальным тоже проверка проходится. Они симметрично работают.
По вашему алгоритму комбинация 0000 кодируется сообщением 0000000,
а комбинация 1111 кодируется сообщением 0000011.
А мы допустим мы получили комбинацию 0000010 :(
Да, понятно, что испортили один бит и даже больше - это шестой или седьмой бит. Но как понять передавали 0000 и испортили шестой бит с 0 на 1 или 1111 и испортили седьмой бит с 1 на 0???
Пока самый лучший вариант предложил Уран.
Небось в ответе какая-нибудь подколка из разряда: если первый символ 0, то передаем только шесть бит (а кто сказал, что их обязательно 7?)
В общем, предлагаю подумать еще и в этом направлении.
Знание некоторых закономерностей освобождает от изучения многих фактов.
Мечты сбываются рано или поздно, так или иначе.
Небось в ответе какая-нибудь подколка из разряда: если первый символ 0, то передаем только шесть бит (а кто сказал, что их обязательно 7?)
В общем, предлагаю подумать еще и в этом направлении.
Нет в ответе передаются все 7 битов!
Добавлено через 33 секунды
Их должно быть 7!
Или надо-таки для избежания потерь передать эти несчастные i1,i2,i3,i4, а потом замутить xor(i1,i2), xor(i1,i3), xor(i1,i4)
Как раз получается три xor'а. Хотя всё равно я вижу, что это не работает, можно придумать пример. Эх.
Знание некоторых закономерностей освобождает от изучения многих фактов.
Мечты сбываются рано или поздно, так или иначе.