Вопросы, разумеется, в виде заранее подготовленных карточек — "есть ли твоё число на этой карточке".
У нас в Ренне обычно среди прочего бывает и такое на стенде математиков на днях науки; дети радостно пользуются разрешением соврать — я помню буквально два-три случая, когда при показе этого фокуса на все вопросы отвечали честно. :)
(Вот тут есть реализация этого на смайликах — http://xavier.toonywood.org/popularization/applets/hamming.html — правда, с вопросами по-французски)
У нас в Ренне обычно среди прочего бывает и такое на стенде математиков на днях науки; дети радостно пользуются разрешением соврать — я помню буквально два-три случая, когда при показе этого фокуса на все вопросы отвечали честно. :)
(Вот тут есть реализация этого на смайликах — http://xavier.toonywood.org/popularization/applets/hamming.html — правда, с вопросами по-французски)
Да, и если уж об этом зашла речь, давайте я скажу, что проверочной матрицей кода называется матрица, где по строчкам записан базис ортогонального дополнения к коду. Она проверочная — потому что если её умножить на правильное сообщение, то будет вектор из одних нулей.
Несложно увидеть, что проверочная матрица к коду с порождающей матрицей
(Id_k | A)
это матрица
(A^* | Id_{n-k}).
В частности, для кода Хэмминга проверочной матрицей будет
Несложно увидеть, что проверочная матрица к коду с порождающей матрицей
(Id_k | A)
это матрица
(A^* | Id_{n-k}).
В частности, для кода Хэмминга проверочной матрицей будет
Отсюда, во-первых, видно, что кодовое расстояние действительно не меньше 3: все столбцы разные и ненулевые, поэтому сумма mod 2 никаких <=2 не будет нулевой.
А во-вторых, видно, как показывать фокус: нужно просто иметь такую матрицу записанной, складывать по модулю 2 те столбцы, про которые был ответ "да" — и сумма будет равна тому столбцу, в котором отвечающий соврал. Или нулевому столбцу, если он такой возможностью не воспользовался.
Но давайте вернёмся к коду Хэмминга, и усилим его, добавив бит контроля чётности:
Скорость передачи упала ровно вдвое — мы теперь передаём 4 бита за блок длиной 8. Зато кодовое расстояние возросло до 4, поэтому мы можем не только исправить одну ошибку, но и обнаружить (хоть и не исправить) две.
И кстати — несколько более сложные, но аналогичные коды реально применялись для связи с далёкими зондами:
Математические байки
Photo
Так вот, расширенный код Хэмминга обладает двумя замечательными свойствами: он дважды чётен (вес, то есть число единиц в любом его элементе, делится на 4; терминология традиционная), и унимодулярен: размерность у него равна половине размерности всего пространства.
Давайте теперь применим такую общую конструкцию. Пусть есть линейный код C, то есть подпространство в F_2^n. Возьмём его прообраз при отображении "приведения по модулю 2"
Z^n-> F_2^n.
Получится решётка — более того, подрешётка в Z^n. И теперь сожмём её в корень из 2 раз.
Z^n-> F_2^n.
Получится решётка — более того, подрешётка в Z^n. И теперь сожмём её в корень из 2 раз.
Оказывается, что если мы начали унимодулярного кода — получится унимодулярная (т.е. с кообъёмом 1) решётка. Если с дважды чётного кода — чётная решётка.
И из пополненного кода Хэмминга получается как раз решётка E_8, решётка Коркина-Золотарёва!
Кстати — если задана чётная решётка, то набор векторов длины \sqrt{2} в ней образует систему корней: конечное множество векторов, отражения относительно перпендикулярных им гиперплоскостей сохраняют это множество. (Это не полное определение — см. https://en.wikipedia.org/wiki/Root_system#Definition — но остальное в нашем случае будет выполнено совсем автоматически)
И это следует из формулы для отражения: отражение относительно перпендикулярной к v гиперплоскости это
И это следует из формулы для отражения: отражение относительно перпендикулярной к v гиперплоскости это
И если <v,v>=2, то в правой части стоит просто
u-<u,v>*v.
Поскольку чётная решётка автоматически целая, то это тоже вектор из той же решётки — поэтому такое отражение сохраняет всю решётку, в частности, набор её кратчайших векторов.
u-<u,v>*v.
Поскольку чётная решётка автоматически целая, то это тоже вектор из той же решётки — поэтому такое отражение сохраняет всю решётку, в частности, набор её кратчайших векторов.
Так вот, кратчайшие вектора решётки E_8 образуют систему корней E_8. И хорошее упражнение — посчитать, сколько их.