Коды Рида-Соломона. Часть 2 — арифметика полей Галуа
Здравствуйте, друзья! В прошлый раз мы с вами начали говорить о том, как коды Рида-Соломона помогают обеспечивать необходимый уровень надежности хранения данных. Сегодня остановимся немного подробнее на арифметике полей Галуа, которая используется в расчётах.
Сначала краткий экскурс в прошлую часть. Мы выяснили — чтобы иметь возможность восстанавливать потерянные данные, необходимо сначала определенным образом сгенерировать «избыточные данные». Причем, с математической точки зрения, эта задача (кодирования) сводится к построению некоторой порождающей матрицы и выполнению операции умножения этой матрицы на вектор исходных данных. Процедура восстановления (декодирования), в свою очередь, заключается в обращении порождающей матрицы и умножения её на вектор сохранившихся данных. Схематически это можно изобразить следующим образом.


Ограничения арифметики рациональных чисел
Мы уже отмечали некоторые трудности, с которыми приходится сталкиваться при реализации процедур кодирования/декодирования на конкретных аппаратных платформах. Так, например, числа в памяти ЭВМ обычно представлены фиксированным количеством байтов. Как следствие, при умножении элементов порождающей матрицы, можно получить переполнение разрядов. Или при обращении порождающей матрицы в качестве ее элементов могут возникнуть рациональные числа, которые проблематично хранить с произвольной точностью. Поэтому, сегодня мы с вами поговорим о том, как можно реализовать данные процедуры, избегая вышеуказанных проблем. В этом нам поможет теория полей Галуа, о которой мы уже немного говорили в прошлой статье.
Сразу сделаю несколько замечаний. Во-первых, статья прежде всего рассчитана на инженерную аудиторию, поэтому я старался избегать строгих математических определений. Тем, кому хочется более формального введения в данную область, имеет смысл сразу обратиться к соответствующей литературе. Со своей стороны, могу порекомендовать книгу Эрнеста Борисовича Винберга «Курс алгебры». Во-вторых, непосредственно для реализации алгоритмов избыточного кодирования достаточно лишь базового понимания теории конечных полей. Можно просто считать, что заданы некоторые непротиворечивые таблицы умножения, деления, сложения, вычитания и все вычисления происходят с использованием этих таблиц. Это намек для тех, кому не очень хочется глубоко погружаться в данный раздел алгебры.
Поля и арифметические операции в конечных множествах
Прежде чем перейти непосредственно к обсуждению полей Галуа, давайте повторим еще раз, чего мы хотим достичь. Мы хотим иметь возможность умножать матрицы на вектора, обращать матрицы. А самое главное, мы хотим иметь дело только с целыми числами и не переживать за переполнение при выполнении операций умножения и сложения.
Также, во избежание путаницы, имеет смысл сразу разобраться с терминологией. Прежде всего, что такое поле с точки зрения общей алгебры? Как сообщает нам Википедия, «поле — множество, для элементов которого определены операции сложения, вычитания, умножения и деления (кроме деления на нуль), причём свойства этих операций близки к свойствам обычных числовых операций». Что такое поле Галуа? Поле Галуа — это произвольное поле, состоящие из конечного числа элементов. , — стандартное обозначение полей Галуа, где в скобках указывается количество элементов поля.
В современных ЭВМ для хранения чисел обычно используется фиксированное число бит. Нетрудно посчитать, что всего существует различных n-битовых чисел, от 0 и до . Другими словами, мы имеем некоторое конечное множество чисел. На этом множестве мы сейчас попытаемся непротиворечивым образом определить операции умножения, деления, сложения и вычитания. Причем так, чтобы результат любой операции также был -битовым числом! В этом случае говорят, что множество замкнуто относительно введенных операций.
Операция вычитания в системах конечных множеств обычно вводится через понятие нулевого и противоположного элементов. Нулевой элемент — это такой элемент, для которого справедливо равенство: , где – произвольный элемент множества. Элемент является противоположным для , если верно равенство . Обычно противоположный элемент обозначается как . Если мы хотим из вычесть , мы находим противоположный элемент и складываем его с . Соответственно, для того, чтобы иметь возможность вычитать произвольные элементы конечного множества, каждый элемент этого множества должен обладать противоположным.
Аналогичным образом обстоят дела и с операцией деления. Вводится понятие единичного и обратного элементов. Единичный элемент — это такой элемент, для которого верно равенство , где — произвольный элемент множества. Элемент (обозначается как ) называется обратным к , если . Как и при вычитании, если мы хотим разделить на ненулевой , мы должны найти обратный элемент и умножить его на . Для того, чтобы иметь возможность делить произвольные элементы, каждый элемент множества (за исключением нулевого) должен обладать обратным.
Построение полей Галуа GF(p)
Каким образом мы можем определить на конечном множестве чисел указанные арифметические операции, причём так, чтобы множество было замкнуто относительно них? Другими словами, мы хотим произвольное конечное множество элементов превратить в поле Галуа. Первое что приходит в голову, это воспользоваться модульной арифметикой. Тогда если наше множество содержит элементов, то результатом произведения чисел будет является число . Сумма чисел определяется как .
В качестве упражнения, давайте составим таблицы сложения и умножения для множества, состоящего из элементов . 
На нижних двух таблицах представлены противоположные и обратные значения для каждого элемента нашего множества. Вооружившись этими таблицами, мы можем выполнять все необходимые нам арифметические операции. Ура!
Построение полей Галуа
Кажется, что мы на верном пути к успеху. Единственное, что нас может пока не устраивать, так это размер нашего поля – 5. Понятно, что для упрощения программной реализации, имеет смысл работать с множествами, содержащими чисел. Тогда мы сможем оперировать полубайтами, байтами, словами и т.д.
На первый взгляд кажется, какая разница, — 5 или 256 элементов в множестве, берём результат операции умножения или сложения по соответствующему модулю и готово. Давайте снова попробуем составить таблицу умножения для множества, но на этот раз содержащего элемента — . Вот что получилось:
Как сформировать торг 29 в 1с бухгалтерия