МИНИСТЕРСТВО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ УРАЛЬСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ кафедра молекулярной физики МЕТОДИЧЕСКИЕ УКАЗАНИЯ К ЛАБОРАТОРНОЙ РАБОТЕ ПОМЕХОЗАЩИЩЕННОЕ КОДИРОВАНИЕ. КОДЫ БОУЗА-ЧОУДХУРИ-ХОККЕНГЕМА ПО КУРСУ «ТЕОРИЯ ИНФОРМАЦИИ» Екатеринбург 2016 УДК 774:002:006.354 Составители: Н.В. Бородулин, О. Е. Александров. Научный редактор: канд. физ.-мат. наук О. Е. Александров ПОМЕХОЗАЩИЩЕННОЕ КОДИРОВАНИЕ. Коды Боуза-ЧоудхуриХоккенгема: Методические указания к лабораторной работе / Н.В. Бородулин, О. Е. Александров. Екатеринбург: УГТУ-УПИ, 2009. 55 с. Представлены методические материалы для изучения помехозащищённого кодирования БЧХ. Сделан обзор методов помехозащищённого кодирования. Приведена классификация помехоустойчивых кодов. Кратко изложена теория кодов Боуза-ЧоудхуриХоккенгема (БЧХ). Подробно описан алгоритм построения кода БЧХ. Описана практическая реализация генерации порождающего полинома кодов БЧХ и процесса кодирования. Разработана в среде MathCAD демонстрационная программа построения произвольного кода БЧХ, реализующая пошаговый процесс создания порождающего многочлена кода БЧХ для произвольных исходных параметров (длина кода, количество исправляемых ошибок). Исходный код программы для лабораторной работы доступен по адресу «http://mp.ustu.ru/InformationTheory». Библиогр. 1 назв. Рис. 6. Табл. 3. Прил. 1. Подготовлено кафедрой «Молекулярная физика». © Содержание, оформление: Александров О.Е., 2010 3 СОДЕРЖАНИЕ ПЕРЕЧЕНЬ УСЛОВНЫХ ОБОЗНАЧЕНИЙ СИМВОЛОВ, ЕДИНИЦ И ТЕРМИНОВ ........................................................................................................... 5 1. ОСНОВЫ ПОМЕХОЗАЩИЩЕННОГО КОДИРОВАНИЯ ................................ 7 1.1. Основные определения ................................................................................ 7 1.2. Избыточность – основная идея помехозащищенного кодирования ................................................................................................... 8 1.3. Приложения помехозащищённого кодирования ....................................... 9 1.3. Систематизация кодов, контролирующих ошибки ................................. 10 2. ОПИСАНИЕ БЧХ-КОДИРОВАНИЯ ................................................................... 16 2.1. Конечное поле............................................................................................. 16 2.2. Проверка неприводимости многочлена. Алгоритм Леопольда Кронекера .................................................................................................... 19 2.3. БЧХ-код ....................................................................................................... 19 2.3.1. Поиск порождающего многочлена ................................................ 20 2.3.2. Выбор параметров кода БЧХ ......................................................... 20 2.3.3. Построение конечного поля ........................................................... 21 2.3.4. Поиск примитивного элемента и построение циклотомических классов ................................................................... 21 2.3.5. Построение порождающего многочлена БЧХ ............................. 22 2.4. Декодирование кодов БЧХ ........................................................................ 22 3. ОПИСАНИЕ РЕАЛИЗАЦИИ ДЕМОНСТРАЦИОННОГО БЧХКОДИРОВАНИЯ ................................................................................................. 23 3.1. Представление чисел в разрядности по произвольному основанию ................................................................................................... 23 3.2. Функции операций с многочленами ........................................................ 25 3.3. Функции поиска делителей ....................................................................... 30 3.4. Функции поиска комбинаций.................................................................... 31 3.5. Вспомогательные функции для алгоритма Кронекера. .......................... 32 3.5. Поиск неприводимых многочленов алгоритмом Кронекера ................. 34 3.7. Функции умножения и сложения в поле GF(q) ...................................... 36 3.7. Функции построения полей ...................................................................... 37 4. КРАТКОЕ ОПИСАНИЕ ПРОГРАММЫ.............................................................. 45 4.1. Начало программы ..................................................................................... 45 4.2. Ввод данных................................................................................................ 47 4 4.3. Получение порождающего многочлена ................................................... 49 4.4. Конец программы ....................................................................................... 50 1. ЗАДАНИЕ ДЛЯ САМОСТОЯТЕЛЬНОГО ВЫПОЛНЕНИЯ ........................... 51 5.1. Общие змечания ......................................................................................... 51 5.2. Варианты заданий ...................................................................................... 51 5.3. Оформление результатов работы .............................................................. 52 5.4. Прием зачета по результатам работы ....................................................... 53 ЗАКЛЮЧЕНИЕ ......................................................................................................... 53 5 ПЕРЕЧЕНЬ УСЛОВНЫХ ОБОЗНАЧЕНИЙ СИМВОЛОВ, ЕДИНИЦ И ТЕРМИНОВ 0111b – суффикс «b» означает число, записанное по основанию 2 — двоичное число; 0ABCh – суффикс «h» означает число, записанное по основанию 16 — шестнадцатиричное число; 111. – суффикс «.» означает число, записанное по основанию 10 — десятичное число; N1..N2 – диапазон целых чисел от N1 до N2; [X1..X2) – интервал чисел от X1 до X2, X1 принадлежит интервалу, X2 – не принадлежит; Сигнал — любая функция времени, в частности, любая последовательность чисел. Любой сигнал может быть представлен в двоичной форме, как некоторая последовательность битов, например: 100101010111010101... Именно такую последовательность битов мы будем называть «сигналом» далее. Существуют недвоичные сигналы, но ниже они не рассматриваются. Код — форма представления сигнала, не зависящая от его физической сути. Кодирование сигнала — преобразование одной последовательности битов в другую последовательность битов, допускающую восстановление исходной последовательности битов без искажений. Блок кода — кусок сигнала, обычно двоичного, фиксированной длины. Кодовое слово — значение, допустимое в качестве значения блока кода. Блочный код — способ кодирования, когда блок кода преобразуется в блок кода другой длины. Вес двоичного кодового слова — число разрядов двоичного кодового слова равных 1. Расстояние между двумя двоичными кодовыми словами (расстояние Хэмминга) — число разрядов в которых эти два слова различаются. Ошибки — случайные искажения битов сигнала при передаче или хранении. Кратность ошибки — число искаженных битов в блоке кода. Помехозащищенное кодирование — кодирование сигнала, позволяющее восстановить без искажений исходный сигнал при ограниченных искажениях кодированной последовательности бит. Это может быть достигнуто только передачей дополнительных бит, т.е. помехозащищенный сигнал всегда длиннее чем исходный сигнал. 6 Совершенный код — тип блочного помехозащищенного кода, для которого количество дополнительных бит помехозащищенного сигнала минимально для исправления всех ошибок, не превышающих заданную кратность. Совершенный код исправляет все ошибки кратности не превосходящей k и никаких других. Квазисовершенный код —код исправляет все ошибки кратности не превосходящей k и некоторые ошибки кратности k + 1. 7 ВВЕДЕНИЕ Современный этап развития общества характеризуется ростом количества разнообразной информации. Растет количество информации, растут объемы информации, которые передаются от одного компьютера к другому. Вместе с тем, при передаче информации важна не только скорость передачи, но и ее достоверность: чтобы информация при передаче не исказилась и получатель получил те данные, которые отправил ему отправитель. В данной работе рассмотрены методы помехозащищенного кодирования, в частности подробно описаны коды Боуза-ЧоудхуриХоккенгема, далее БЧХ-коды. В работе описана область применения и классификация помехозащищенного кодирования. Описаны коды БЧХ и алгоритм их построения для заданных параметров кода. Демонстрационная программа в пакете MathCAD, наглядно иллюстрирует построение порождающего многочлена кода БЧХ и кодирование произвольных данных методом БЧХ. Вопросы декодирования кодов БЧХ (в части применения эффективных методов декодирования БЧХ-кодов) остались нерассмотренными в силу недостатка времени. Однако, для декодирования кодов БЧХ могут применяться общие схемы декодирования блочных кодов, например, табличное декодирование. 1. ОСНОВЫ ПОМЕХОЗАЩИЩЕННОГО КОДИРОВАНИЯ 1.1. ОСНОВНЫЕ ОПРЕДЕЛЕНИЯ Под кодированием в общем случае понимают преобразование алфавита сообщения A{λi}, (i = 1,2…K) в алфавит некоторым образом выбранных кодовых символов R{xj}, (j = 1,2…N). Кодирование сообщений может преследовать различные цели - сокращение объема передаваемых данных (сжатие данных), увеличение количества передаваемой за единицу времени информации, повышение достоверности передачи, обеспечение секретности при передаче и т.д. 8 При передаче информации по каналу связи с помехами в принятых данных могут возникать ошибки. Помехоустойчивое кодирование, представляет собой способ обработки передаваемых данных, обеспечивающий уменьшение вероятности ошибок, возникающих в процессе передачи по каналу с помехами. Существуют различные методы помехоустойчивого кодирования информации, но все они основаны на следующем: при помехоустойчивом кодировании в передаваемые сообщения вносится специальным образом организованная избыточность (в передаваемые кодовые последовательности добавляются избыточные символы), позволяющая на приемной стороне обнаруживать и исправлять возникающие ошибки. 1.2. ИЗБЫТОЧНОСТЬ – ОСНОВНАЯ ИДЕЯ ПОМЕХОЗАЩИЩЕННОГО КОДИРОВАНИЯ Почему невозможно обнаружить ошибку, если передаются данные без избыточности? Это можно проиллюстрировать на примере двоичных данных так. Данные «без избыточности» означают что все значения всех битов задействованы для передачи, т.е., например, если передаются двухбитовые блоки, то возможны следующие сочетания битов: {(0, 0), (0, 1), (1, 0), (1, 1)}. Что означает каждое их этих сочетаний абсолютно неважно, важно только то, что любое из них может встретиться в передаваемых данных. Если какоелибо сочетание из двух бит не используется, то это значит вместо допустимых четырех значений можно передается только три, а одно «не используется» – т.е. избыточно. Если неиспользуемых значений нет – значит и избыточности нет. Допустим, предается значение (0, 0) и допустимы все значения (избыточности нет). В этом случае приемник из-за помех может получить, например, (0, 1). Может ли приемник определить, что имела место ошибка? Нет, не может, ибо все значения и, в том числе, (0, 1) – допустимы. Пусть наоборот, используется (допустимы) только два значения {(0, 0), (1, 1)}. Тогда при получении (0, 1) приемник может определить, что принято недопустимое значение, следовательно, имела место ошибка. Таким образом, при наличии избыточности возникает возможность детектировать ошибку. Как можно организовать избыточность данных? Это достаточно просто – к блоку исходных данных можно просто приписать произвольное количество бит. Один из простейших вариантов – передать исходные данные дважды (или трижды), например, для исходных блоков {(0, 0), (0, 1), (1, 0), (1, 1)} двойной повтор приведет к следующим кодированным блокам {(0, 0, 0, 0), (0, 1, 0, 1), (1, 0, 1, 0), (1, 1, 1, 1)} Однако само по себе наличие избыточности – недостаточно. Необходима «предсказуемая» избыточность, т.е. обладающая определенными 9 свойствами. Главная характеристика такой избыточности – минимальность избыточности, т.е. минимум дополнительных бит. Построение именно таких минимально-избыточных кодов и есть задача теории. 1.3. ПРИЛОЖЕНИЯ ПОМЕХОЗАЩИЩЁННОГО КОДИРОВАНИЯ Так как развитие кодов, контролирующих ошибки, первоначально стимулировалось задачами связи, терминология теории кодирования проистекает из теории связи. Построенные коды, однако, имеют много других приложений. Коды используются для защиты данных в памяти вычислительных устройств и на цифровых лентах и дисках, а также для защиты от неправильного функционирования или шумов в цифровых логических цепях. Приложения к задачам связи носят самый различный характер. Двоичные данные обычно передаются между вычислительными терминалами, между летательными аппаратами и между спутниками. Коды могут быть использованы для получения надежной связи даже тогда, когда мощность принимаемого сигнала близка к мощности тепловых шумов. И поскольку электромагнитный спектр все больше и больше заполняется создаваемым человеком сигналами, коды, контролирующие ошибки, становятся еще более важным инструментом, так как позволяют линиям связи надежно работать при наличии интерференции. В военных приложениях такие коды часто используются для защиты против намеренно организованной противником интерференции. Во многих системах связи имеется ограничение на передаваемую мощность. Например, в системах ретрансляции через спутники увеличение мощности обходится очень дорого. Коды, контролирующие ошибки, являются замечательным средством снижения необходимой мощности, так как с их помощью можно правильно восстановить полученные ослабленные сообщения. Передача в вычислительных системах обычно чувствительна даже к очень малой доле ошибок, так как одиночная ошибка может нарушить программу вычисления. Кодирование, контролирующее ошибки, становится в этих приложениях весьма важным. Для некоторых носителей вычислительной памяти использование кодов, контролирующих ошибки, позволяет добиться более плотной упаковки битов. Другим типом систем связи является система с многими пользователями и разделением по времени, в которой каждому из данного числа пользователей заранее предписаны некоторые временные окна (интервалы), в которых ему разрешается передача. Длинные двоичные 10 сообщения разделяются на пакеты, и один пакет передается в отведенное временное окно. Из-за нарушения синхронизации или дисциплины обслуживания некоторые пакеты могут быть утеряны. Подходящие коды, контролирующие ошибки, защищают от таких потерь, так как утерянные пакеты можно восстановить по известным пакетам. Связь важна также внутри одной системы. В современных сложных цифровых системах могут возникнуть большие потоки данных между подсистемами. Цифровые автопилоты, цифровые системы управления процессами, цифровые переключательные системы и цифровые системы обработки радарных сигналов - все это системы, содержащие большие массивы цифровых данных, которые должны быть распределены между многими взаимно связанными подсистемами. Эти данные должны быть переданы или по специально предназначенным для этого линиям, или посредством более сложных систем с шинами передачи данных и с кодированием, контролирующим ошибки, будут играть центральную роль. 1.3. СИСТЕМАТИЗАЦИЯ КОДОВ, КОНТРОЛИРУЮЩИХ ОШИБКИ Что такое информация? Чем измерять ее количество? Клоду Элвуду Шеннону, американскому математику, создателю математической теории информации пришлось ответить на эти вопросы еще до того, как он приступил к исследованиям пропускной способности каналов связи. В своих работах 1948-49 годов он определил количество информации через энтропию — величину, известную в термодинамике и статистической физике как меру разупорядоченности системы, а за единицу информации принял то, что впоследствии окрестили "битом", то есть выбор одного из двух равновероятных вариантов. Позже Шеннон любил рассказывать, что использовать энтропию ему посоветовал знаменитый математик Джон фон Нейман, который мотивировал свой совет тем, что мало кто из математиков и инженеров знает об энтропии, и это обеспечит Шеннону большое преимущество в неизбежных спорах. Шутка это или нет, но как трудно нам теперь представить, что всего полвека назад понятие "количество информации" еще нуждалось в строгом определении и что это определение могло вызвать какие-то споры. На прочном фундаменте своего определения количества информации Клод Шеннон доказал удивительную теорему о пропускной способности зашумленных каналов связи. Во всей полноте эта теорема была опубликована в его работах 1957-61 годов и теперь носит его имя. В чем суть теоремы Шеннона? Всякий зашумленный канал связи характеризуется своей предельной скоростью передачи информации, называемой пределом 11 Шеннона. При скоростях передачи выше этого предела неизбежны ошибки в передаваемой информации. Зато снизу к этому пределу можно подойти сколь угодно близко, обеспечивая соответствующим кодированием информации сколь угодно малую вероятность ошибки при любой зашумленности канала. На рисунке 1 приведены типы кодов, различающиеся по особенностям структуры, функциональному назначению, физическим свойствам кода как сигнала. РИС.1. КЛАССИФИКАЦИЯ ПОМЕХОУСТОЙЧИВЫХ КОДОВ Известно большое количество кодов, систематизация и классификация которых из-за их многочисленных признаков являются довольно затруднительными. Поэтому в основу классификации положим структурные характеристики кодов. Коды можно разделить на две самостоятельные группы. К первой относятся коды, использующие все возможные комбинации, - неизбыточные коды. В литературе их ещё называют простыми или первичными. Ко второй группе относятся коды, использующие лишь определённую часть всех возможных комбинаций. Такие коды называются избыточными. Оставшаяся часть комбинаций используется для обнаружения или исправления ошибок, возникающих при передаче сообщений. В этих кодах количество разрядов кодовых комбинаций можно условно разделить на определённое число разрядов, предназначенных для информации (информационные разряды), и число разрядов, предназначенных для коррекции ошибок (проверочные разряды). Обе группы кодов, в свою очередь, подразделяются на равномерные и неравномерные. Равномерные коды – это коды, все кодовые комбинации 12 которых содержат постоянное количество разрядов. Неравномерные коды содержат кодовые комбинации с различным числом разрядов. Неравномерные избыточные коды не нашли применения на практике из-за сложности их технической реализации. Классическими примерами неравномерного кода являются код Морзе, широко применяемый в телеграфии, и код Хаффмена, применяемый для компрессии информации (факсимильная связь, ЭВМ). Никаких специальных мер по исправлению и обнаружению ошибок в коде Морзе не предусматривается в связи с большой избыточностью самого передаваемого текста. Все избыточные коды разделяют на два класса: непрерывные (рекуррентные) и блочные. В непрерывных кодах процесс кодирования и декодирования носит непрерывный характер. Непрерывные или рекуррентные коды образуют последовательность символов, не разделяемую на отдельные кодовые комбинации. Формирование проверочных символов ведётся по рекуррентным (возвратным) правилам, поэтому непрерывные коды часто называют рекуррентными или цепными. В простейшем цепном коде каждый проверочный элемент формируется путём сложения по модулю 2 соседних или отстоящих друг от друга на определённое число позиций информационных элементов. В канал связи передаётся последовательность импульсов, в которой за каждым информационным следует проверочный. Подобную чередующуюся последовательность разрядов имеет, например, корреляционный манчестерский код. К непрерывным кодам относятся и свёрточные коды, в которых каждый информационный символ, поступающий на вход кодирующего устройства, вызывает появление на его выходеё ряда проверочных элементов, образованных суммированием по модулю 2 данного символа и " k-1 " предыдущих информационных символов. Свёрточные коды эффективно работают в канале с белым шумом, но плохо справляются с пачками ошибок. Более того, если декодер ошибается, на его выходе всегда возникает пачка ошибок. Рекуррентные коды позволяют исправлять групповые ошибки в каналах связи. В блочных кодах каждому сообщению соответствует кодовая комбинация (блок) из n символов. Блоки кодируются и декодируются отдельно друг от друга. Избыточные коды, в которых определённые разряды кодовых комбинаций отводятся для информационных и проверочных символов, называются разделимыми. Разделимые блочные коды обозначаются обычно (n,k) – кодами, где n – количество разрядов кодовой комбинации, k – число 13 разрядов, отводимых для информационных символов. Неразделимые коды не имеют чёткого разделения кодовой комбинации на информационные и проверочные символы. К ним относятся коды с постоянным весом и коды Плоткина. Разделимые блочные коды, в свою очередь, делятся на несистематические и систематические. В несистематических кодах проверочные символы представляют собой суммы подблоков с L разрядами, на которые разделена последовательность информационных символов. К этим кодам относятся коды Бергера. Другим примером несистематического кода является код с контрольным суммированием - итеративный код. В этом коде проверочные разряды формируются в результате суммирования значений разрядов как в данной кодовой комбинации, так и одноимённых разрядов в ряде соседних с ней комбинаций, образующих совместный блок. Кодовое расстояние (расстояние Хэмминга) между словами a и b определяется как число несовпадающих символов в этих словах, например: a = 10110, b = 11011, здесь расстояние равно d(a, b) = 3. Итеративные коды позволяют получить так называемые мощные коды, т.е. коды с длинными блоками и большим кодовым расстоянием при сравнительно простой процедуре декодирования. Итеративные коды могут строиться как комбинационные, посредством произведения двух или более систематических кодов. К комбинационным кодам можно отнести также антифединговые коды, предназначенные для обнаружения и исправления ошибок в каналах с замираниями (федингом) сигналов. Для таких каналов с группированием ошибок применяют метод перемежения символов или декорреляции ошибок. Он заключается в том, что символы, входящие в одну кодовую комбинацию, передаются не непосредственно друг за другом, а перемежаются символами других кодовых комбинаций исходного систематического или любого другого кода. Если интервал между символами, входящими в одну кодовую комбинацию, сделать длиннее "памяти" (интервала корелляции) канала с замираниями, то в пределах длительности одной исходной кодовой комбинации группирования ошибок не будет. На приёме после обратной "расфасовки" в кодовых комбинациях можно производить декодирование с обнаружением и исправлением ошибок. Самый большой класс разделимых блочных кодов составляют систематические коды, у которых проверочные символы определяются в результате проведения линейных операций над определёнными информационными символами. Для двоичных кодов эти операции сводятся к выбору каждого проверочного символа таким образом, чтобы его сумма по 14 модулю два с определёнными информационными символами была равной нулю. К систематическим кодам относятся коды с проверкой на чётность, коды с повторением, корреляционный, инверсный, коды Хэмминга, Голея, РидаМаллера, Макдональда, Варшамова, с малой плотностью проверок на чётность, итеративный код. Эти коды получили наибольшее применение в системах передачи дискретной информации. Разновидностью систематических кодов являются циклические коды. Код L называется циклическим, если он линеен и любой циклический сдвиг кодового слова также является кодовым словом, то есть если (c0, c1, …, cn-1) принадлежит L, то и (cn-1, c0, …, cn-2) принадлежит L. Например циклическим является код L1=(000, 110, 101, 011). Кроме всех свойств систематического кода, циклические коды имеют следующее свойство: если некоторая кодовая комбинация принадлежит коду, то получающаяся путём циклической перестановки символов новая комбинация также принадлежит данному коду. К наиболее известным циклическим кодам относятся простейшие коды, коды Хэмминга, Боуза – Чоудхури – Хоквингема, мажоритарные, коды Файра, Абрамсона, Миласа – Абрамсона, Рида – Соломона, компаундные коды. Проблема помехоустойчивого кодирования представляет собой обширную область теоретических и прикладных исследований. Основными задачами при этом являются следующие: отыскание кодов, эффективно исправляющих ошибки требуемого вида; нахождение методов кодирования и декодирования и простых способов их реализации. Наиболее разработаны эти задачи применительно к систематическим кодам. Такие коды успешно применяются в вычислительной технике, различных автоматизированных цифровых устройствах и цифровых системах передачи информации. Шеннон показал, что с каждым каналом связано измеряемое в битах в секунду и называемое пропускной способностью канала число С. Если требуемая от системы связи скорость передачи информации R (измеряемая в битах в секунду) меньше С, то, используя коды, контролирующие ошибки, для данного канала можно построить такую систему связи, что вероятность ошибки на выходе будет сколь угодно мала. Этот закон выражает теорема Шеннона для канала с шумами: Для канала с помехами всегда можно найти такую систему кодирования, при которой сообщения будут переданы со сколь угодно большой степенью верности, если только производительность источника не превышает пропускной способности канала. В самом деле, из шенноновской теории информации следует тот важный вывод, что построение слишком хороших каналов является 15 расточительством; экономически выгоднее использовать кодирование. Фактически в работе Шеннона утверждается, что мощность сигнала, шум в канале и полоса частот ограничивают лишь скорость передачи, а не ее точность. Шеннон, однако, не указал, как найти подходящие коды, а лишь доказал их существование. В пятидесятые годы много усилий было потрачено на попытки построения в явном виде классов кодов, позволяющих получить обещанную сколь угодно малую вероятность ошибки, но результаты были скудными. В следующем десятилетии решению этой увлекательной задачи уделялось меньше внимания; вместо этого исследователи кодов предприняли длительную атаку по двум основным направлениям. Первое направление исследований по кодированию носило скорее вероятностный характер. Ранние исследования были связаны с оценками вероятностей ошибки для лучших семейств блоковых кодов, несмотря на то, что эти лучшие коды не были известны. С этими исследованиями были связаны попытки понять кодирование и декодирование с вероятностной точки зрения, и эти попытки привели к появлению последовательного декодирования. В последовательном декодировании вводится класс неблоковых кодов бесконечной длины, которые можно описать деревом и декодировать с помощью алгоритмов поиска по дереву. Наиболее полезными древовидными кодами являются коды с тонкой структурой, известные под названием свёрточных кодов. Эти коды можно генерировать с помощью цепей линейных регистров сдвига, выполняющих операцию свертки информационной последовательности. В конце 50-х годов для сверточных кодов были успешно разработаны алгоритмы последовательного декодирования. Интересно, что наиболее простой алгоритм декодирования алгоритм Витерби - не был разработан для этих кодов до 1967 г. Применительно к свёрточным кодам умеренной сложности алгоритм Витерби пользуется широкой популярностью, но для более мощных сверточных кодов он не практичен. Второе направление носило чисто алгебраический характер и преимущественно рассматривало блоковые коды. Первые блоковые коды были введены в 1950 г., когда Хэмминг описал класс блоковых кодов, исправляющих одиночные ошибки. Коды Хэмминга были разочаровывающе слабы по сравнению с обещанными Шенноном гораздо более сильными кодами. Несмотря на усиленные исследования, до конца пятидесятых годов не было построено лучшего класса кодов. В течение этого периода без какойлибо общей теории были найдены многие коды с малой длиной блока. Основной сдвиг произошел, когда Боуз, Рой-Чоудхури и Хоквингем нашли большой класс кодов, исправляющих кратные ошибки (коды БЧХ), а Рид и 16 Соломон нашли связанный с кодами БЧХ класс кодов для недвоичных каналов. Хотя эти коды остаются среди наиболее важных классов кодов, общая теория блоковых кодов, контролирующих ошибки, с тех пор успешно развивалась, и время от времени удавалось открывать новые коды. В данной работе рассмотрен подкласс циклических кодов – коды БЧХ. Открытие кодов БЧХ привело к поиску практических методов построения жестких или мягких реализаций кодеров и декодеров. Первый хороший алгоритм был предложен Питерсоном. Впоследствии мощный алгоритм выполнения описанных Питерсоном вычислений был предложен Берлекэмпом и Месси, и их реализация вошла в практику, как только стала доступной новая цифровая техника. 2. ОПИСАНИЕ БЧХ-КОДИРОВАНИЯ В данной главе рассмотрен алгоритм БЧХ-кодирования. БЧХ-код является циклическим кодом, который задается порождающим полиномом. Для его нахождения в случае БЧХ-кода необходимо заранее определить длину кода n (она не может быть произвольной) и требуемое минимальное расстояние между кодовыми словами d ≤ n. Длина кода n – количество битов в кодовой комбинации. 2.1. КОНЕЧНОЕ ПОЛЕ Полем GF(q) называют множество элементов, на котором определены две операции. Одна из них называется сложением и обозначается a + b, а другая – умножением и обозначается a b. Результатом этих операций является элемент этого же поля. Кроме того, в поле должны быть определены два элемента: ноль 0 и единица 1. Сложение любого элемента поля с нулем дает этот же элемент поля и умножение любого элемента поля на единицу поля дает этот же элемент. Кроме того каждый ненулевой элемент поля должен иметь мультипликативно обратный элемент, умножение элемента на обратный элемент дает в качестве результата единицу поля. Таким образом, поле может рассматриваться как две группы: мультипликативная (все ненулевые элементы поля относительно операции умножения) и аддитивная (все элементы поля относительно операции сложения). Группа G — это непустое множество элементов, на котором определена одна бинарная операция над любыми двумя элементами этого множества: a b. Результатом этой операции является элемент этого же множества и операция обязана обладать следующими свойствами: 17 1) ассоциативность: (a b) c = a ( b c); 2) наличие нейтрального элемента e: e a = a; 3) наличие обратного элемента a-1: a a-1 = e. Эти свойства обязаны выполняться для любых a, b, c, принадлежащих G. Пример. Совокупность всех целых чисел является полем относительно операций арифметического сложения и умножения. Поля с конечным числом элементов q называют полями Галуа по имени их первого исследователя Эвариста Галуа и обозначают GF(q). Число элементов поля q называют порядком поля. Конечные поля используются для построения большинства известных кодов. Наименьшее число элементов, образующих поле, равно 2. Такое поле должно содержать 2 элемента: 0 и 1. Это поле GF(2), или двоичное. В зависимости от значения q различают простые и расширенные поля. Поле называют простым, если q = p, где p – простое число. Простое поле образуется классами вычетов целых чисел по модулю p: [0], [1], [2],…, [p – 1], где класс вычетов [x] – множество всех целых чисел, остаток от деления которых на p равен остатку от деления на p представителя класса x. Остаток от деления обозначается как (x mod p). Операции сложения и умножения в поле GF(p) определены как арифметическое сложение и умножение двух любых представителей класса, а результатом операции является класс вычетов, к которому принадлежит полученное при операции сложения или умножения число. Поскольку каждый класс вычетов содержит минимального представителя, то можно заменить элементы поля [0], [1], [2],…, [p – 1] на их номер (минимального представителя) 0, 1, 2,…, p – 1 и операции определить так: с = a b эквивалентно с = (a b) mod p; с = a + b эквивалентно с = (a + b) mod p. Поле E называется расширением поля F в том случае, если поле E содержит в себе поле F. Например, поле целых чисел является расширением поля неотрицательных целых чисел. Расширенные поля GF(q) можно построить только для числа элементов q равному натуральной степени простого числа, т.е. только для q = pm. Для построения поля GF(pm) необходим неприводимый над полем GF(p) многочлен f(x) степени m. Многочлен над полем GF(p) — любой многочлен, коэффициентами которого являются элементы поля GF(p). Многочлен f(x) неприводим над полем, если он не может быть представлен как произведение двух многочленов меньшей степени над этим же полем. Неприводимый многочлен подобен простому числу: он не имеет нетривиальных делителей в этом поле. Любой многочлен, если он приводим, может быть представлен единственным 18 образом с точностью до постоянного сомножителя в виде произведения неприводимых многочленов (точно так, как любое число может быть представлено в виде произведения простых чисел). Неприводимые многочлены в теории циклических кодов играют роль образующих полиномов. Возможность разложить многочлен на множители и, соответственно, свойство неприводимости зависит от того, какие числа допускаются в качестве коэффициентов многочлена. Так, многочлен x3 + 2 неприводим, если в качестве коэффициентов допускать только рациональные числа, но разлагается в произведение двух многочленов, если допускать мнимые числа в значении коэффициентов. Не составит труда убедиться, что многочлен x4+x+1 неприводим над GF(2). Данный многочлен не раскладывается на многочлены меньшей степени с коэффициентами 0 и 1. Существует несколько методов определения приводимости многочлена: алгоритм Кронекера, алгоритм Ленстры-Ленстры-Ловаса, алгоритм Берлекэмпа. Доказана теорема о существовании хотя бы одного неприводимого многочлена степени n > 1 для любого поля GF(p) и любого n. Элементами поля GF(q = pm) являются числа от 0 до q – 1. Для определения операций сложения и умножения каждое a такое число представляют в форме многочлена a(x) = a0 + a1x+ a2x2+…+am-1xm-1, где ai таковы, что 0 ai < p и a(p) = a. Это можно представить как запись числа a по основанию p. Например, десятичное число a = 123 в различных полях будет записано так (здесь и далее младшие разряды — первые) p = 2: {ai} = {1, 1,0, 1, 1, 1, 1}; p = 3: {ai} = {0, 2, 1, 1, 1}; p = 5: {ai} = {3, 4, 4}; p = 7: {ai} = {4, 3, 2}; p = 23: {ai} = {8, 5}. Операция сложения двух элементов поля GF(q) определяется как сложение соответствующих многочленов, причем коэффициенты многочленов складываются по правилам поля GF(p). Операция умножения двух элементов поля GF(q) определяется как остаток от деления произведения соответствующих многочленов на неприводимый степени m многочлен над полем GF(p). Произведения и суммы коэффициентов вычисляются по правилам поля GF(p). Какой именно неприводимый степени m многочлен над полем GF(p) использовать — неважно, доказано что все поля GF(q = pm), полученные для любого неприводимого степени m многочлена над полем GF(p) — изоморфны. 19 Среди всех элементов конечного поля GF(q) есть так называемый примитивный элемент. Примитивный элемент поля — это такой элемент, что все другие элементы поля можно получить, возведя данный элемент последовательно в натуральную степень от 1 до q - 1. То есть, , 2, 3,… q - 1 образуют всё множество элементов поля. 2.2. ПРОВЕРКА НЕПРИВОДИМОСТИ МНОГОЧЛЕНА. АЛГОРИТМ ЛЕОПОЛЬДА КРОНЕКЕРА Алгоритм Леопольда Кронекера находит для заданного многочлена f(x), коэффициенты которого не выходят за пределы рациональных чисел, многочлен f1(x) такой, что f1(x) | f(x), или доказывает, что такого многочлена нет. Алгоритм Кронекера основан на следующих тезисах. Если степень многочлена – n, определим переменную r=n div 2. Если многочлен f(x) приводим, то у него есть делитель, степень которого не превосходит r. Для того, чтобы найти этот делитель g(x), рассмотрим значения многочлена f(x) для чисел j = 0, 1, …, r, обозначим их cj. В том случае, если cj = 0, то, соответственно, j — корень f(x) и (x - j) – делитель многочлена f(x). Можно поделить многочлен на все (x - j) для cj = 0 и получить новый f(x) для которого все cj ≠ 0. В случае, если cj ≠ 0, то g(j) является делителем числа cj. Для каждого cj ≠ 0 можно найти набор делителей d. Для каждого сочетания делителей d0, …, dr чисел c0, …, cr. существует ровно один многочлен g(x) степени, не превышающей r, для которого g(j)=dj, j=0, 1, …, r. Многочлен получаем следующим образом: r g ( x) d j g j ( x) , j 0 где gj(x) определен так g j ( x) xk jk . 0 k r , k j Для каждого такого многочлена g(x) проверяем, будут ли его коэффициенты целыми числами и будет ли он делителем многочлена f(x). 2.3. БЧХ-КОД БЧХ-код является циклическим кодом, который задается порождающим многочленом g(x). Для построения кода БЧХ необходимо найти этот порождающий многочлен. Для описания БЧХ-кода введем несколько определений. 20 Нормированный многочлен – это такой многочлен, коэффициент при старшей степени которого равен 1. Например: x3+ 2x - 1 – нормированный многочлен, а 4x2 - 5 – нет. Любой многочлен можно привести к нормированному, разделив его на коэффициент при старшей степени. Так, разделив многочлен 4x2 - 5 на 4 получим x2 -1,25. Данный многочлен является нормированным. Минимальное кодовое расстояние для данного кода — минимальное расстояние Хэмминга между двумя любыми словами в этом коде. Если имеется хотя бы одна пара слов, отличающихся друг от друга только в одном разряде, то минимальное расстояние данного кода равно 1. Конструктивное кодовое расстояние – максимально возможное число, меньшее минимального кодового расстояния между кодовыми словами. 2.3.1. Поиск порождающего многочлена Для того, чтобы найти порождающий многочлен БЧХ, надо выполнить следующие шаги: 1) выбрать основание — простое число p; 2) выбрать число членов поля q = pk, над которыми будет построен код БЧХ, где k – натуральное число; 3) определить длину кода n, дина кода n определяется из формулы n qm 1 , где m, s – натуральные числа; s задать желаемое минимальное расстояние для кода d, значение минимального расстояния кода d должно быть меньше длины кода n; 5) построить поле GF(q). 6) построить поле GF(qm), где m — параметр кода БЧХ, см. п. 3); 7) найти примитивный элемент α поля GF(qm); 8) найти степень примитивного элемента β = αs, где s — параметр кода БЧХ, см. 3); 9) найти d – 1 последовательные степени β: βl, βl +1, βl +2, … βl +d-2, где l – произвольное натуральное число; 10) найти нормированный многочлен g(x) минимальной степени над полем GF(q), корнями которого являются все d – 1 подряд идущих степеней βl, βl +1, βl +2, … βl +d-2; Этот многочлен g(x) и является порождающим для БЧХ-кода с заданными выше параметрами. 4) 2.3.2. Выбор параметров кода БЧХ Параметры кода БЧХ выбираются исходя из требований задачи, в которой код будет применен. Ниже будет использоваться p = 2 и k = 1. Последнее обусловлено тем, что в основном коды БЧХ применяют в 21 вычислительных устройствах, которые используют двоичное представление чисел и, следовательно, удобнее использовать двоичные (p = 2) коды БЧХ. Однако, все рассуждения (и, возможно, программа) ниже применимы и к недвоичным кодам. 2.3.3. Построение конечного поля Существует два варианта построения поля, в зависимости от количества элементов (см. п.2.1). 1) Поле содержит p элементов, где p – простое. В данном случае полем является кольцо вычетов по модулю p. 2) Поле содержит q=pk элементов, где p – простое, k – натуральное числа. Для построения поля из q=pk элементов достаточно отыскать многочлен f(x) степени k, неприводимый над полем GF(p). В случае кодов БЧХ оба поля, используемые в построении, являются полями GF(q) и GF(qm), т.е. для их построения необходимо отыскание двух неприводимых многочленов — степени k и степени km над полем GF(p). Алгоритм отыскания неприводимого многочлена степени k над полем GF(p) неизвестен. В программной реализации построения кода БЧХ используется метод перебора. Т.е. можно задать многочлен нужной степени и программа проверит его на неприводимость. Для проверки на неприводимость используется алгоритм Кронекера (см. п.2.2). Это вполне допустимый вариант, даже для практического применения, не говоря у же о демонстрационном, ибо построение порождающего многочлена БЧХ, а следовательно и поиск неприводимых многочленов одноразовое мероприятие и то, что на него будет затрачено «много» времени не так уж важно — построение порождающего многочлена нужно произвести однократно, далее этот многочлен просто многократно используется при кодировании. 2.3.4. Поиск примитивного элемента и построение циклотомических классов В построенном поле GF(qm) находим примитивный элемент . Находим его методом перебора, т.к. других методов поиска примитивного элемента пока не найдено. Каждый элемент поля возводим в степени от 1 до q и проверяем полученные элементы на равенство каждому из элементов поля. В том случае, если из проверяемого элемента путем возведения его в натуральные степени получаем все элементы поля, то проверяемый элемент – примитивный. Возводим в степень s, находим β = s. Значение β возводим в d – 1 последовательные степени β: βl, βl +1, βl +2, … βl +d-2, где l – произвольное натуральное число. 22 Теперь надо найти такой многочлен g(x) минимальной степени над полем GF(q), что все βl, βl +1, βl +2, … βl +d-2 будут его корнями. Проще всего сделать это следующим образом: 1) построить циклотомические классы для всех βl, βl +1, βl +2, … βl +d-2; 2) найти многочлен для каждого циклотомического класса; 3) порождающий многочлен g(x) можно найти как произведение многочленов циклотомических классов. Циклотомическим классом элемента β поля GF(qm) над полем GF(q) называют все различные элементы поля GF(qm), порожденные 2 3 последовательным возведением β в степень q: β, βq, βq , βq , …. Заметим, что циклотомических классов может быть меньше, чем d – 1, т.к. некоторые степени β могут входить в один и тот же циклотомический класс. Многочлен циклотомического класса – многочлен минимальной степени, корнями которого являются все элементы циклотомического класса. Многочлен циклотомического класса имеет коэффициентами элементы поля GF(q), несмотря на то, что строится над полем GF(qm). 2.3.5. Построение порождающего многочлена БЧХ После построения многочленов циклотомических классов легко вычислить порождающий многочлен. Порождающий многочлен БЧХ есть произведение многочленов всех циклотомических классов. Перемножив эти многочлены получаем многочлен g(x), порождающий БЧХ-код над полем GF(q). Часто БЧХ-код записывают в виде трех чисел: (n, l, d), где n – длина кодового слова БЧХ, l – длина исходного кодового слова, d – минимальное кодовое расстояние. 2.4. ДЕКОДИРОВАНИЕ КОДОВ БЧХ Коды БЧХ являются циклическими кодами, поэтому для декодирования этих кодов применимы все алгоритмы декодирования циклических кодов, но существуют и специализированные алгоритмы декодирования именно для БЧХ-кодов. Первый метод декодирования был найден Питерсоном для случая, когда q = 2, после чего Горенстейном и Цирлером для более общего случая (алгоритм Питерсона – Горенстейна – Цирлера). Позже Берлекэмп нашел упрощение данного метода, а затем Месси усовершенствовал его (алгоритм Берлекэмпа-Месси). Кроме того, существует еще отличный от перечисленных метод декодирования – метод, который основан на алгоритме Евклида. 23 3. ОПИСАНИЕ РЕАЛИЗАЦИИ ДЕМОНСТРАЦИОННОГО БЧХКОДИРОВАНИЯ В главе описана реализация алгоритма БЧХ-кодирования, основное внимание уделено построению порождающего многочлена. Прочие операции кодирования и декодирования являются достаточно элементарными. 3.1. ПРЕДСТАВЛЕНИЕ ЧИСЕЛ В РАЗРЯДНОСТИ ПО ПРОИЗВОЛЬНОМУ ОСНОВАНИЮ Функция Int2Digits(i, p) преобразует целое число i в массив разрядов по основанию p, где i – положительное целое число, p – положительное целое число - значение основания системы счисления. Возвращает вектор разрядов, младшие разряды — первые. Например, число 64 по основанию 3: Int2Digits(64, 3)=(1, 0, 1, 2); по основанию 7: Int2Digits(64, 7)=(1, 2, 1). Младшие разряды записываются в вектор первыми. Функция Int2Digits2(i, p, r) аналогична предыдущей функции, но задается еще один параметр r – разрядность, который определяет количество разрядов в возвращаемом векторе, если необходимо разряды дополняются нулями до r. 24 Например, Int2Digits2(64, 3, 4)=(1, 0, 1, 2), Int2Digits2(64, 3, 5)=(1, 0, 1, 2, 0), т.е. для r = 5 старший разряд заполнен 0. Должно быть i < pr, иначе в результирующем векторе просто не хватит разрядов для представления числа по заданному основанию и функция выдаст ошибку. Функция Digits2Int(d, p) преобразует массив цифр-разрядов по основанию p, заданных вектором d в целое число. Например, Int2Digits((3, 5, 2), 7)=129, Int2Digits((1, 1), 3)=4. Функция AllElements (p, n) генерирует все числа от 0 до pn-1 в виде массивов разрядов по основанию p длиной n. AllElements ( p n ) n for i 0 p 1 v Int2Digits2( i p n ) i V v V Например, 25 0 1 2 3 4 5 6 7 8 9 0 0 1 2 0 1 2 0 1 2 0 AllElements ( 3 4) 1 0 0 0 1 1 1 2 2 2 0 2 0 0 0 0 0 0 0 0 0 1 3 0 0 0 0 0 0 0 0 0 0 0 1 2 3 4 5 6 7 8 , 9 AllElements ( 7 2) 0 0 1 2 3 4 5 6 0 1 2 1 0 0 0 0 0 0 0 1 1 1 3.2. ФУНКЦИИ ОПЕРАЦИЙ С МНОГОЧЛЕНАМИ Для работы с многочленами введем несколько проверочных функций для того, чтобы избежать ошибок внутри функций, а в случае их наличия – без труда локализовать их. Функции вида CheckXX(f, p, str) проверяют допустимость аргументов, подробнее см. текст программы. Возвращают сообщение об ошибке, если аргументы недопустимы. CheckFP( f p str) error( concat ( str ": êîýôôèöèåíòû f áîëüøå p-1" error( concat ( str ": êîýôôèöèåíòû f ìåíüøå íóëÿ" error( concat ( str ": êîýôôèöèåíòû f ÍÅ öåëûå" ) ) if max( f ) p 1 ) ) if min ( f ) 0 ) ) if floor( f ) f 1 otherwise CheckXP( x p str) error( concat ( str ": x áîëüøå p-1" ) ) if x p 1 error( concat ( str ": x ìåíüøå íóëÿ" ) ) if min ( f ) 0 error( concat ( str ": x ÍÅ öåëûé" ) ) if floor( x) x 1 otherwise CheckFG( f g str) error( concat ( str ": ñòåïåíü f ìåíüøå ñòåïåíè g" ) ) if rows ( f ) rows ( g ) 1 otherwise CheckGF( f g str) error( concat ( str ": ñòåïåíü f íå ðàâíà ñòåïåíè g" 1 otherwise Âû÷èñëåíèå çíà÷åíèÿ ìíîãî÷ëåíà â ïîëå Например, 1 4 5 SubExpandTop 2 7 6 3 7 ) ) if rows ( f ) rows ( g ) Fp: : во всплывающем сообщении будет отображена ошибка “степень f меньше степени g”. Функция ff(x, f, p) вычисляет значение многочлена f(x) для агумента x в поле p. 26 ff ( x f p ) CheckXP( x p "ff" ) xn 1 yf last ( f ) for i last ( f ) 1 ORIGIN xn mod ( xn x p ) i y mod y mod f xn p p y Например, 1 ff 5 1 7 3, 1 3 ff 5 4 8 1 2 . Функция Div(a, b, p) возвращает такое число x, что a=(bx) mod p Div ( a b p ) return 0 if a 0 for x 1 p 1 return x if mod ( x b p ) a 1 Например, Div (4, 4, 7) = 1; Div (2, 5, 6) = 4. Функция DivEx(a, b, p) возвращает такое число x, что a=(bx) mod p в поле GF(p). p 2 p b p DivEx( a b p) mod mod a Например, DivEx(1, 2, 4) = 2; DivEx(3, 5, 7) = 4. Функция ExpandTop(f, g) расширяет многочлен g до многочлена f, дописывая нули в старшие разряды g так, чтобы длина вектора g совпала с длиной вектора f. ExpandTop ( f g ) if last ( g ) last ( f ) g reverse( g ) g last ( f ) 0 g reverse( g ) g otherwise Например, 2 3 3 ExpandTop 5 1 7 4 6 0 0 3 1 4 , 27 2 3 3 4 ExpandTop 1 5 6 4 7 0 0 0 3 1 4 Функция ExpandBottom(f, g) возвращает расширение многочлена g до многочлена f. Эквивалентна умножению многочлена g(x) на x в степени (степень_f – степень_g). ExpandBottom( f g ) if last( g ) last ( f ) g last ( f ) 0 g g otherwise Например, 2 3 3 3 1 ExpandBottom 5 1 4 7 4 0 6 0 , 2 3 3 1 3 4 4 ExpandBottom 1 5 0 6 4 0 7 0 bmatrix( f min ( match ( 1 sign ( f ) ) ) last ( f ) ORIGIN ORIGIN)возвращает Функция Trunc0(f) RIGIN 0 результат удаления старших нулевых степеней многочлена f. Например, 0 2 2 4 bmatrix( f min ( match ( 1 sign ( f ) ) ) last ORIGIN) Trunc0 (4f ) ORIGIN 1 1 0 RIGIN 50 50 , 0 0 1 Trunc0 1 3 3 5 5 . Функция Add(f, g, p) возвращает сумму многочленов f и g в поле p. Например, 28 0 0 0 3 0 Add 1 1 7 4 3 4 4 5 2 , 0 0 0 3 0 Add 1 1 10 4 3 4 4 5 9 . Функция Sub (f, g, p) возвращает разность многочлена f и многочлена g в поле p. Например, 6 3 3 Sub 2 1 10 1 8 4 4 , 2 2 3 3 3 Sub 4 1 10 1 5 4 4 6 2 . Функция Mul (f, g, p) возвращает произведение многочлена f на многочлен g в поле p. Например, 1 1 3 2 1 6 Mul 3 1 7 2 4 1 5 2 5 5 , 1 1 1 Mul 2 0 1 1 1 , 2 2 1 Mul 5 1 3 4 2 . Функция MulZ (f, g) возвращает произведение многочлена f на многочлен g в поле целых чисел. Например, 1 1 1 MulZ 0 1 1 1 , å ìíîãî÷ëåíà 29 1 1 3 2 1 6 MulZ 3 1 9 4 1 12 9 5 5 , 2 2 1 MulZ 11 3 4 12 . Функция SubExpandTop (f, g, p) возвращает результат вычитания многочленов f и gx(deg(f)-deg(g)) по модулю p. Многочлен g приводится к старшей степени f. SubExpandTop ( f g p ) CheckFG( f g "SubExpandTop" ) g last ( f ) 0 if last( g ) last( f ) mod ( f g ) p p . Например, 2 1 1 SubExpandTop 4 5 3 1 2 2 . Функция Divide (f, g, p) делит многочлен f на многочлен g в поле p с "÷àñòíîå" остатком. Возвращает вектор в виде "îñòàòîê" . f íà ìíîãî÷ëåí g â ïîëå Divide( f g p ) Fp ñ îñòàòêîì. Âîçâðàùàåò o ORIGIN if rows ( f ) rows ( g ) x 0 o return x f otherwise n g rows ( g ) lg last ( g ) while last ( f ) lg k rows ( f ) n g o y Div f g p o c y k f Trunc0( SubExpandTop ( f mod ( g y p ) p ) ) return Например, reverse( c) f . 30 3 1 3 0 0 Divide 0 10 0 1 9 3 9 , 2 1 ( 2 ) Divide 0 0 10 ( 0 ) 4 3 . 3.3. ФУНКЦИИ ПОИСКА ДЕЛИТЕЛЕЙ В дальнейшем для реализации БЧХ-кодирования будут использоваться функции поиска делителей. Рассмотрим их подробнее. Функция Dividers(x) возвращает все простые делители числа x. Dividers ( x) k ORIGIN for d 1 floor x z x d if z floor( z) v d k kk 1 x z while ( d 1) x x d floor x d x d v x if x 1 k v Например, 1 2 Dividers ( 2142) 3 7 17 , 1 Dividers ( 99) 3 11 . Функция DividersP (x, p) возвращает все простые делители числа x в поле p. 31 DividersP( x p ) k ORIGIN for i 1 ( p 1) if DivEx( x i p ) 1 v i k kk 1 v . Функция AllDividers(X) возвращает все простые делители всех чисел из вектора X. AllDividers ( X) for i ORIGIN last( X) i D Dividers X i D Например, 12 256 2345 D AllDividers 13 7 98457 1 1 1 T 1 5 1 1 3 D 2 2 7 13 7 37 3 67 887 . Функция AllDividersP(X, p) возвращает все простые делители всех чисел из вектора X в поле p. AllDividersP( X p ) for i ORIGIN last( X) D DividersP X p i D i . 3.4. ФУНКЦИИ ПОИСКА КОМБИНАЦИЙ Функция Comb(D) возвращает все возможные комбинации из чисел, входящих в вектор D. Например, T 1 D 3 1 2 5 Comb( D) T 1 1 3 2 Comb( D) D 1 3 1 3 1 3 1 1 2 2 5 5 1 3 1 3 1 1 2 2 . 32 Функция Comb(D) внутри себя содержит подфункцию _comb (X, Di). Данная подфункция вычисляет все комбинации элементов из векторов вектора X и матрицы Y. _comb ( X Y) ORIGIN E sign X 1 k0 for x Y if k 0 Z augment( X E x) k1 Z stack( Z augment( X E x) ) otherwise Z Например, T 1 3 4 1 2 1 2 1 2 1 2 _comb 2 5 6 3 3 5 5 4 4 6 6 9 1 1 2 1 2 1 2 _comb 8 2 9 9 8 8 7 7 7 . T 3.5. ВСПОМОГАТЕЛЬНЫЕ ФУНКЦИИ ДЛЯ АЛГОРИТМА КРОНЕКЕРА. Фунция gj(j, r, p) возвращает многочлен ak .... â ôîðìàòå . a0 n . g j( j r p ) g ORIGIN 1 1 x 1 for k 0 r if k j 1 p p mod ( k p) g Mulg x mod [ x ( j k) p ] x p x if x 0 g x Например, gj g j( 1 2 7) 1 5 gj 0 6 . в формате 33 1 5 gj 2 0 6 . gj g j( 3 2 8) Функция AddGj (g1, g2, p) выполняет сложение многочленов типа gj(x). ak .... a0 Возвращает результат в формате n . AddGj g 1 g 2 p o ORIGIN g1 g 2 ExpandTop g 2 g 1 o 1 o o g2 g 1 ExpandTop g 1 g 2 o 1 o o Add ( g1 g2 p ) mod g 2o 1 g 1o 1 p . Например, 6 2 AddGj( gj gi 7) 1 0 2 1 3 gi 3 0 5 . Функция FindNextDiv (f, p) возвращает один делитель многочлена f над полем FindNextDiv ( f p) èùåò ÎÄÈÍ äåëèòåëü ìíîãî÷ëåíà f íàä ïîëåì GF( p), ïðåäïîëàãàåòñÿ, ÷òî f вида íå ñîäåðæèò GF(p), предполагается, что f не содержит множителей (x-a). Возвращает é âèäà ðàùàåò "ðåçóëüòàò äåëåíèÿ f íà g " вектор из двух элементов "g - ìíîãî÷ëåí-äåëèòåëü" "èñõîäíûé ìíîãî÷ëåí f" "èñõîäíûé ìíîãî÷ëåí f" возвращает 0 0 . ( x a). Âîçâðàùàåò âåêòîð èç äâóõ ýëåìåíòîâ , åñëè äåëèòåëåé íå , если делителей не найдено, 34 FindNextDiv ( f p ) n rows ( f ) 1 if n 1 o ORIGIN r floor n 2 for i 0 r Ñ ff ( mod ( i p ) f p ) i AD AllDividersP( Ñ p ) DC Comb ( AD) for i 0 cols ( DC) 1 i gi gg DC p if ValidG( gi) 1 d Divide( f gi p ) return do if d o 1 0 o gi f 0 3.5. ПОИСК НЕПРИВОДИМЫХ МНОГОЧЛЕНОВ АЛГОРИТМОМ КРОНЕКЕРА Проверку многочлена не неприводимость будем проводить методом Леопольда Кронекера, который описан во второй главе. Рассмотрим же его конкретную реализацию. Метод Кронекера реализует функция Kroneker (f,p), которая проверяет многочлен f на приводимость в поле p. Приведем код, реализующий данный алгоритм. В самом начале функции определяем переменные и задаем предел поиска корней до степени, равной половине степени многочлена. После чего мы проверяем на равенство нулю многочлен при рассматриваемых корнях. В том случае, если количество найденных корней больше нуля (k>0, то есть корни найдены), мы делим многочлен на каждый из полученных делителей до тех пор, пока многочлен на делитель делится. Пытаемся поделить не один раз, а до тех пор, пока делится для того, чтобы учесть возможную кратность корней. Таким образом, после деления многочлена на свои делители, функция ищет следующий возможный делитель. Этим занимается подфункция FindNextDiv(f, p), которая для многочлена f в случае нахождения делителя многочлена возвращает делитель и результат деления. 35 В функции Kroneker(f,p), используется вспомогательная функция FindNextDiv(f, p), которая находит все делители многочлена в поле p. В итоге функция Kroneker(f, p) возвращает массив из трех значений. Первое значение 36 – множители, на которые раскладывается многочлен, второе значение – сам многочлен, третье значение – количество множителей. Таким образом, многочлен является неприводимым в том случае, если в выходном массиве первое и третье значение – нули. Например, 1 1 T 0 K 0 1 1 1 T fqm ( 1 1 0 1 1 1 ) K Kroneker fqm p T ; 1 1 1 T K 0 1 1 0 1 fqm ( 1 1 1 1 1 1 ) K Kroneker fqm p ValidK( K) "Âñå â ïîðÿäêå." ValidK( K) "!!!Ìíîãî÷ëåí ÏÐÈÂÎÄÈÌ íàä ïîëåì GF(p)." . 3.7. ФУНКЦИИ УМНОЖЕНИЯ И СЛОЖЕНИЯ В ПОЛЕ GF(Q) Функция MulQ(f, g, p ,fq) возвращает MulQ f g p f q CheckGF( f g "MulQ" ) CheckFP( f p "MulQ(f)" ) CheckFP( g p "MulQ(g) " ) CheckFP f q p "MulQ(fq)" x Divide Mul( f g p ) f q p ExpandTop f x ORIGIN 1 . Например, Функция AddQ(f, q, p) возвращает результат многочленов одинаковой степени f и q в поле p. AddQ( f g p ) CheckGF( f g "SumQ" ) CheckFP( f p "SumQ(f)" ) CheckFP( g p "SumQ(g) " ) Add ( f g p ) Например, 1 4 5 AddQ 2 5 7 0 3 6 2 ; 1 4 5 AddQ 2 5 11 7 3 6 9 . . сложения двух 37 Функция PowerQ (f, n, p, fq) возвращает результат возведения многочлена f в степень n в поле p. Например, 1 3 0 PowerQ 2 3 7 2 2 3 1 0 , 1 3 0 PowerQ 2 3 11 2 8 3 1 9 . Функция ModQ (f, p, fq) возвращает остаток от деления многочлена f на многочлен fq в поле p. Например, 1 0 1 ModQ 0 5 0 1 1 2 ; 3 0 2 0 5 ModQ 11 4 4 0 7 9 . Функция ModQAll (c, p, fq) возвращает остаток от деления вектора многочленов c на многочлен fq в поле p. Например, Функция CheckGFQ (G, p , f) проверяет правильность определения многочлена GF(q), проверяя не равно ли произведение двух любых элементов поля нулю. CheckGFQ( G p f ) for i ORIGIN 1 cols ( G) 1 for j i cols ( G) 1 return "!!!Îøèáêà îïðåäåëåíèÿ ïîëÿ G." i j if max MulQ G G p f 0 "Âñå çàìå÷àòåëüíî." Например, GFq ( 0 1 ) 1 fq 1 p2 CheckGFQ GFq p fq "Âñå çàìå÷àòåëüíî." . 3.7. ФУНКЦИИ ПОСТРОЕНИЯ ПОЛЕЙ Кроме того, для реализации всех вышеописанных функций необходимо построить само поле, над которым будем строить БЧХ-код. Над полем задаются определенные операции. В нашем случае мы задаем две операции: сложение и умножение. Причем это будут сложение и 38 умножение по модулю p. Приведу пример: возьмем p=11, тогда сумма двух элементов 6 и 7 в поле будет равна 6+7=13 mod 11=2, а произведение этих двух элементов 67=42 mod 11=9. Найдем неприводимый многочлен над полем. Данный многочлен найдем методом подбора, проверяя каждый из подбираемых многочленов методом Кронекера на неприводимость. Алгоритм Кронекера реализован в функции Kroneker (f,p), где f – многочлен над полем, p – модуль, по которому его ищем. За максимально возможную степень результирующего многочлена берем r=n/2 – степень неприводимого многочлена не может превышать половины степени исходного многочлена. Соответственно, проверяем равенство нулю многочлена для всех целых чисел от 0 до r. Если находим какие-либо корни, то следующим шагом делим многочлен на полученные корни, при делении многочлена учитываем, что корни могут быть кратными, поэтому делим на один и тот же корень до тех пор, пока делится. Все делители заносим в массив DV. Для его отыскания надо определить в поле примитивный элемент. Найдем его при помощи функции FindPrimitive (G, p, f). Данная функция находит примитивный элемент f в поле GFqm по модулю p. FindPrimitive( G p f ) e One( rows ( f ) 1) for i ORIGIN 1 cols ( G) 1 i G if e j1 qm cols ( G) while ( j qm) e MulQ p f j j 1 return if ( j qm 1) e 0 Данный алгоритм находит примитивный элемент поля путем перебора всех элементов поля, где для каждого элемента поля рассчитывается произведение с текущим элементом и в том случае, если остаток от деления данного произведения на любой неприводимый над полем многочлен равен 0, то проверяемый элемент является примитивным. Примитивный элемент ищем путем перебора потому, что других методов поиска неизвестно. Например, 39 FindPrimitive GFqm p fqm T fqm ( 1 1 0 1 1 1 ) 0 GFqm 1 2 p2 3 4 5 6 7 8 9 0 0 1 0 1 0 1 0 1 0 1 1 0 0 1 1 0 0 1 1 0 0 2 0 0 0 0 1 1 1 1 0 0 3 0 0 0 0 0 0 0 0 1 1 4 0 0 0 0 0 0 0 0 0 0 T (1 0 0 0 0) . Далее, находим элемент β, который равен αs, где s является элементом поля порядка n. PowerQ s p f q q m 1 n . Элемент β Например, Íàõîäèì s , s1 PowerQ s p fq T (1 0 0 0 0) . После нахождения элемента β начинаем строить циклотомические классы. Нахождение циклотомическоих классов выполняется функцией AllCycloClass(B, q, p, fqm). Функция находит и возвращает все циклотомические классы заданного вектора. AllCycloClass B q p f qm 40 j ORIGIN for B if j ORIGIN CC CycloClass q p f qm j j j 1 if ccñExists CC CC CycloClass q p f qm j j j 1 CC Например, CB AllCycloClass B q p fqm 1 0 1 0 0 1 1 T 0 CB 1 0 1 1 0 1 1 1 0 0 1 0 0 1 0 0 1 1 1 1 1 0 0 0 . Данная функция при нахождении циклотомических классов использует другую функцию CycloClass (β, q, p, fqm), которая находит один циклотомический класс непосредственно для одного элемента. 41 CycloClass q p f qm o ORIGIN C o jo 1 PowerQ q p f qm while ccExists C C j PowerQ q p f qm j j 1 C Например, 1 0 1 0 q2 p2 1 1 fqm 1 1 1 1 0 0 1 T CycloClass q p fqm 1 1 0 0 1 q 3 1 1 0 fqm 1 p 7 0 1 1 1 1 T CycloClass q p fqm 1 1 1 0 1 1 0 4 4 0 . 0 1 1 1 ; 42 Кроме того, как можно увидеть из демонстрационных рисунков в данных функциях используются две подфункции: ccExists(y, X) и cccExists(y, X). ccExists ( y X) for x X return 1 if x y 0 Функция ccExists(y, X) реализует проверку принадлежности какого-либо элемента полю X. В том случае, если функция возвращает “1”, то элемент y принадлежит полю X, в противном же случае, функция возвращает “0”. Например, 2 ccExists 1 1 1 3 ; 2 ccExists 4 1 0 3 . Функция cccExists(y, X) реализует проверку принадлежности какого-либо циклотомического класса c вектору циклотомических классов C. В том случае, если функция возвращает “1”, то класс принадлежит вектору классов, в противном же случае, функция возвращает “0”. ccñExists( y X) for x X return 1 if ccExists ( y x) 0 Например, ё. Функция CreateCCPol (C, p, fq) создает полином для циклотомического класса. CreateÑÑPol C p f q 43 e One rows f q 1 me ( p 1) e x me C ORIGIN for i ORIGIN 1 last ( C) if max ffPol C x p f q i 0 1 me p f q C i x MulPolx x Например, 1 T 0 CB 0 1 0 0 1 1 0 p2 1 0 1 1 0 1 1 1 T fqm ( 1 1 1 1 1 ) ccp0 CreateÑÑPol CB p fqm 0 0 0 T ccp0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 . После создания полинома циклотомического класса для удобства преобразуем его в вид с числовыми коэффициентами и обратно. Этим занимаются функции ffPol2ff(g, p) и ff2ffPol(g, n, p). ffPol2ff ( g p ) for i ORIGIN last( g ) i Y Digits2Int g p i Y ff2ffPol( g n p ) for i ORIGIN last( g ) Y Int2Digits2 g p n i i Y Функция MulAllPol (CCP, p, fqm) возвращает произведение всех многочленов циклотомических классов. Например, BCH MulAllPol CCP p fqm T BCH 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 0 [5,1] [5,1] [5,1] [5,1] [5,1] [5,1] [5,1] [5,1] [5,1] [5,1] [5,1] Функция Vec2Str(V) возвращает отображение в строке BCH-многочлена, т.к. в векторе его отображение неудобно для пользователя. 44 Vec2Str( V) s "" for x V s concat ( s num2str( x) ) s Например, T Vec2Str( BCH) 0 1 2 3 4 5 6 7 8 0 "00001" "00001" "00001" "00000" "00001" "00001" "00000" "00001" "00001" 45 4. КРАТКОЕ ОПИСАНИЕ ПРОГРАММЫ Рассмотрим основные фрагменты программы для построения БЧХкодов. 4.1. НАЧАЛО ПРОГРАММЫ Внешний вид начала программы приведен на рис. 4.1. Ïðàêòè÷åñêàÿ ðàáîòà. Ïîìåõîçàùèùåííîå êîäèðîâàíèå. Êîäû Áîóçà-×îóäõóðè-Õîêêåíãåìà (Á×Õ-êîäû). Bose-Chaudhur-Hocquenghem code (BCH-code) 1. Êðàòêî å ñî äåðæàí èå ï ðàêòè÷ åñêî é ðàáî òû. Êîäû Áîóçà — ×îóäõóðè — Õîêêåíãåìà (êîäû Á×Õ) — â òåîðèè êîäèðîâàíèÿ ýòî øèðîêèé êëàññ öèêëè÷åñêèõ êîäîâ, ïðèìåíÿåìûõ äëÿ çàùèòû èíôîðìàöèè îò îøèáîê. Îòëè÷àåòñÿ âîçìîæíîñòüþ ïîñòðîåíèÿ êîäà ñ çàðàíåå îïðåäåëåííûìè êîððåêòèðóþùèìè ñâîéñòâàìè, à èìåííî, ìèíèìàëüíûì êîäîâûì ðàññòîÿíèåì.  äàííîé ðàáîòå äåìîíñòðèðóåòñÿ ïðàêòè÷åñêîå ñîçäàíèå êîäîâ Á×Õ äëÿ ïðîèçâîëüíûõ ïàðàìåòðîâ. Á×Õ-êîäû áûëè îòêðûòû â 1959 ãîäó Õîêêåíãåìîì è íåçàâèñèìî â 1960 ãîäó Áîóçîì è ×îóäõóðè.Îíè îòêðûëè ñïîñîá ïîñòðîåíèÿ ïîëèíîìèàëüíûõ êîäîâ, óäîâëåòâîðÿþùèõ òàêèì òðåáîâàíèÿì. Ýòè êîäû ïîëó÷èëè íàçâàíèÿ êîäîâ Áîóçà-×îóäõóðè-Õîêêåíãåìà èëè Á×Õ-êîäîâ. Á×Õ-êîäû ìîãóò áûòü íå òîëüêî äâîè÷íûìè, íàïðèìåð, íà ïðàêòèêå äîñòàòî÷íî øèðîêî èñïîëüçóþòñÿ íåäâîè÷íûå êîäû Ðèäà-Ñîëîìîíà (Reed, Solomon), â äàííîé ðàáîòå áóäóò ðàññìàòðèâàòüñÿ â îñíîâíîì äâîè÷íûå. 2. Èñõî äí ûå äàí í ûå äëÿ êî äèðî âàí èÿ Îïðåäåëèì íåêîòîðûé äâîè÷íûé ñèãíàë, òî åñòü ñèãíàë, ñîñòîÿùèé èç 0 è 1 (ïàðàìåòð íèæå ìîæíî çàäàòü è èçìåíÿòü): Äëÿ ïîñòðîåíèÿ êîäà Á×Õ íåîáõîäèìî ïîñòðîèòü ïîðîæäàþùèé ìíîãî÷ëåí. Äëÿ ýòîãî íóæíî âûïîëíèòü íåñêîëüêî äåéñòâèé: 1) Âûáðàòü p è q k p , òî åñòü ïîëå GF(q), íàä êîòîðûì áóäåò ïîñòðîåí êîä; n 2) âûáðàòü äëèíó n êîäà èç óñëîâèÿ qm 1 , ãäå m,s - öåëûå ïîëîæèòåëüíûå; s 3) çàäàòü âåëè÷èíó d êîíñòðóêòèâíîãî ðàññòîÿíèÿ ìåæäó êîäîâûìè ñëîâàìè.  òåîðèè öèêëè÷åñêèõ êîäîâ äîêàçûâàåòñÿ, ÷òî ïîðîæäàþùèìè ìîãóò áûòü òîëüêî òàêèå ìíîãî÷ëåíû, êîòîðûå ÿâëÿþòñÿ äåëèòåëÿìè äâó÷ëåíà (áèíîìà) n x 1. РИС. 4.1. НАЧАЛО ПРОГРАММЫ Как видно из рис. 4.1. приведено краткое описание кодов БЧХ, кратка историческая справка по данному типу кодов. Во втором пункте, также 46 отображенном на рисунке описано начало алгоритма БЧХ-кодирования. Данные три шага нужны для построения порождающего многочлена. 47 4.2. ВВОД ДАННЫХ 4. Ïîñòðîåíèå ïîðîæäàþùåãî ìíîãî÷ëåíà Á×Õ 4.1. Îïðåäåëåíèå ïîëÿ GF( q ) k ×èñëî ÷ëåíîâ ïîëÿ íàä êîòîðûì áóäåò ïîñòðîåí êîä Á×Õ: Ïóñòü p 2 (òåîðåòè÷åñêè íèæå íåò îãðàíè÷åíèé íà q p p, íî q p , ãäå p - ïðîñòîå, k - íàòóðàëüíîå. p 2 íå òåñòèðîâàëîñü ), k 1, ÷òî äàåò k CheckSimplicityEx( p ) 0 èëè q 2 . 4.2. Âûáîð äëèíû êîäà n Âûáèðàåì äëèíó êîäà n èç óñëîâèÿ n q m 1 s , ãäå m s - íàòóðàëüíûå ÷èñëà. Ïóñòü m 4, s 1, òîãäà Ïðîâåðêà n CheckN( n ) if ( n floor( n ) "×èñëî n ÍÅÄÎÏÓÑÒÈÌÎ!" "×èñëî n äîïóñòèìîå." ) Ïðîâåðêà n n q m 1 n 15 s Âíèìàíèå!!! CheckN( n ) "×èñëî n äîïóñòèìîå." n äîëæíî áûòü ÍÀÒÓÐÀËÜÍÛÌ ×ÈÑËÎÌ. Åñëè ýòî íå òàê - ñëåäóåò ïîäîáðàòü ïàðàìåòðû m s. 4.3. Âûáîð ìèíèìàëüíîãî ðàññòîÿíèÿ äëÿ êîäà Âîçìåì ìèíèìàëüíîå ðàññòîÿíèå Õåììèíãà 4.4. Ñòðîèì ïîëå GF( q ) Íàõîäèì íåïðèâîäèìûé ìíîãî÷ëåí ñòåïåíè d 5 ìåæäó êîäàìè. Ðàññòîÿíèå k 1 íàä ïîëåì d äîëæíî áûòü ìåíüøå n. GF( p ), p 2 . Ïðîâåðêà ìíîãî÷ëåíà ValidF( f k p ) return "!!!Ìíîãî÷ëåí íå íàä ïîëåì GF(p)." return "!!!Ìíîãî÷ëåí ÍÅ ñòåïåíè k." if f mod ( f p ) if rows ( Trunc0( f ) ) k 1 "Âñå â ïîðÿäêå." Ïðîâåðêà ìíîãî÷ëåíà Ââåäèòå íèæå ìíîãî÷ëåí fq (ñòàðøàÿ ñòåïåíü ïåðâàÿ), òàêîé ÷òîáû åãî êîýôôèöèåíòû áûëè öåëûå ÷èñëà îò p 1 1 , à åãî ñòåïåíü áûëà ðàâíà k 1 ( deg ( f ) k). Ïðè íåîáõîäèìîñòè èçìåíèòå ðàçìåðíîñòü ìàòðèöû. (4 3 2 1 0 9 8 7 6 5 4 3 2 1 0) T fq ( 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 ) fq Trunc0 fq ValidF fq k p "Âñå â ïîðÿäêå." 0 äî 48 РИС. 4.2 – ВВОД ДАННЫХ ДЛЯ ПОСТРОЕНИЯ ПОРОЖДАЮЩЕГО МНОГОЧЛЕНА На рис. 4.2. изображена часть программы, в которой вводятся основные данные для создания кода БЧХ. Как видно из рисунка поля ввода данных закрашены желтым цветом, а фрагменты, где проверяется корректность введенных данных для наглядности закрашены темнооранжевым цветом. В данном куске программы вводится количество элементов в конечном поле, которое будет построено, и длина кода. Кроме того, программа проверяет, является ли число p – допустимым (простым) и является ли допустимым числом длина кода n. Длина кода задается по формуле и зависит от начальных переменных m и s, поэтому не всякое число n допустимо для использования в программе. Также и проверка числа p на простоту. Пользователь может по ошибке или умышленно ввести непростое и даже не целое число, поэтому данные проверки являются актуальными. m 4.6. Ïîèñê ïðèìèòèâíîãî ýëåìåíòà â ïîëå GF q m íåîáõîäèìî íàéòè ïðèìèòèâíûé ýëåìåíò 49 . Ïîñêîëüêó ïîêà íå íàéäåíî äðóãèõ ñïîñîáîâ - èùåì  ïîëå GF q ïåðåáîðîì: 4.3. ПОЛУЧЕНИЕ ПОРОЖДАЮЩЕГО МНОГОЧЛЕНА m Íàõîäèì ïðèìèòèâíûé ýëåìåíò ïîëÿ GF q FindPrimitive GFqm p fqm T s , s 1 PowerQ s p fq T m GF q Digits2Int p 1 (1 0 0 0 0) Íàõîäèì â ïîëå ×èñëîâîå (äåñÿòè÷íîå) ïðåäñòàâëåíèå (1 0 0 0 0) 4.7. Ñòðîèì öèêëîòîìè÷åñêèå êëàññû l0 : Íàõîäèì ñòåïåíè Power d p fp l0 1 l0 2 l0 d 2 m, ãäå l0 - ëþáîå ïîëîæèòåëüíîå öåëîå, íàä ïîëåì GF q d5 . o ORIGIN B 0 for i 1 d 2 MulQ p fp B o i B B Power d p fqm 1 0 T B 0 0 0 0 1 0 1 0 1 0 0 1 0 d5 1 1 1 0 1 l0 Öèêëîòîìè÷åñêèì êëàññîì ýëåìåíòà ïîëÿ ïîëÿ m, ïîðîæäåííûå ïîñëåäîâàòåëüíûì âîçâåäåíèåì GF q l0 1 l0 2 l0 d 2 íàä ïîëåì GF( q ). Çàìåòèì, ÷òî d 1, òàê êàê íåêîòîðûå ñòåïåíè ìîãóò âõîäèòü â îäèí è òîò Íàõîäèì öèêëîòîìè÷åñêèå êëàññû âñåõ ýëåìåíòîâ öèêëîòîìè÷åñêèõ êëàññîâ ìîæåò áûòü ìåíüøå, ÷åì æå öèêëîòîìè÷åñêèé êëàññ . m íàä ïîëåì GF q GF( q ) íàçûâàþò âñå ðàçëè÷íûå ýëåìåíòû â ñòåïåíü q q: 2 q 3 q . На рис. 4.3 изображен фрагмент программы, в котором показаны основные этапы получения порождающего полинома как нахождение неприводимого многочлена над полем, поиск примитивного элемента в поле, построение циклотомических классов примитивного элемента поля,. 50 4.4. КОНЕЦ ПРОГРАММЫ 5. ÐÅÇÓËÜÒÀÒ - ïîðîæäàþùèé ìíîãî÷ëåí Á×Õ bch ffPol2ff ( BCH p ) T bch ( 1 1 1 0 1 0 0 0 1 ) Äàííûé ïîëèíîì ïîðîæäàåò êîä Á×Õ ( m n ), m 4 áèòà â n 15 áèò äåòåêòèðóåò íå ìåíåå d 1 4 d èñïðàâëÿåò íå ìåíåå floor 1 1 îøèáêè. 2 îøèáêè è В данной части программы нами получен порождающий многочлен для кода БЧХ, приведены основные его характеристики. Программа готова к практической реализации создания кода. 51 5. ЗАДАНИЕ ДЛЯ САМОСТОЯТЕЛЬНОГО ВЫПОЛНЕНИЯ 5.1. ОБЩИЕ ЗМЕЧАНИЯ Задание лабораторной работы выполняется индивидуально. Варианты помеченные звездочкой имеют повышенную сложность и могут выполняться группой до 2-х человек. Варианты помеченные звездочкой дают право на освобождение от экзамена (при полном выполнении) или на освобождение от одного вопроса на экзамене (при частичном выполнении). Уровень полное/частичное выполнение определяет преподаватель. 5.2. ВАРИАНТЫ ЗАДАНИЙ Вариант 1 (стандартный) Состоит из трех частей. Выполнение первой части задания дает право гордо заявлять: «Я делал лабораторную работу». Выполнение первой и второй части задания дает право на освобождение от 1 (одного) вопроса на экзамене/зачете по выбору. Выполнение первой, второй и третьей части задания дает право на освобождение от экзамена. Первая часть задания 1 1. Научиться работать с демонстрационной программой. 2. Научиться упаковывать и распаковывать произвольный файл с помощью тестовой программы. Вторая часть задания 1 Ответить на вопросы: 1. Что такое порождающий полином? 2. Как происходит кодирование исходной информации с помощью полинома? 3. Что такое поле? 4. Что такое минимальное расстояние между кодовами словами? 5. Как связано минимальное расстояние между кодовами словами и число обнаруживаемых кодом ошибок? 6. Как связано минимальное расстояние между кодовами словами и число исправляемых кодом ошибок? 7. Что такое неприводимый над полем многочлен? 8. Что такое примитивный элемент поля? 52 9. 10. 1. 1. 2. 1. 2. 1. 3. Что такое циклотомический класс? Что такое число контрольных разрядов блочного кода? Третья часть задания 1 Получить порождающий полином кода БЧХ со следующими характеристиками: длина результирующего кода > 40 бит; минимальное расстояние между кодовами словами 10. Вариант 2* Получить порождающий полином кода БЧХ для НЕДВОИЧНОГО кода. Продемонстрировать кодирование для НЕДВОИЧНОГО кода. Вариант 3* Создать декодирующую программу для БЧХ с коррекцией ошибок алгоритмом Берлекэмпа-Месси или алгоритмом Евклида. Продемонстрировать способность кода БЧХ корректировать ошибки. Вариант 4* Подробно описать алгоритм для любого метода декодирования кода БЧХ с коррекцией ошибок. Создать декодирующую программу для БЧХ с этим методом. 5.3. ОФОРМЛЕНИЕ РЕЗУЛЬТАТОВ РАБОТЫ Вы должны представить письменный отчет (один на группу) по выполненной работе (510 страниц, не считая листингов программы — листинги рекомендуется не печатать) и работоспособный код программы. Отчет должен быть оформлен в соответствии со стандартом [1]. Отчет должен состоять из следующих частей: 1) титульный лист; 2) введение; 3) основная часть (может состоять из нескольких глав); 4) заключение; 5) список использованных источников. Отчет должен содержать: 1) краткий обзор математических алгоритмов помехозащищенного кодирования, приветствуется описание алгоритмов не упомянутых в данных методических указаниях; 2) описание проблем, с которыми вы столкнулись при написании программы, и их решений; Варианты помеченные звездочкой имеют повышенную сложность и могут выполняться группой в 2 человека. * 53 подробное описание вашего кода и наиболее интересных решений, использованных в нем; 4) описание результатов сравнения эффективности работы вашего и предоставленного вам готового кода. Работоспособный код вашей программы представляется в виде исходного файла (файлов) программы на дискете. Распечатывать полный листинг не нужно. 3) 5.4. ПРИЕМ ЗАЧЕТА ПО РЕЗУЛЬТАТАМ РАБОТЫ Зачет принимается в форме обсуждения отчета о выполнении лабораторной работы и программы с членами группы, представившей отчет. При обсуждении отчета каждый из членов группы должен продемонстрировать: 1) Знание основ помехозащищенного кодирования: измерение информации, причины и неизбежность избыточности, практическая необходимость помехозащищенного кодирования, пределы помехозащищенного кодирования и существуют ли абсолютная защита от искажений, основные алгоритмы помехозащищенного кодирования и их модификации. 2) Знание устройства и взаимодействия частей представленного и/или своего кода программы. 3) Умение компилировать код и запускать программу. 4) Умение модифицировать свой код программы и способность объяснить назначение (функции) отдельных частей кода программы. 5) Умение интерпретировать результаты сравнения работы своего и предоставленного вам готового кода. ЗАКЛЮЧЕНИЕ Собрана воедино вся теоретическая часть по кодам БЧХ. Разобран принцип построения порождающего многочлена, создана демонстрационная программа для практического создания кодов БЧХ с параметрами, которые может задать пользователь в процессе работы с программой. Для реализации программы была объединена и собрана воедино информация из большого числа источников. Затруднения в работе были вызваны отсутствием полной информации по построению порождающего многочлена для БЧХ-кода, но данный вопрос был решен и БЧХ-код построен. К сожалению, не хватило времени на декодирование кодов БЧХ, поэтому автор оставил это заданием 54 для самостоятельной работы студентов. Правильность построения БЧХ-кода можно проверить на примерах, которые доступны в различных источниках информации. 55 СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ 1. СТП УГТУ-УПИ 1-96. Общие требования и правила оформления дипломных и курсовых проектов (работ). 1996. 34 с. Группа Т51.