Циклический код

Материал из testwiki
Перейти к навигации Перейти к поиску

Шаблон:Нет источников Циклический код — линейный, блочный код, обладающий свойством цикличности, то есть каждая циклическая перестановка кодового слова также является кодовым словом. Используется для преобразования информации для защиты её от ошибок (см. Обнаружение и исправление ошибок).

Введение

Пусть y‾=(y0,y1,…,yn−1)∈Ln — слово длины n над алфавитом из элементов конечного поля L=GF(q) и y(x)=y0+y1x+y2x2+…+yn−1xn−1 — полином, соответствующий этому слову, от формальной переменной x. Видно, что это соответствие является изоморфизмом линейных пространств. Так как «слова» состоят из букв из поля, то их можно складывать и умножать (поэлементно), причём результат будет в том же поле. Полином, соответствующий линейной комбинации y‾=m1y1‾+m2y2‾ пары слов y1‾=(y1,0,…,y1,n−1) и y2‾=(y2,0,…,y2,n−1), равен линейной комбинации полиномов этих слов y(x)=∑k=0n−1(m1y1k+m2y2k)xk=m1y1‾(x)+m2y2‾(x).

Это позволяет рассматривать множество слов длины n над конечным полем как линейное пространство полиномов со степенью не выше n − 1 над полем GF(q).

Алгебраическое описание

Если c1→ — кодовое слово, получающееся циклическим сдвигом на один разряд влево из слова c→, то соответствующий ему полином c1(x) получается из предыдущего умножением на x:

c1(x)=xc(x)mod(xn−1), пользуясь тем, что xn≡1mod(xn−1).

Сдвиг вправо и влево соответственно на j разрядов:

cj(x)=xjc(x)mod(xn−1),
c−j(x)xj=c(x)mod(xn−1).

Если m(x) — произвольный полином над полем GF(q), и c(x) — кодовое слово циклического (n,k) кода, то m(x)c(x)mod(xn−1) — тоже кодовое слово этого кода.

Порождающий полином

Определение

Порождающим полиномом циклического (n,k) кода C называется такой ненулевой полином g(x)=∑i=0rgixi из C, степень которого наименьшая, и коэффициент при старшей степени gr=1.

Теорема 1

Если C — циклический (n,k) код, и g(x) — его порождающий полином, то степень g(x) равна r=n−k, и каждое кодовое слово может быть единственным образом представлено в виде

c(x)=m(x)g(x),

где степень m(x) меньше или равна k−1.

Теорема 2

g(x) — порождающий полином циклического (n,k) кода — является делителем двучлена xn−1.

Следствия

Таким образом, в качестве порождающего полинома можно выбирать любой полином делитель xn−1. Степень выбранного полинома будет определять количество проверочных символов r, число информационных символов k=n−r.

Порождающая матрица

Полиномы g(x),xg(x),x2g(x),…,xk−1g(x) линейно независимы, иначе m(x)g(x)=0 при ненулевом m(x), что невозможно.

Значит кодовые слова можно записывать, как и для линейных кодов, следующим образом:

m‾G=(m0,m1,…,mk−1)[g(x)xg(x)…xk−1g(x)]=m(x)g(x),

где G является порождающей матрицей, m(x) — информационным полиномом.

Матрицу G можно записать в символьной форме:

G=[g0g1…gr−1gr0…00g0…gr−2gr−1gr…0⋮⋮⋱⋮⋮⋮⋱⋮00…0g0g1…gr].

Проверочная матрица

Для каждого кодового слова циклического кода справедливо c(x)=0modg(x). Поэтому проверочную матрицу можно записать как

H=[1xx2…xn−2xn−1]modg(x).

Тогда

c‾HT=∑i=0n−1cixi=0modg(x).

Кодирование

Несистематическое

При несистематическом кодировании кодовое слово получается в виде произведения информационного полинома на порождающий:

c(x)=m(x)g(x).

Оно может быть реализовано при помощи перемножения полиномов.

Систематическое

При систематическом кодировании кодовое слово формируется в виде информационного подблока и проверочного:

c(x)=[s(x)m(x)].

Пусть информационное слово образует старшие степени кодового слова, тогда

c(x)=xrm(x)+s(x),r=n−k.

Тогда из условия c(x)=xrm(x)+s(x)=0modg(x) следует

s(x)=−xrm(x)modg(x).

Это уравнение и задаёт правило систематического кодирования. Оно может быть реализовано при помощи многотактных линейных фильтров (МЛФ).

Примеры

Двоичный (7,4,3) код

В качестве делителя x7−1 выберем порождающий полином третьей степени g(x)=x3+x+1, тогда полученный код будет иметь длину n=7, число проверочных символов (степень порождающего полинома) r=3, число информационных символов k=4, минимальное расстояние d=3.

Порождающая матрица кода:

G=[1101000011010000110100001101],

где первая строка представляет собой запись полинома g(x) коэффициентами по возрастанию степени.

Остальные строки — циклические сдвиги первой строки.

Проверочная матрица:

H=[100101101011100010111],

где i-й столбец, начиная с 1-го, представляет собой остаток от деления xi−1 на полином g(x), записанный по возрастанию степеней, начиная сверху.

Так, например, 4-й столбец получается h4(x)=x3modg(x)=x+1, или в векторной записи [110].

Легко убедиться, что GHT=0.

Двоичный (15,7,5) БЧХ код

В качестве порождающего полинома g(x) можно выбрать произведение двух делителей x15−1:

g(x)=g1(x)g2(x)=(x4+x+1)(x4+x3+x2+x+1)=x8+x7+x6+x4+1.

Тогда каждое кодовое слово можно получить с помощью произведения информационного полинома m(x) со степенью k−1 таким образом:

c(x)=m(x)g(x).

Например, информационному слову m‾=[1000111] соответствует полином m(x)=x6+x5+x4+1, тогда кодовое слово c(x)=(x6+x5+x4+1)(x8+x7+x6+x4+1)=x14+x12+x9+x7+x5+1, или в векторном виде c‾=[100001010100101].

См. также

Ссылки