
pri_cod2
.pdf
Пусть u(x) 2 M(p; n). Предложение 3 позволяет выяснить является ли u(x) кодовым многочленом. Однако удобнее использовать следующий критерий:
Предложение 12 Пусть u(x) 2 M(p; n). Тогда u(x) 2 C(x) тогда и только тогда, когда верно сравнение
u(x)h(x) ´ 0 (mod p; xn ¡ 1):
Доказательство. Пусть u(x) 2 C(x). Тогда найдется многочлен '(x), для которого выполнено сравнение (3). Умножая обе части этого сравнения на h(x), получим
u(x)h(x) ´ (g(x)'(x)) h(x) = (g(x)h(x)) '(x) ´ ´ (xn ¡ 1) ¢ '(x) ´ 0 ¢ '(x) ´ 0 (mod p; xn ¡ 1):
Пусть теперь u(x)h(x) ´ 0 (mod p; xn ¡ 1). Тогда найдется многочлен Ã(x) с коэффициентами из Zp, для которого u(x)h(x) ´ (xn ¡ 1) ¢ Ã(x) (mod p). Так как xn ¡ 1 ´ g(x)h(x) (mod p), после сокращения на h(x) получаем u(x) ´ g(x) ¢ Ã(x) (mod p), откуда u(x) 2 C(x).
Пример 5. Пусть p = 2, n = 3, g(x) = x + 1 и h(x) = x2 + x + 1. Тогда g(x)h(x) = x3 + 2x2 + 2x + 1 ´ x3 ¡ 1 (mod 2). Поэтому g(x) и h(x)
можно принять соответственно за порождающий и проверочный многочлен циклического кода, который обозначим C(x). Пусть u(x) 2 C(x). Тогда u(x) можно записать в виде u(x) = ax2 + bx + c, где a; b; c 2 Z2 = f0; 1g. По предложению 5
u(x) 2 C(x) () (ax2 + bx + c)(x2 + x + 1) ´ 0(mod 2; x3 ¡ 1):
Раскрывая скобки и заменяя x3 на 1 и x4 на x, получим:
u(x) 2 C(x) () a + b + c ´ 0 (mod 2):
Теперь легко заключить, что C(x) = f0; x + 1; x2 + x; x2 + 1g. В векторном представлении C = f000; 011; 110; 101g.
Отметим, что справедливо
51
Предложение 13 Если вместе с каждым кодовым словом линейный код содержит слово, полученное циклическим сдвигом, то код циклический.
3.6Кодирование и декодирование
Пусть задан циклический код C(x), построенный по простому числу p, целому числу n ¸ 2 и многочленам g(x) и h(x), удовлетворяющих сравнению (2). Тогда n является длиной кодовых слов, а степень r = deg g(x) порождающего многочлена g(x) числом информационных разрядов в кодовом слове. Пусть кодируемое сообщение является последовательностью, составленной из элементов поля Zp = f0; 1; : : : ; p ¡1g. Эту последовательность разбивают (слева направо) на блоки длины k. Последний блок может быть неполным (и в этом случае его дополняют нулями до полного блока).
Пусть a = (a0; a1; : : : ; ak¡1) очередной блок длины k кодируемого сообщения. Этому блоку сопоставляют многочен a(x) = a0xk¡1 + a1xk¡2+ + : : : + ak¡2x + ak¡1. Далее возможны два основных способа построения кодового многочлена u(x), соответствующего блоку a.
Способ 1. u(x) вычисляют по формуле
u(x) = a(x) ¢ g(x) (mod p): |
(4) |
Способ 2. u(x) вычисляют по формуле
u(x) = a(x)xr ¡ r(x); |
(5) |
где r(x) остаток при делении многочлена a(x)xr на g(x) (действия с коэффициентами производят по модулю p). При втором способе кодирования первые k коэффициентов многочлена u(x) информационные, остальные r проверочные. При первом же способе любой разряд является отчасти информационным и отчасти проверочным (в отношении k : r).
Коэффициенты многочлена u(x) и передают по каналу связи. Если при передаче не было ошибок, то a(x) можно найти по многочлену u(x) следующим образом:
52

При первом способе кодирования a(x) =
При втором способе кодирования коэффициенты многочлена a(x)это первые k коэффициентов многочлена u(x).
Пример 6. Пусть p = 2, g(x) = x3 + x + 1 и h(x) = x4 + x2 + x + 1. Из равенства g(x)h(x) = x7 +2x5 +2x4 +2x3 +2x2 +2x+1 следует g(x)h(x) ´
´ x7 ¡1 (mod 2), поэтому g(x) можно принять за порождающий многочлен циклического кода, а h(x) за его проверочный многочлен. Число информационных символов k = deg h(x) = 4, число проверочных символов r = deg g(x) = 3, длина кодовых слов n = k + r = 7.
Пусть C(x) соответствующий (бинарный) циклический код и заданы сообщения a1 = (0; 0; 0; 0), a2 = (0; 0; 0; 1) и a2 = (1; 0; 1; 0). Тогда при первом способе кодирования (по формуле (4)) этим сообщениям будут поставлены в соответствие слова 000 0000, 000 1011 и 100 1110, а при втором (по формуле (5)) соответственно слова 000 0000, 000 1011 и 101 0011 (Проверьте это!).
3.7Поиск и исправление ошибок
Пусть по каналу связи передавался многочлен u(x), а на выходе канала получен многочлен v(x) = u(x) + e(x), где e(x) многочлен ошибок.
Для поиска e(x) вычисляют синдром w(x) = h(x)v(x) (mod p; xn ¡ 1) многочлена v(x). Так как u(x) = g(x) '(x) для некоторого многочлена '(x) и g(x) h(x) = xn ¡ 1, получаем
w(x) = h(x)(u(x) + e(x)) = h(x)u(x) + h(x)e(x) = = (xn ¡ 1)'(x) + h(x)e(x) = h(x)e(x) (mod p; xn ¡ 1);
где '(x) некоторый (неизвестный нам) многочлен. Обычно считают, что '(x) нулевой многочлен (иначе должно произойти много ошибок). В этом случае за e(x) принимают дробь wh((xx)), хотя на самом деле
e(x) = |
w(x) |
¡ |
(xn ¡ 1)'(x) |
= |
w(x) |
¡ |
g(x)'(x): |
|
h(x) |
h(x) |
h(x) |
||||||
|
|
|
||||||
|
|
|
53 |
|
|
|
|

Пример 7. Рассмотрим бинарный циклический код из примера 6. Пусть требуется закодировать сообщение a = (1; 1; 1; 0). Этому сообщению соответствует многочлен a(x) = x3 + x2 + x, который кодируется многочленом u(x) = a(x) g(x) = x6 + x2 + x (mod 2) (по первому способу кодирования).
Предположим, что при передаче по каналу связи произошли две ошибки изменилиcь коэффициент при x2 и свободный член, то есть многочлен ошибок e(x) равен x2 + 1. Тогда на выходе из канала связи будет получен многочлен v(x) = u(x) + e(x) = x6 + x + 1. При поиске ошибок вычисляем произведение
v(x) h(x) = x10 + x9 + x8 + x6 + x5 + x2 + x + 1 (mod 2):
По модулю многочлена x7¡1 верно x7 = 1, поэтому синдром w(x) многочлена v(x) это многочлен
w(x) = v(x) h(x) ´ x6 + x5 + x3 + 1 (mod 2; x7 ¡ 1):
Вычислив частное wh((xx)), получим многочлен x2 + 1, который совпадает с многочленом ошибок e(x). Теперь легко найти u(x) = v(x) ¡ e(x).
Замечание. Пусть дл кода из примера 7 многочлен ошибок равен x6. Проделав аналогичные выкладки, получим w(x) = x6 + x3 + x2 + x, откуда = x2 + x. Поэтому многочлен ошибок будет найден неверно. Это связано с тем, что многочлен '(x) в данном случае отличен от нулевого. Таким образом, рассмотренные методы исправления ошибок могут приводить к неверным результатам. Для гарантированного исправления ошибок надо использовать специальные коды. Ниже будут рассмотренные некоторые из таких кодов.
3.8Порождающая и проверочная матрицы
Пусть p простое число. Рассмотрим типичный случай пусть порождающий многочлен g(x) p-ичного циклического кода C(x) ½ M(p; 7) имеет вид
g(x) = g0x4 + g1x3 + g2x2 + g3x + g4;
54
а его проверочный многочлен
h(x) = h0x3 + h1x2 + h2x + h3:
Таким образом, r = 4 и k = 3. Следовательно, длина кодовых слов n = k + r = 7. Кодируемые сообщения имеют вид a = (a0; a1; a2). Указанному сообщению соответствует многочлен a(x) = a0x2 +a1x+a2. Код C(x) состоит из кодовых многочленов вида a(x)g(x). Так как степень a(x) не больше 2, легко проверить, что многочлены g(x), xg(x) и x2g(x) образуют базис подпространства C(x) векторного пространства M(p; 7). Поэтому за порождающую матрицу кода C(x) можно принять
0B g0
G = B 0
B @ 0
g1 |
g2 |
g3 |
g4 |
0 |
0 |
1 |
|
g0 |
g1 |
g2 |
g3 |
g4 |
0 |
C |
: |
0 g0 |
g1 |
g2 |
g3 |
g4 |
C |
|
|
|
|
|
|
|
|
C |
|
|
|
|
|
|
|
A |
|
Пусть u(x) = u0x6 +u1x5 +u2x4 +u3x3 +u4x2 +u5x+u6 произвольный многочлен из кольца M(2; 7). Тогда
u(x) 2 C(x) () h(x) u(x) ´ 0 (mod 2; x7 ¡ 1):
Следовательно, если u(x) 2 C, то все коэффициенты произведения h(x) u(x) равны нулю по модулю многочлена x7 ¡ 1. В частности, равны нулю коэффициенты при x6, x5, x4 и x3, то есть выполнены равенства
8
> h u
> 3 0
>
>
>
> h u
< 3 1
> h u
> 3 2
>
>
>
> h u
: 3 3
+h2u1
+h2u2
+h2u3
+h2u4
+h1u2
+h1u3
+h1u4
+h1u5
+h0u3
+h0u4
+h0u5
+h0u6
= |
0; |
|
|
= |
0; |
(6) |
|
= |
0; |
||
|
|||
= |
0: |
|
В матричном виде это можно записать так: Hut = 0, где
0 h3 h2 |
h1 |
h0 |
0 0 |
0 |
1 |
|
|||
H = B |
0 |
h3 |
h2 |
h1 |
h0 |
0 |
0 |
C |
: |
B |
0 |
0 |
h3 |
h2 |
h1 |
h0 |
0 |
C |
|
B |
|
|
|
|
|
|
|
C |
|
B |
0 |
0 |
0 h3 |
h2 |
h1 |
h0 |
C |
|
|
B |
C |
|
|||||||
B |
|
|
|
|
|
|
|
C |
|
@ |
|
|
|
|
|
|
|
A |
|
Пусть C0 пространство решений системы (6) однородных линейных уравнений. Так как число неизвестных равно 7, а ранг матрицы системы
55
равен 4, заключаем, что размерность пространства C0 равна 7 ¡ 4 = 3. Пусть C ½ V7(Zp) векторное представление циклического кода C(x). Тогда размерность C равна степени проверочного многочлена h(x), то есть 3. Поэтому размерности C и C0 равны. По построению C ½ C0. Поэтому C = C0. Следовательно, H можно принять за проверочную матрицу кода C.
Пример 8. Рассмотрим произведение многочленов g(x) = x2 + 3x + 1 и h(x) = x3 + 2x2 + 3x + 4:
g(x)h(x) = x5 + 5x4 + 10x3 + 15x2 + 15x + 4:
Это произведение сравнимо с многочленом x5 ¡ 1 по модулю 5, поэтому g(x) можно принять за порождающий многочлен пятеричного циклического кода, а h(x) за его проверочный многочлен. Число информационных символов k = deg h(x) = 3, число проверочных символов r = deg g(x) = 2, длина кодовых слов n = k + r = 5. Порождающая и проверочная матрицы этого кода таковы:
|
0 |
1 |
3 |
1 |
0 |
0 |
1 |
|
|
0 |
4 |
3 |
2 |
1 |
0 |
1 |
|
G = |
B |
0 |
1 |
3 |
1 |
0 |
C |
; |
H = |
0 |
4 |
3 |
2 |
1 |
: |
||
|
B |
0 |
0 |
1 |
3 |
1 |
C |
|
|
@ |
|
|
|
|
|
A |
|
|
B |
|
|
|
|
|
C |
|
|
|
|
|
|
|
|
|
|
|
@ |
|
|
|
|
|
A |
|
|
|
|
|
|
|
|
|
|
3.9Один из алгоритмов поиска ошибок
Весом w(u(x)) многочлена u(x) называют число его отличных от нуля коэффициентов. Например, многочлены 2x3 ¡5x+7 и x11 ¡1 имеют, соответственно, веса 3 и 2. Вес многочлена равен нулю тогда и только тогда, когда этот многочлен нулевой.
Пусть C(x) циклический код. Его кодовым расстоянием d(C(x)) называют минимум весов ненулевых кодовых многочленов:
d(C(x)) = minfw(u(x)) : u(x) 2 C(x); u(x) ненулевой многочленg:
Кодовое расстояние циклического кода часто называют также минимальным расстоянием.
56
Пусть C(x) циклический код с порождающим многочленом g(x) и длиной n кодовых слов. Пусть по каналу связи передавался многочлен u(x) и на него наложился многочлен ошибок e(x). Тогда на выходе будет получен многочлен v(x) = u(x) + e(x).
Предложение 14 Пусть d(C(x)) ¸ 2t + 1 и вес многочлена ошибок e(x) не больше t. Пусть при некотором i ¸ 0 вес остатка r(x) при делении xiv(x) на g(x) не больше t. Тогда e(x) ´ xn¡ir(x) (mod xn ¡ 1).
Доказательство. По условию справедливы сравнения
v(x) = u(x) + e(x) ´ 0 + e(x) = e(x) (mod g(x))
и
r(x) ´ xiv(x) (mod g(x)):
Пусть e0(x) остаток при делении xn¡ir(x) на xn ¡ 1. Тогда e0(x) ´ xn¡ir(x) (mod xn ¡ 1):
Так как многочлен xn ¡ 1 делится на g(x), из последнего сравнения получаем
e0(x) ´ xn¡ir(x) (mod g(x)):
Положим f(x) = xi[e(x) ¡ e0(x)]. По модулю многочлена g(x) имеем:
f(x) = xie(x) ¡ xie0(x) ´ xiv(x) ¡ xixn¡ir(x) ´ r(x) ¡ r(x) = 0:
Поэтому f(x) кодовый многочлен. Но тогда и xn¡if(x) = e(x) ¡ e0(x) является кодовым многочленом. При этом его вес не больше суммы весов e(x) и e0(x), то есть не больше 2t. Так как d(C(x)) ¸ 2t + 1, получаем, что e(x)¡e0(x) нулевой многочлен. Теперь заключение предложения очевидно.
3.10Циклический код, исправляющий 1 или 2 ошибки
Пусть C(x) бинарный циклический код с порождающим многочленом g(x) = x8 + x7 + x6 + x4 + 1 и проверочным многочленом h(x) = x7 + x6+ +x4 + 1. Тогда число информационных символов k = deg h(x) = 7, число
57
проверочных символов r = deg g(x) = 8, длина кодовых слов n = k + r = 15. Можно показать, что кодовое расстояние d(C(x)) = 5, поэтому код может исправлять до 2 ошибок.
Пусть кодируемое сообщение a = (1; 0; 1; 1; 0; 1; 0). Этому сообщению сопоставляется многочлен a(x) = x6 + x4 + x3 + x. Применяя первый способ кодирования, вычисляем многочлен
u(x) = g(x) a(x) = x14 + x13 + x10 + x6 + x5 + x4 + x3 + x:
Пусть многочлен ошибок e(x) = x10+x2. Тогда получателю придет многочлен
v(x) = u(x) + e(x) = x14 + x13 + x6 + x5 + x4 + x3 + x2 + x:
Разделив с остатком v(x) на g(x), получим остаток r(x) = x7 + x6 + x5 + x. Теперь подбираем i, удовлетворяющее посылке предложения 8:
i |
xir(x) |
xir(x) (mod g(x)) |
|
|
|
0 |
x7 + x6 + x5 + x |
x7 + x6 + x5 + x |
1 |
x8 + x7 + x6 + x2 |
x4 + x2 + 1 |
2 |
x9 + x8 + x7 + x3 |
x5 + x3 + x |
3 |
x10 + x9 + x8 + x4 |
x6 + x4 + x2 |
4 |
x11 + x10 + x9 + x5 |
x7 + x5 + x3 |
5 |
x12 + x11 + x10 + x6 |
x7 + 1 |
При i = 5 получили многочлен r0(x) = x7 + 1 веса, не большего 2. Остается вычислить
e0(x) = xn¡ir0(x) = x15¡5(x7 + 1) = x17 + x10 ´ x10 + x2 (mod x15 ¡ 1);
что совпадает с многочленом ошибок.
При построении таблицы полезно использовать тот факт, что по модулю многочлена g(x) и (одновременно) по модулю 2 справедливо тождество x8 = x7 + x6 + x4 + 1.
58

3.11Геометрические алгоритмы поиска ошибок
Рассмотрим бинарный циклический код C(x) с длиной кодовых слов n, числом информационных разрядов k и порождающим многочленом g(x). Пусть по каналу связи передавался кодовый многочлен u(x), а на выходе из канала получен многочлен v(x) = u(x) + e(x), где e(x) многочлен ошибок. В [КТТИ, стр. 152] формулируется (без доказательства) следующее предложение:
Предложение 15 Пусть вес t многочлена ошибок e(x) удовлетворяет неравенству t < nk и d(C(x)) ¸ 2t + 1. Тогда все t ошибок можно обнаружить и исправить.
Доказательство. Рассмотрим типичный случай t = 3. В этом случае e(x) можно записать в виде e(x) = xk1 + xk2 + xk3, где 0 · k1 < k2 < k3 < n.
Учитывая предложение 8, достаточно убедиться, что существует такое i, 0 · i < n, для которого вес остатка r(x) при делении xiv(x) на g(x) не больше t. Проверим это.
Так как u(x) кодовый многочлен, найдется многочлен '(x) с коэффициентами из Z2 = f0; 1g, для которого u(x) = g(x)'(x). Поэтому v(x) = = u(x) + e(x) ´ 0 + e(x) = e(x) (mod g(x)), и, следовательно, многочлен r(x) равен остатку при делении xie(x) на g(x).
Рассмотрим правильный n-угольник M. Перенумеруем его вершины числами 0, 1, 2, : : :, n ¡ 1 (в том порядке, в котором вершины встречаются при обходе границы n-угольника M против часовой стрелки). Пусть T треугольник, вершины которого являются вершинами n-угольника M и имеют номера k1, k2 и k3. Вершины n-угольника M, не являющиеся вершинами треугольника, будем называть свободными. Пусть также P1 множество вершин n-угольника M с номерами 0, 1, 2, : : :, n ¡ k ¡ 1, а P2 множество остальных вершин n-угольника M.
Умножение e(x) на x соответствует вращению треугольника T на угол ® = 2n¼ (против часовой стрелки) вокруг центра O n-угольника M. Поэтому
59
треугольник Ti, соответствующий многочлену xie(x), получается из треугольника T путем вращения на угол i ¢ ®.
Так как k число информационных разрядов кода C(x), справедливо равенство deg g(x) = n ¡ k. Если при каком-то i все вершины треугольника Ti попадают во множество P1, то степень многочлена xie(x) меньше n ¡ k, поэтому его остаток при делении на g(x) совпадает с xie(x) и, следовательно, имеет вес, равный t = 3. Поэтому достаточно убедиться, что треугольник T можно повернуть на такой угол i ¢ ® вокруг точки O, что ни одна вершина треугольника полученного в результате вращения треугольника Ti не попадет во множество P2. Проверим это.
Ясно, что число вершин во множестве P2 равно k. Поэтому достаточно убедиться в том, что между какими-то вершинами треугольника T находится не менее k вершин n-угольника M. Проверим это.
Вершины треугольника T разбивают границу n-угольника M на три ломаных L1, L2 и L3. Пусть на этих ломаных располагается ¾1, ¾2 и ¾3 свободных вершин n-угольника соответственно. Общее число свободных вершин n-угольника M равно n¡3, поэтому ¾1 +¾2 +¾3 = n¡3. Из неравенства
t < nk при t = 3 получаем n > 3k. Допустим, что ¾j · k ¡ 1 при j = 1; 2; 3. Тогда n = ¾1 + ¾2 + ¾3 + 3 · 3(k ¡ 1) + 3 = 3k. Противоречие с неравенством
n > 3k показывает, что ¾j ¸ k при некотором j. Теперь остается повернуть треугольник T на такой угол ® ¢i, что все вершины из множества P2 попадут на образ той ломаной Lj, на которой располагается ¾j свободных вершин n угольника. Предложение доказано.
Предложение 9 применимо только к кодам с низкой скоростью передачи (напомним, что скорость передачи R равна отношению nk ) Например, при t = 3 информационные разряды должны составлять менее трети общего числа рарядов кодового слова. Однако использованный при доказательстве предложения метод позволяет строить коды с высокой корректирующей способностью и большой скоростью передачи. Рассмотрим один из таких кодов. Этот код позволяет обнаруживать и исправлять до 3 ошибок в кодовом слове.
60