Код Рида-Маллера: параметры, построение и декодирование

Коды Рида-Маллера - один из первых семейств линейных блоковых кодов, у которых параметры выводятся прямо из двух чисел и , а декодирование сводится к простому голосованию. Их любят в учебных курсах теории кодирования: на них наглядно видно, как растёт избыточность ради надёжности, и как одна и та же конструкция даёт целую решётку кодов от повторения до проверки на чётность. Ниже разберём, как по и посчитать длину, размерность и кодовое расстояние, откуда берётся рекурсивная схема и как работает мажоритарное декодирование. Чтобы сразу прикинуть параметры для своих и , покрутите калькулятор.
Что такое код Рида-Маллера
Код Рида-Маллера - это двоичный линейный код, кодовые слова которого получаются как значения булевых функций степени не выше от переменных. Каждое кодовое слово - это таблица истинности такой функции, выписанная по всем наборам аргументов. Параметр задаёт число переменных (и тем самым длину блока), а - максимальную степень многочлена, то есть «богатство» кодируемых функций.
Чем больше , тем больше различных функций мы можем закодировать (выше размерность), но тем меньше гарантированное различие между словами (ниже расстояние). Эта пара полностью определяет код: ни таблиц, ни перебора порождающих матриц для вычисления базовых параметров не нужно.
Частные случаи задают «края» семейства. При получается код повторения длины , при - код проверки на чётность, а тесно связан с кодами Адамара. Между этими крайностями лежит вся практическая середина.
Длина, размерность и расстояние
Три ключевых параметра кода считаются по компактным формулам.
Длина блока - это число всех наборов аргументов булевой функции:
Размерность (число информационных бит) равна количеству одночленов степени не выше от переменных, то есть сумме биномиальных коэффициентов:
Минимальное кодовое расстояние, от которого зависит способность исправлять ошибки:

Например, для получаем , и . Это код - он способен исправлять одну ошибку и обнаруживать ещё одну. Скорость кода - ровно половина бит несёт данные, остальное уходит на избыточность ради помехоустойчивости; теоретический предел такой избыточности в зашумлённом канале задаёт формула Шеннона.
Запомните связку: $r$ растёт - размерность $k$ растёт, расстояние $d = 2^{m-r}$ падает вдвое за каждый шаг. Это прямой компромисс между объёмом данных и помехоустойчивостью.
Рекурсивное построение: схема u, u+v
Самый изящный способ строить коды Рида-Маллера - рекурсия Плоткина . Кодовое слово длины собирается из двух половин длины :
Левая половина берётся из кода той же степени , но на единицу меньшей размерности по переменным, а правая половина - это , где приходит из кода степени . Сложение здесь побитовое по модулю 2.
Эта конструкция объясняет рекуррентные соотношения для параметров: длина удваивается (), размерность складывается из размерностей двух меньших кодов, а расстояние нового кода равно меньшему из и - что и даёт ровно .
Базовые случаи рекурсии: - код повторения (всё слово состоит из одинаковых бит), а - полное пространство без избыточности. Раскручивая от этих оснований, можно получить порождающую матрицу любого кода семейства.
Порождающая матрица
Порождающая матрица строится из строк-индикаторов одночленов. Каждая переменная задаёт строку длины , в которой стоит её значение на всех наборах; произведения переменных дают строки для одночленов высших степеней.
Берём все одночлены степени (включая пустое произведение - строку из одних единиц для степени 0) и выписываем их таблицы значений. Совокупность этих строк и есть порождающая матрица. Её строки линейно независимы, поэтому ранг равен размерности .
Удобно, что строки естественно группируются по степеням: одна строка степени 0, строк степени 1, строк степени 2 и так далее. Сумма этих количеств до степени и даёт формулу размерности из предыдущего раздела.
Мажоритарное декодирование
Главная практическая ценность кодов Рида-Маллера - простое декодирование по большинству (мажоритарное, алгоритм Рида). Идея в том, что каждый информационный бит можно восстановить несколькими независимыми способами - через разные «проверочные суммы» принятого слова, - а итоговое значение определяется голосованием.

Декодирование идёт по слоям, от старшей степени к младшей. Для каждого коэффициента старшего одночлена составляется набор проверочных сумм; их у каждого коэффициента ровно , и большинство из них указывает на правильное значение, пока число ошибок не превышает порога. Восстановив старший слой, его вклад вычитают из принятого слова и переходят к следующему слою с меньшей степенью.
Код с расстоянием гарантированно исправляет до
ошибок. Голосование устойчиво, пока ошибок не больше : даже если часть проверок сбита, верное значение остаётся в большинстве. Это устойчивость через избыточность: одно и то же значение подтверждается многими независимыми проверками, и пока ошибок мало, большинство всегда право.
Где применяются
Коды Рида-Маллера ценны там, где нужна простая аппаратная реализация и устойчивость к большому числу ошибок при умеренной скорости. Классический исторический пример - код длины 32, которым кодировались снимки с межпланетной станции «Маринер-9»: он исправлял до 7 ошибок в каждом 32-битном блоке.
Сегодня семейство востребовано в нескольких областях:
- Связь и хранение - там, где канал сильно зашумлён, а декодер должен быть быстрым и дешёвым.
- Теория сложности и криптография - -коды связаны с тестированием функций на близость к многочленам низкой степени.
- Полярные коды - современные полярные коды, принятые в стандарте 5G, родственны кодам Рида-Маллера по структуре рекурсивного построения.
Частые ошибки
- Путают и местами в формулах. Длина зависит только от (), а расстояние - от разности . Поменяв их, получите неверный код.
- Считают расстояние как вместо . Запомните: чем выше степень , тем расстояние меньше, а не больше.
- Забывают слагаемое в сумме для размерности. Степень 0 - это строка из единиц, она всегда входит в базис.
- Берут вместо . При чётном (а у оно всегда степень двойки) число исправляемых ошибок на единицу меньше половины расстояния.
- Считают мажоритарное декодирование единственным. Для выгоднее быстрое преобразование Адамара, оно работает за .
FAQ
Чем код Рида-Маллера отличается от кода Рида-Соломона? Это разные семейства. Код Рида-Маллера двоичный и строится из булевых функций многих переменных; код Рида-Соломона работает над большим полем и опирается на многочлены одной переменной. У них разные применения и разные алгоритмы декодирования.
Какое кодовое расстояние у ? По формуле . Размерность , длина . Получается код , исправляющий одну ошибку.
Почему называют кодом, связанным с Адамаром? Кодовые слова без постоянной составляющей - это строки матрицы Адамара в -форме. Поэтому декодирование сводится к быстрому преобразованию Адамара: ищется строка, наиболее коррелированная с принятым словом.
Коротко
Код Рида-Маллера полностью задаётся парой чисел: длина , размерность , расстояние . Он строится рекурсией Плоткина из меньших кодов, а декодируется голосованием по большинству, исправляя до ошибок. Рост повышает размерность ценой расстояния - это и есть основной компромисс семейства.
Читайте также

Абстрактный класс и интерфейс: в чём отличие
Абстрактный класс и интерфейс: чем отличаются в ООП, когда наследовать поведение, а когда задавать контракт, как выбрать на примерах Java, C# и Python.

Алгоритм AdaBoost: как слабые классификаторы дают сильный
Алгоритм AdaBoost простыми словами: адаптивный бустинг, перевзвешивание объектов, формула веса классификатора, итоговый ансамбль и разбор шага на примере с формулами.

Алгоритм CatBoost: бустинг с обработкой категорий
Алгоритм CatBoost простыми словами: упорядоченный бустинг против сдвига прогноза, кодирование категориальных признаков через ordered target statistics, симметричные деревья и разбор типовых задач.