Отсюда, во-первых, видно, что кодовое расстояние действительно не меньше 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. И хорошее упражнение — посчитать, сколько их.
Математические байки
Photo
Можно посчитать для конструкции через чётную сумму и сдвиг на (1/2,...,1/2).
Тогда будет:
(8*7/2) * 4 = 112 векторов вида (±1,±1, 0,...,0), где ±1 стоят на произвольных двух местах;
и ещё 128 векторов вида (±1/2,±1/2,....,±1/2), где число знаков "-" чётно.
Итого 112+128=240.
(8*7/2) * 4 = 112 векторов вида (±1,±1, 0,...,0), где ±1 стоят на произвольных двух местах;
и ещё 128 векторов вида (±1/2,±1/2,....,±1/2), где число знаков "-" чётно.
Итого 112+128=240.