Линейный код: различия между версиями

31 байт убрано ,  6 лет назад
Откат по причине вандализма
(Откат по причине вандализма)
В области математики и теории информации '''линейный коткод''' — это важный тип [[Блоковый код|блокового котакода]], использующийся в схемах определения и коррекции ошибок. Линейные котыкоды, по сравнению с другими котамикодами, позволяют реализовывать более эффективные алгоритмы котированиякодирования и декотированиядекодирования информации.
 
== Основы ==
* ''исправление ошибок'' ({{lang-en|forward error correction}}) применяется на физическом уровне.
 
=== КотыКоды обнаружения и исправления ошибок ===
Корректирующие котыкоды — котыкоды, служащие для обнаружения или исправления ошибок, возникающих при передаче информации под влиянием [[помехи|помех]], а также при её хранении.
 
Для этого при записи (передаче) в полезные данные добавляют специальным образом структурированную ''избыточную'' информацию, а при чтении (приеме) её используют для того, чтобы обнаружить или исправить ошибки. Естественно, что число ошибок, которое можно исправить, ограничено и зависит от конкретного применяемого котакода.
 
С ''котамикодами, исправляющими ошибки'', тесно связаны ''коды обнаружения ошибок''. В отличие от первых, последние могут только установить факт наличия ошибки в переданных данных, но не исправить её.
 
В действительности, используемые коды обнаружения ошибок принадлежат к тем же классам кодов, что и коды, исправляющие ошибки. Фактически, любой код, исправляющий ошибки, может быть также использован для обнаружения ошибок (при этом он будет способен обнаружить большее число ошибок, чем был способен исправить).
По способу работы с данными коды, исправляющие ошибки делятся на ''блоковые'', делящие информацию на фрагменты постоянной длины и обрабатывающие каждый из них в отдельности, и ''сверточные'', работающие с данными как с непрерывным потоком.
 
=== Блоковые котыкоды ===
Пусть котируемаякодируемая информация делится на фрагменты длиной <math>k</math> бит, которые преобразуются в ''кодовые слова'' длиной <math>n</math> бит. Тогда соответствующий блоковый код обычно обозначают <math>(n,k)</math>. При этом число <math>R = \frac{k}{n}</math> называется ''скоростью кода''.
 
Если исходные <math>k</math> бит код оставляет неизменными, и добавляет <math>n-k</math> ''проверочных'', такой код называется ''систематическим'', иначе ''несистематическим''.
== Линейные пространства ==
 
=== Порождающая котоматрицаматрица ===
Пусть [[вектор (математика)|векторы]] <math>\overrightarrow{x_1} = (x_{11},..,x_{1n}), \overrightarrow{x_2} = (x_{21},..,x_{2n}),.., \overrightarrow{x_k} = (x_{k1},..,x_{kn})</math> являются [[базис]]ом линейного пространства <math>C</math>. По определению [[базис]]а, любой вектор <math>\overrightarrow{v} \in C</math> можно представить в виде линейной комбинации базисных векторов:
<math>\overrightarrow{v} = {c_1}\overrightarrow{x_1} + {c_2}\overrightarrow{x_2} + ... + {c_k}\overrightarrow{x_k}</math>,
и векторами <math>\overrightarrow{v} \in C</math>. Перечисляя все векторы коэффициентов <math>\overrightarrow{c} = ({c_1},{c_2},..,{c_k}) </math> можно получить все векторы <math>\overrightarrow{v} \in C</math>. Иными словами, матрица <math>G</math> порождает линейное пространство.
 
=== Проверочная котоматрицаматрица ===
Другим способом задания линейных пространств является описание через проверочную матрицу.
 
 
== Формальное определение ==
'''Линейный коткод''' длины ''n'' и ранга ''k'' является линейным подпространством ''C'' размерности ''k'' векторного пространства <math>\mathbb{F}_q^n</math>, где <math>\mathbb{F}_q</math> — [[конечное поле]] из ''q'' элементов. Такой код с параметром q называется q-арным кодом (напр. если ''q'' = 5 — то это 5-арный код). Если ''q'' = 2 или ''q'' = 3, то код представляет собой '''двоичный код''', или '''тернарный''' соответственно.
 
'''Линейный (блоковый) код''' — такой код, что множество его ''кодовых слов'' образует <math>k</math>-мерное линейное подпространство (назовем его <math>C</math>) в <math>n</math>-мерном [[линейное пространство|линейном пространстве]], [[изоморфизм|изоморфное]] пространству <math>k</math>-битных [[вектор (математика)|вектор]]ов.
Если минимальное расстояние линейного (n, k)-кода равно d, то любые <math>l \leqslant d - 1</math> столбцов проверочной матрицы H линейно независимы и найдутся d линейно зависимых столбцов.
 
=== КотыКоды Хемминга ===
Исторически «коды Хемминга» должны называться кодами Р. Фишера -и онибыл были им представленыпредставлен в 1942г (Fisher R.A. The theory of confouding in factor to thr theory).
[[Код Хемминга|Коды Хемминга]] — простейшие линейные коды с минимальным расстоянием 3, то есть способные исправить одну ошибку. Код Хемминга может быть представлен в таком виде, что ''синдром''
 
будет равен номеру позиции, в которой произошла ошибка. Это свойство позволяет сделать декодирование очень простым.
 
=== КотКод Рида-Маллера ===
{{не переведено 5|Код Рида-Маллера|Код Рида-Маллера||Reed-Muller code}} — линейный двоичный блочный код. При определённом построении он может быть систематическим. В общем случае код Рида-Маллера не является циклическим. Коды Рида-Маллера задаются следующими параметрами для любых значений m и r, называемого порядком кода, меньшего, чем m:
— длина кодового слова n=2<sup>m</sup>;
{{заготовка раздела}}
 
=== Общий метод котированиякодирования линейных котовкодов ===
Линейный код длины n с k информационными символами является k-мерным линейным подпространством, поэтому каждое кодовое слово является ''линейной комбинацией'' базисных векторов <math>\overrightarrow{g_1} = (g_{11},..,g_{1n}), \overrightarrow{g_2} = (g_{21},..,g_{2n}),.., \overrightarrow{g_k} = (g_{k1},..,g_{kn})</math> подпространства:
 
Это соотношение есть '''правило кодирования''', по которому информационное слово <math>\overrightarrow{m} = ({m_1},..,{m_k})</math> отображается в кодовое <math>\overrightarrow{c} = ({c_1},..,{c_n})</math>
 
=== Общий метод обнаружения ошибок в линейном котекоде ===
Любой код (в том числе нелинейный) можно декодировать с помощью обычной таблицы, где каждому значению принятого слова <math>\overrightarrow{r_i}</math> соответствует наиболее вероятное переданное слово <math>\overrightarrow{u_i}</math>. Однако, данный метод требует применения огромных таблиц уже для кодовых слов сравнительно небольшой длины.
 
Для линейных кодов этот метод можно существенно упростить. При этом для каждого принятого вектора <math>\overrightarrow{r_i}</math> вычисляется ''синдром'' <math>\overrightarrow{s_i}=\overrightarrow{r_i} H^T</math>. Поскольку <math>\overrightarrow{r_i} = \overrightarrow{v_i} + \overrightarrow{e_i}</math>, где <math>\overrightarrow{v_i}</math> — кодовое слово, а <math>\overrightarrow{e_i}</math> — вектор ошибки, то <math>\overrightarrow{s_i}=\overrightarrow{e_i} H^T</math>. Затем с помощью таблицы по синдрому определяется вектор ошибки, с помощью которого определяется переданное кодовое слово. При этом таблица получается гораздо меньше, чем при использовании предыдущего метода.
 
== Линейные циклические котыкоды ==
Несмотря на то, что исправление ошибок в линейных кодах уже значительно проще исправления в большинстве нелинейных, для большинства кодов этот процесс все ещё достаточно сложен. [[Циклический код|Циклические коды]], кроме более простого декодирования, обладают и другими важными свойствами.
 
* ''систематическое кодирование'' осуществляется путём «дописывания» к кодируемому слову остатка от деления <math>x^{n-k} u(x)</math> на <math>g(x)</math>, то есть <math>v(x) = x^{n-k} u(x) + [x^{n-k} u(x) \mod g(x)]</math>.
 
=== КотыКоды CRC ===
Коды [[CRC]] (cyclic redundancy check — циклическая избыточная проверка) являются ''систематическими'' кодами, предназначенными не для исправления ошибок, а для их обнаружения. Они используют способ систематического кодирования, изложенный выше: «контрольная сумма» вычисляется путём деления <math>x^{n-k} u(x)</math> на <math>g(x)</math>. Ввиду того, что исправление ошибок не требуется, проверка правильности передачи может производиться точно так же.
 
|}
 
=== КотыКоды БЧХ ===
[[Код Боуза-Чоудхури-Хоквингема|Коды Боуза-Чоудхури-Хоквингема]] (БЧХ) являются подклассом двоичных циклических кодов. Их отличительное свойство — возможность построения кода БЧХ с минимальным расстоянием не меньше заданного. Это важно, потому что, вообще говоря, определение минимального расстояния кода есть очень сложная задача.
 
Математически построение кодов БЧХ и их декодирование используют разложение порождающего полинома <math>g(x)</math> на множители в [[конечное поле|поле Галуа]].
 
=== КотыКоды Рида-Соломона ===
[[Код Рида-Соломона|Коды Рида-Соломона]] (РС-коды) фактически являются ''недвоичными'' кодами БЧХ, то есть элементы кодового вектора являются не битами, а группами битов. Очень распространены коды Рида-Соломона, работающие с [[байт]]ами ([[октет (информатика)|октетами]]).
 
== Преимущества и недостатки линейных котовкодов ==
+ Благодаря линейности для запоминания или перечисления всех кодовых слов достаточно хранить в памяти кодера или декодера существенно меньшую их часть, а именно только те слова, которые образуют базис соответствующего линейного пространства. Это существенно упрощает реализацию устройств кодирования и декодирования и делает линейные коды весьма привлекательными с точки зрения практических приложений.
 
Эффективность кодов определяется количеством ошибок, которые тот может исправить, количеством избыточной информации, добавление которой требуется, а также сложностью реализации кодирования и декодирования (как аппаратной, так и в виде программы для [[ЭВМ]]).
 
=== Граница Хемминга и совершенные котыкоды ===
{{main|Граница Хэмминга}}
Пусть имеется двоичный блоковый <math>(n,k)</math> код с корректирующей способностью <math>t</math>. Тогда справедливо неравенство (называемое ''границей Хемминга''):
1

правка