Открыть сервис

Коды Рида — Соломона

Коды Рида — Соломона — это класс недвоичных циклических кодов, исправляющих ошибки, построенных на основе конечных полей (полей Галуа). Они относятся к помехоустойчивым кодам и широко применяются в системах хранения и передачи данных для обнаружения и коррекции пакетов ошибок. Коды Рида — Соломона являются подклассом кодов Боуза — Чоудхури — Хоквингема (БЧХ-кодов) и обладают свойством максимального расстояния (MDS-коды), что означает достижение границы Синглтона для заданных параметров.

Коды были предложены в 1960 году американскими математиками Ирвингом Ридом и Густавом Соломоном в статье «Polynomial Codes over Certain Finite Fields». Первоначально они рассматривались как неэффективные для практического применения из-за сложности декодирования, однако с развитием вычислительной техники и появлением эффективных алгоритмов (например, алгоритма Берлекэмпа — Месси) коды Рида — Соломона стали одними из самых распространённых помехоустойчивых кодов.

Математические основы

Конечные поля

Коды Рида — Соломона определены над конечным полем \(\mathbb{F}_q\), где \(q = p^m\) — степень простого числа \(p\). Наиболее часто используются поля характеристики 2, в частности \(\mathbb{F}_{256}\) (байтовые поля), что удобно для цифровой обработки данных. Элементы поля представляются как многочлены степени не выше \(m-1\) над \(\mathbb{F}_p\), арифметика выполняется по модулю неприводимого многочлена степени \(m\).

Параметры кода

Код Рида — Соломона обозначается как \((n, k, d)\), где:

Код может исправлять до \(t = \lfloor (d-1)/2 \rfloor\) ошибок в кодовом слове, а также обнаруживать до \(d-1\) ошибок. Например, код \((255, 223, 33)\) над \(\mathbb{F}_{256}\) исправляет до 16 ошибок в блоке из 255 байт.

Порождающий многочлен

Код Рида — Соломона является циклическим, поэтому его кодовые слова — это многочлены степени не выше \(n-1\), кратные порождающему многочлену \(g(x)\) степени \(n-k\). Порождающий многочлен строится как произведение минимальных многочленов элементов поля, образующих последовательность корней:

\[ g(x) = (x - \alpha^b)(x - \alpha^{b+1}) \cdots (x - \alpha^{b+d-2}), \]

где \(\alpha\) — примитивный элемент поля \(\mathbb{F}_q\), а \(b\) — целое число (часто \(b = 1\) или \(b = 0\)). Все корни \(g(x)\) лежат в расширении поля \(\mathbb{F}_q\).

Кодирование

Кодирование для кодов Рида — Соломона может выполняться двумя основными способами: систематическим и несистематическим.

Систематическое кодирование

При систематическом кодировании информационные символы остаются в явном виде в начале кодового слова, а проверочные символы добавляются в конец. Кодовый многочлен \(c(x)\) получается умножением информационного многочлена \(m(x)\) степени не выше \(k-1\) на \(x^{n-k}\) и последующим делением на \(g(x)\):

\[ c(x) = m(x) \cdot x^{n-k} + \text{remainder}\left( \frac{m(x) \cdot x^{n-k}}{g(x)} \right). \]

Остаток от деления даёт проверочные символы. Этот метод широко используется на практике, так как упрощает выделение информационной части при декодировании.

Несистематическое кодирование

В несистематическом варианте кодовое слово получается прямым умножением информационного многочлена на порождающий: \(c(x) = m(x) \cdot g(x)\). Такой подход менее удобен, так как информационные символы не выделены явно.

Декодирование

Декодирование кодов Рида — Соломона является более сложной задачей, чем кодирование. Наиболее известные алгоритмы декодирования включают:

Алгоритм Питерсона — Горенстейна — Цирлера

Этот алгоритм применим для кодов с небольшим числом исправляемых ошибок (до 10—15). Он основан на решении системы линейных уравнений для нахождения синдрома ошибки и последующем нахождении локаторов и значений ошибок с помощью алгоритма Форни. Этапы:

  1. Вычисление синдрома \(S_j = r(\alpha^j)\) для \(j = b, b+1, \dots, b+d-2\), где \(r(x)\) — принятый многочлен.
  2. Построение многочлена локаторов ошибок \(\Lambda(x)\) через решение системы уравнений.
  3. Нахождение корней \(\Lambda(x)\) (локаторов ошибок) методом Ченя.
  4. Вычисление значений ошибок по алгоритму Форни.
  5. Исправление ошибок.

Алгоритм Берлекэмпа — Месси

Этот итеративный алгоритм более эффективен для кодов с большим числом ошибок (до 20—30). Он строит многочлен локаторов ошибок \(\Lambda(x)\) минимальной степени, удовлетворяющий рекуррентным соотношениям синдрома. Алгоритм имеет сложность \(O(t^2)\) и широко применяется в современных системах.

Алгоритм Сугиямы

Для кодов с очень большим числом ошибок (например, в системах хранения данных) используются алгоритмы на основе преобразования Фурье в конечных полях, такие как алгоритм Сугиямы, имеющий сложность \(O(n \log n)\).

Применение

Коды Рида — Соломона нашли широкое применение в различных областях благодаря способности эффективно исправлять пакеты ошибок.

Хранение данных

Передача данных

Космическая связь

Криптография и информационная безопасность

Варианты и обобщения

Расширенные коды Рида — Соломона

Расширенные коды имеют длину \(n = q\) (добавляется один дополнительный символ) и минимальное расстояние \(d = n - k + 1\) или \(d = n - k + 2\). Они используются в некоторых стандартах, например, в коде (256, 252, 5) для защиты памяти.

Коды Рида — Соломона с усечением

На практике часто применяются усечённые коды, когда длина кодового слова меньше максимально возможной. Например, код (204, 188) в DVB-T является усечённым вариантом кода (255, 239).

Коды Рида — Соломона в каскадных схемах

Коды Рида — Соломона часто используются как внешние коды в каскадных конструкциях, где внутренним кодом является свёрточный код или код с малой плотностью проверок на чётность (LDPC). Такая схема применяется в стандартах DVB-S2 и CCSDS.

Ограничения

Несмотря на широкое применение, коды Рида — Соломона имеют ряд недостатков:

Историческая справка

В 1960 году Ирвинг Рид и Густав Соломон опубликовали статью, в которой предложили новый класс кодов. Первоначально коды считались непрактичными из-за отсутствия эффективных алгоритмов декодирования. В 1969 году Элвин Берлекэмп разработал алгоритм факторизации многочленов, а в 1975 году Джеймс Месси предложил итеративный алгоритм декодирования, что сделало коды Рида — Соломона пригодными для практического использования. В 1980-х годах коды начали массово применяться в оптических носителях и спутниковой связи. В России коды Рида — Соломона изучались в рамках теории помехоустойчивого кодирования в МГУ им. М. В. Ломоносова и Институте проблем передачи информации РАН.

Источники

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →