Кстати, хорошее (и простое) упражнение: проверить, что (любая) чётная решётка автоматически является целой : скалярные произведения любых двух её векторов целые.
Математические байки
Интересно, что эта решётка будет чётной : квадраты длин всех её векторов чётные.
Проверить это несложно: <v,v>=8*(1/4)=2, в \Lambda тоже все квадраты чётные (потому что сумма квадратов целых чисел сравнима с их суммой и потому по определению \Lambda чётна). Наконец, скалярное произведение v с любым вектором u из \Lambda целое, а в формуле для квадрата суммы есть двойка:
<kv+u,kv+u>=k^2 <v,v> + <u,u> + 2k <u,v>.
<kv+u,kv+u>=k^2 <v,v> + <u,u> + 2k <u,v>.
А значит, наименьшая возможная длина вектора из решётки E_8 — это корень из 2!
Кстати — чётные решётки с кообъёмом 1 бывают только в пространствах, размерность которых делится на 8.
И это нетривиальное утверждение, которое доказывается через модулярные формы — о чём я точно скажу, но не прямо сейчас.
И это нетривиальное утверждение, которое доказывается через модулярные формы — о чём я точно скажу, но не прямо сейчас.
Второй способ построить решётку E_8 связан с кодами, исправляющими ошибки. (Да, Александр Шень читал целый курс об них — https://www.youtube.com/watch?v=DNCpIo1Gjco — но мне понадобится из этого довольно немного.)
YouTube
Лекция 1 | Ликбез: коды, исправляющие ошибки | Александр Шень | Лекториум
Лекция 2 | Курс: Ликбез: коды, исправляющие ошибки | Лектор: Александр Шень | Организатор: CSClub
Смотрите это видео на Лекториуме:
https://www.lektorium.tv/ZYp
Другие лекции курса «Ликбез: коды, исправляющие ошибки» доступны для просмотра по ссылке: …
Смотрите это видео на Лекториуме:
https://www.lektorium.tv/ZYp
Другие лекции курса «Ликбез: коды, исправляющие ошибки» доступны для просмотра по ссылке: …
А именно — представим себе, что мы передаём сигнал из 0 и 1 по каналу, где время от времени возникают помехи, и в результате время от времени вместо 0 приходит 1 или наоборот. Как с этим бороться?
Давайте объединим передаваемые биты в блоки. И пусть блок может быть не любым — а только одним из разрешённых кодовых слов, которые мы постараемся сделать как можно более непохожими друг на друга. Тогда, даже если где-то при передаче произойдёт ошибка — мы сможем её заметить, а может быть, даже исправить.
Например, можно просто дописать к блоку из n битов дополнительный бит контроля чётности, всегда равный сумме предыдущих по модулю 2.
Тогда, если при передаче произойдёт одна ошибка, мы не сможем сказать, где она произошла, но — по крайней мере, мы её заметим (и сможем потом "переспросить" у отправителя этот блок).
Можно просто каждый бит повторять по 3 раза: код {000,111} позволяет не только заметить, но и исправить одну ошибку. Но — скорость канала при этом падает втрое.
А нельзя ли исправить одну ошибку в блоке с меньшим падением скорости? Можно, и самый простой такой код это код Хэмминга.
Да — такие коды (передаваемая информация группируется в блоки фиксированного размера) называются блочными. Ещё — если мы захотим работать с блоками большого размера, то у нас должен получиться большой "алфавит". В общей ситуации его даже просто хранить может быть не очень удобно. Поэтому — есть такой удобный подкласс блочных кодов, линейные коды. У которых разрешённый набор блоков это линейное подпространство в F_2^n.
Матрица, в которую (по строкам — так удобнее) записан базис этого подпространства, называется порождающей матрицей линейного кода.
Если применить метод Гаусса, перевыбрав базис, то можно привести порождающую матрицу к виду
M=(Id_k | что-то);
это будет означать, что первые k бит это собственно передаваемая информация, а оставшиеся n-k это своеобразная "контрольная сумма".
Если применить метод Гаусса, перевыбрав базис, то можно привести порождающую матрицу к виду
M=(Id_k | что-то);
это будет означать, что первые k бит это собственно передаваемая информация, а оставшиеся n-k это своеобразная "контрольная сумма".
Так вот, код Хэмминга — линейный блочный код с кодовым расстоянием (т.е. наименьшим расстоянием между элементами кода), равным 3, и потому позволяет исправить одну ошибку. И вот его порождающая матрица:
Этот код позволяет в блоке длины 7 передать 4 бита, и при этом исправляет одну ошибку.
Стандартный фокус, который с его помощью делается — игра "загадай число от 1 до 15 и ответь на 7 вопросов; отвечая, можно один раз соврать, а я всё равно угадаю загаданное число".
Стандартный фокус, который с его помощью делается — игра "загадай число от 1 до 15 и ответь на 7 вопросов; отвечая, можно один раз соврать, а я всё равно угадаю загаданное число".
Вопросы, разумеется, в виде заранее подготовленных карточек — "есть ли твоё число на этой карточке".
У нас в Ренне обычно среди прочего бывает и такое на стенде математиков на днях науки; дети радостно пользуются разрешением соврать — я помню буквально два-три случая, когда при показе этого фокуса на все вопросы отвечали честно. :)
(Вот тут есть реализация этого на смайликах — 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 не будет нулевой.