<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="https://vscripts.ru/w/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>https://vscripts.ru/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=NikZ</id>
		<title>Модулярная арифметика - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="https://vscripts.ru/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=NikZ"/>
		<link rel="alternate" type="text/html" href="https://vscripts.ru/w/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/NikZ"/>
		<updated>2026-04-17T12:44:48Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.23.17</generator>

	<entry>
		<id>https://vscripts.ru/w/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nikz</id>
		<title>Участник:Nikz</title>
		<link rel="alternate" type="text/html" href="https://vscripts.ru/w/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nikz"/>
				<updated>2014-06-17T18:35:21Z</updated>
		
		<summary type="html">&lt;p&gt;NikZ: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Пример коррекции ошибки с помощью кодов Рида - Соломона =&lt;br /&gt;
== Постановка задачи ==&lt;br /&gt;
В данной статье разбирается пример работы алгоритма коррекции ошибки для 16-битных строк. Строка разбивает на блоки длиной 4 бита и каждый блок представляет собой элемент поля Галуа GF&amp;lt;sub&amp;gt;16&amp;lt;/sub&amp;gt;. Необходимо отследить и исправить одиночную ошибку, внесённую в один из блоков.&lt;br /&gt;
&lt;br /&gt;
== Теоретические основы алгоритма ==&lt;br /&gt;
=== Поля Галуа ===&lt;br /&gt;
Операцию сложения определим как &amp;quot;исключающее ИЛИ&amp;quot; &amp;lt;math&amp;gt;(XOR)&amp;lt;/math&amp;gt;.Очевидно, что в таком случае операция сложения является обратной самой себе. Тогда операция умножения в двоичном виде будет выглядеть так:&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;math&amp;gt; \begin{matrix} *\underline{\begin{matrix}&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1 &amp;amp; 1 \\&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 1 &amp;amp; 1 &amp;amp; 0 \\&lt;br /&gt;
\end{matrix}}\\&lt;br /&gt;
+\underline{\begin{matrix}&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 1 &amp;amp; 1 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 1 &amp;amp; 1 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
\end{matrix}} \\&lt;br /&gt;
\begin{matrix}&lt;br /&gt;
 &amp;amp; 0 &amp;amp; 1 &amp;amp; 0 &amp;amp; 1 &amp;amp; 0 \\&lt;br /&gt;
\end{matrix} \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так можно умножать полиномы, в данном случае мы умножили:&lt;br /&gt;
&amp;lt;math&amp;gt; (x + 1) * (x^2 + x) = x^3 + x&amp;lt;/math&amp;gt;.&lt;br /&gt;
Определим также операцию деления чисел(или полиномов) с остатком – по аналогичным правилам, например:&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{110010}{101011}=011001 &amp;lt;/math&amp;gt;&lt;br /&gt;
или &amp;lt;math&amp;gt; \frac{x^5 + x^4 + x}{x^5 + x^3 + x + 1} = x^4 + x^3 + 1  &amp;lt;/math&amp;gt;&lt;br /&gt;
Теперь построим поле из 16 элементов &amp;lt;math&amp;gt; GF_{16} &amp;lt;/math&amp;gt;. Операцию сложения определена на XOR, Операция деления дополнена получением остатка по некоторому модулю.&lt;br /&gt;
Выберем в качестве модуля неприводимый полином &amp;lt;math&amp;gt; x^4+x+1 (10011) &amp;lt;/math&amp;gt;.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Возьмем единицу и будем последовательно умножать ее на 2 и рассмотрим числа, которые будут при этом &lt;br /&gt;
# &amp;lt;math&amp;gt;1= 2^0=0001 &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; 2^0*2=2^1=0010 _{mod 10011} = 2 = x^1 &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; 2^1*2=2^2=0100 _{mod 10011} = 4 = x^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; 2^2*2=2^3=1000 _{mod 10011} = 8 = x^3 &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; 2^3*2=2^4=10000 _{mod 10011} = 0011 = 3 = x+1 &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; 2^4*2=2^5=100000 _{mod 10011} = 0110 = 6 = x^2+x &amp;lt;/math&amp;gt;&lt;br /&gt;
и так далее.&amp;lt;br /&amp;gt;&lt;br /&gt;
'''Составим таблицу умножения'''&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Степень&lt;br /&gt;
! Результат&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 0001&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 2&lt;br /&gt;
| 0010&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 4&lt;br /&gt;
| 0100&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| 8&lt;br /&gt;
| 1000&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 3&lt;br /&gt;
| 0011&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| 6&lt;br /&gt;
| 0110&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| 12&lt;br /&gt;
| 1100&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| 11&lt;br /&gt;
| 1011&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 5&lt;br /&gt;
| 0101&lt;br /&gt;
|-&lt;br /&gt;
| 9&lt;br /&gt;
| 10&lt;br /&gt;
| 1010&lt;br /&gt;
|-&lt;br /&gt;
| 10&lt;br /&gt;
| 7&lt;br /&gt;
| 0111&lt;br /&gt;
|-&lt;br /&gt;
| 11&lt;br /&gt;
| 14&lt;br /&gt;
| 1110&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| 15&lt;br /&gt;
| 1111&lt;br /&gt;
|-&lt;br /&gt;
| 13&lt;br /&gt;
| 13&lt;br /&gt;
| 1101&lt;br /&gt;
|-&lt;br /&gt;
| 14&lt;br /&gt;
| 9&lt;br /&gt;
| 1001&lt;br /&gt;
|-&lt;br /&gt;
| 15&lt;br /&gt;
| 1&lt;br /&gt;
| 0001&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Таким образом, при дальнейшем умножении весь цикл повторится снова. Полученные степени двойки не сложно умножать между собой, например: &amp;lt;math&amp;gt; 13*15=2^{13}*2^{12}=2^{25 mod 15}=2^{10}=7 &amp;lt;/math&amp;gt;. Можно проверить результат,разделив &amp;lt;math&amp;gt; \frac{7}{13}=\frac{2^{10}}{2^{13}}=2^{-3 mod 15}=2^{12}=15 &amp;lt;/math&amp;gt;.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Таким образом, получили поле &amp;lt;math&amp;gt;GF_{16}&amp;lt;/math&amp;gt;, то есть для двоичных 4-разрядных чисел.'''&lt;br /&gt;
== Коды Рида - Соломона ==&lt;br /&gt;
При построении кода Рида-Соломона задается пара чисел N,K, где N-Общее количество символов, а К- «полезное» количество символов, N-K символов задают избыточный код, предназначенный для восстановления ошибок.&lt;br /&gt;
Такой код Рида-Соломона будет иметь «расстояние Хемминга» &amp;lt;math&amp;gt;D=N-K+1&amp;lt;/math&amp;gt;.&lt;br /&gt;
В соответствии с теорией кодирования, код, имеющий расстояние Хемминга &amp;lt;math&amp;gt;D=2t+1&amp;lt;/math&amp;gt;, позволяет восстанавливать t ошибок. Таким образом, если нам необходимо восстановить t ошибок, то общее количество символов сообщения &amp;lt;math&amp;gt;N=K+2t&amp;lt;/math&amp;gt;.&lt;br /&gt;
Сообщения при кодировании Рида-Соломона представляются полиномами.&lt;br /&gt;
Исходное сообщение представляется как коэффициенты полинома &amp;lt;math&amp;gt;p(x)&amp;lt;/math&amp;gt; степени &amp;lt;math&amp;gt;K-1&amp;lt;/math&amp;gt;, имеющего &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; коэффициентов.&amp;lt;br /&amp;gt;&lt;br /&gt;
Порождающий многочлен Рида-Соломона,&amp;lt;math&amp;gt;g(x)&amp;lt;/math&amp;gt;, строится следующий образом:&lt;br /&gt;
&amp;lt;math&amp;gt; g(x)=(x+2)(x+2^{2})..(x+2^{ D-1 } ) &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;2 - &amp;lt;/math&amp;gt; примитивный член поля. Нетрудно понять, что &amp;lt;math&amp;gt;2^{1},2^{2},..,2^{D-1}&amp;lt;/math&amp;gt; - корни этого многочлена.&amp;lt;br&amp;gt;&lt;br /&gt;
Например, построим порождающий многочлен кода Рида-Соломона с &amp;lt;math&amp;gt;N=15,K=9&amp;lt;/math&amp;gt;, способного исправлять до 3 ошибок &amp;lt;math&amp;gt;(15-9)/2=3&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;math&amp;gt;g(x)=(x+2)(x+2^{2} )(x+2^{3} )(x+2^{4} )(x+2^{5} )(x+2^{6} )=x^{6}+7x^{5}+9x^{4}+3x^{3}+12x^{2}+10x+12&amp;lt;/math&amp;gt;.     ''(Возведение в степень и умножения выполнены над полем GF&amp;lt;sub&amp;gt;16&amp;lt;/sub&amp;gt; )!''&lt;br /&gt;
== Кодирование Рида-Соломона ==&lt;br /&gt;
Кодирование Рида-Соломона будем производить систематическим кодом, это означает, что в закодированное сообщение будет содержать в себе в явном виде исходное сообщение. Каким образом это делается:&lt;br /&gt;
Сначала полином сдвигается на &amp;lt;math&amp;gt;N-K&amp;lt;/math&amp;gt; коэффициентов влево &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;p'(x)=p(x)x^{N-K}&amp;lt;/math&amp;gt; ,а потом вычисляется остаток от деления на порождающий полином и прибавляется к &amp;lt;math&amp;gt;p'(x)&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;C(x)=p'(x)+p'(x)mod g(x)&amp;lt;/math&amp;gt;. &amp;lt;br /&amp;gt;&lt;br /&gt;
Для систематического кого очевидно, что &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; старших коэффициентов полученного кода &amp;lt;math&amp;gt;C(x)&amp;lt;/math&amp;gt; содержат исходное сообщение. Это удобно при декодировании.&lt;br /&gt;
Закодированное сообщение &amp;lt;math&amp;gt;C(x)&amp;lt;/math&amp;gt; обладает очень важным свойством: оно без остатка делится на порождающий многочлен &amp;lt;math&amp;gt;g(x)&amp;lt;/math&amp;gt;.&amp;lt;br /&amp;gt;&lt;br /&gt;
'''Докажем это свойство:''' &amp;lt;br /&amp;gt;&lt;br /&gt;
Пусь &amp;lt;math&amp;gt;r(x)&amp;lt;/math&amp;gt;-остаток от деления &amp;lt;math&amp;gt;p'(x)&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;g(x)&amp;lt;/math&amp;gt;.&amp;lt;br /&amp;gt;&lt;br /&gt;
Тогда,&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;p'(x)=g(x)u(x)+r(x)&amp;lt;/math&amp;gt; &amp;lt;br /&amp;gt;&lt;br /&gt;
Итак,&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;r(x)=p'(x)mod g(x)&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Тогда&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;C(x)=p'(x)+p'(x)mod g(x)=g(x)u(x)+r(x)+r(x)&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Вспомним, что в арифметике поля Галуа сложения являются одновременно и вычитанием, тогда &amp;lt;math&amp;gt;r(x)+r(x)=0&amp;lt;/math&amp;gt;!Следовательно &amp;lt;math&amp;gt;C(x)&amp;lt;/math&amp;gt; делится на &amp;lt;math&amp;gt;g(x)&amp;lt;/math&amp;gt; без остатка.&amp;lt;br /&amp;gt;&lt;br /&gt;
Таким образом, &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;C(x) mod g(x)=0&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
В случае, если закодированное сообщение будет изменено, то это равенство будет нарушенным, не считая случая, когда ошибка окажется кратной &amp;lt;math&amp;gt;g(x)&amp;lt;/math&amp;gt;. Факт искажения можно рассматривать как прибавление к &amp;lt;math&amp;gt;C(x)&amp;lt;/math&amp;gt; некоторого полинома ошибки &amp;lt;math&amp;gt;E(x)&amp;lt;/math&amp;gt;.&amp;lt;br /&amp;gt;&lt;br /&gt;
'''Пример:'''&amp;lt;br /&amp;gt;&lt;br /&gt;
Рассмотрим кодирование информации. Пусть наше сообщение такое:&lt;br /&gt;
&amp;lt;math&amp;gt;12, 10, 12, 7&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Полином сообщения получается такой:&lt;br /&gt;
&amp;lt;math&amp;gt;I(x)=12x^{3}+10x^{2}+12x+7&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Умножаем на &amp;lt;math&amp;gt;x^{2}&amp;lt;/math&amp;gt;,получаем:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;I'(x)=12x^{5}+10x^{4}+12x^{3}+7x^{2}&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Делим на &amp;lt;math&amp;gt;g(x)&amp;lt;/math&amp;gt; и получаем остаток: &amp;lt;math&amp;gt;r(x)= x + 4 &amp;lt;/math&amp;gt; &amp;lt;br /&amp;gt;&lt;br /&gt;
В итоге получается полином закодированного сообщения: &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;C(x)=12x^{5}+10x^{4}+12x^{3}+7x^{2}+x+4&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
== Декодирование Рида-Соломона ==&lt;br /&gt;
Первым шагом необходимо выполнить деление полинома на порождающий полином &amp;lt;math&amp;gt;g(x)&amp;lt;/math&amp;gt;. Если остаток от деления равен 0, то сообщение не искажено и декодирование для систематического кода тривиально.&amp;lt;br /&amp;gt;&lt;br /&gt;
Разделим закодированное сообщение на образующий полином: &amp;lt;math&amp;gt;\frac{12x^{5}+10x^{4}+12x^{3}+7x^{2}+x+4}{x^{6}+7x^{5}+9x^{4}+3x^{3}+12x^{2}+10x+12}=0&amp;lt;/math&amp;gt;,&amp;lt;br /&amp;gt; в этом можно убедиться, самостоятельно проделав операцию деления, согласно арифметике поля GF_{16}&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Внесем ошибку в закодированное сообщение, полином ошибки &amp;lt;math&amp;gt;E(x)=14x^{4}&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Разделим получившееся закодированное сообщение &amp;lt;math&amp;gt;C'(x)&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;g(x): r(x) = 14x + 14&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt; &lt;br /&gt;
В случае присутствия ошибки выполняем следующие действия:&amp;lt;br /&amp;gt;&lt;br /&gt;
Декодирование основано на построении многочлена синдрома ошибки S(x) и отыскании соответствующего ему многочлена локаторов L(x).&amp;lt;br /&amp;gt;&lt;br /&gt;
Локаторы ошибок – это элементы поля Галуа, степень которых совпадает с позицией ошибки. Так, если искажён коэффициент при &amp;lt;math&amp;gt;x^{4}&amp;lt;/math&amp;gt;, то локатор этой ошибки равен &amp;lt;math&amp;gt;a^{4}&amp;lt;/math&amp;gt;, если искажён коэффициент при &amp;lt;math&amp;gt;x^{7}&amp;lt;/math&amp;gt; то локатор ошибки будет равен &amp;lt;math&amp;gt;a^{7}&amp;lt;/math&amp;gt; и т.п. (а – примитивный член, т.е. в нашем случае a=2).&lt;br /&gt;
Многочлен локаторов &amp;lt;math&amp;gt;L(x)&amp;lt;/math&amp;gt; – это многочлен, корни которого обратны локаторам ошибок. Таким образом, многочлен &amp;lt;math&amp;gt;L(x)&amp;lt;/math&amp;gt; должен иметь вид &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;L(x)=(1+xX_1 )(1+xX_2)..(1+xX_i)&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;X_1,X_2,..,X_i&amp;lt;/math&amp;gt; - локаторы ошибок&amp;lt;br /&amp;gt;&lt;br /&gt;
Ясно, что если этот многочлен будет найден, то мы легко сможем определить локаторы ошибок – для этого потребуется только определить его корни.&amp;lt;br /&amp;gt;&lt;br /&gt;
Для определения этого полинома сначала получают вспомогательный полином &amp;lt;math&amp;gt;S(x)&amp;lt;/math&amp;gt;, так называемый синдром ошибки. Коэффициенты синдрома ошибки получаются подстановкой степеней примитивного члена в остаток многочлен &amp;lt;math&amp;gt;r(x) = C(x) mod          g(x)&amp;lt;/math&amp;gt;:    &amp;lt;math&amp;gt;S_i=e(a^{i})&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Для нашего примера:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;S(1) = 1;&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;S(2) = 3;&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Между &amp;lt;math&amp;gt;L(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;S(x)&amp;lt;/math&amp;gt; существует соотношение&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;L(x)S(x)=W(x)modx^{N-K}&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;W(x)&amp;lt;/math&amp;gt; называется многочленом ошибок. Степень многочлена &amp;lt;math&amp;gt;W(x)&amp;lt;/math&amp;gt; не может превышать &amp;lt;math&amp;gt;t-1&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; – количество ошибок, то есть в максимальном случае &amp;lt;math&amp;gt;(N-K)/2-1&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt; &lt;br /&gt;
С учётом этого обстоятельства, а также учитывая, что свободный член &amp;lt;math&amp;gt;L(x):  L_0=1&amp;lt;/math&amp;gt; (ведь &amp;lt;math&amp;gt;L(x)=(1+xX_1 )(1+xX_2 )..(1+xX_i) )&amp;lt;/math&amp;gt; можно составить систему линейных уравнений.&lt;br /&gt;
&amp;lt;math&amp;gt;W(x)=&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;L_0 S_0&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;(L_0 S_1+L_1 S_0 )X+&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;(L_0 S_2+L_1 S_1+L_2 S_0 ) X^2+&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;(L_0 S_3+L_1 S_2+L_2 S_1+L_3 S_0 ) X^3+&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;...&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;(L_0 S_{N-K-1}+L_1 S_{N-K-2}..L_{(N-K)/2} S_{(N-K)/2-1}X^{N-K-1}&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;t = (N-K)/2&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Коэффициенты при степенях от 0 до t – 1 не равны нулю, при старших степенях должны быть нулевыми.&amp;lt;br /&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;L_0 S_t+L_1 S_{t-1}+L_2 S_{t-2}+L_3 S_{t-3}...L_t S_0  = 0&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;L_0 S_{t+1}+L_1 S_t+L_2 S_{t-1}+L_3 S_{t-2}...L_t S_1  = 0&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;L_0 S_{t+2}+L_1 S_{t+1}+L_2 S_t+L_3 S_{t-1}...L_t S_2  = 0&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\dots&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;L_0 S_{2t-1}+L_1 S_{2t-2}+L_2 S_{2t-3}+L_3 S_{2t-4}...L_t S_t  = 0&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Коэффициент &amp;lt;math&amp;gt;L_0&amp;lt;/math&amp;gt; известен, остальные необходимо найти, следовательно требуется составить t уравнений.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;L_1 S_{t-1}+L_2 S_{t-2}+L_3 S_{t-3}...L_t S_0  = S_t&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;L_1 S_t+L_2 S_{t-1}+L_3 S_{t-2}...L_t S_1  = S_{t+1}&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;L_1 S_{t+1}+L_2 S_t+L_3 S_{t-1}...L_t S_2  = S_{t+2}&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;...&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;L_1 S_{2t-2}+L_2 S_{2t-3}+L_3 S_{2t-4}...L_t S_t  = S_{2t-1}&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
В матричном виде:&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;M=&lt;br /&gt;
\quad\left\|\begin{array}{ccccc} &lt;br /&gt;
S_{t-1} &amp;amp;  S_{t-2} &amp;amp; S_{t-3} &amp;amp; \cdots &amp;amp; S_0\\&lt;br /&gt;
S_{t} &amp;amp;  S_{t-1} &amp;amp; S_{t-2} &amp;amp; \cdots &amp;amp; S_1\\&lt;br /&gt;
S_{t+1} &amp;amp;  S_{t} &amp;amp; S_{t-1} &amp;amp; \cdots &amp;amp; S_2\\&lt;br /&gt;
\cdots &amp;amp; \cdots &amp;amp; \cdots &amp;amp; \cdots &amp;amp; \cdots \\ &lt;br /&gt;
S_{2t-2} &amp;amp;  S_{2t-3} &amp;amp; S_{2t-4} &amp;amp; \cdots &amp;amp; S_t\\&lt;br /&gt;
\end{array}\right\|&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;V=\quad\left\|\begin{array}{c} &lt;br /&gt;
S_{t} \\&lt;br /&gt;
S_{t+1} \\&lt;br /&gt;
S_{t+2} \\&lt;br /&gt;
\cdots \\ &lt;br /&gt;
S_{2t-1} \\&lt;br /&gt;
\end{array}\right\|&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;L=\quad\left\|\begin{array}{c} &lt;br /&gt;
L_{1} \\&lt;br /&gt;
L_{2} \\&lt;br /&gt;
L_{3} \\&lt;br /&gt;
\cdots \\ &lt;br /&gt;
L_{t} \\&lt;br /&gt;
\end{array}\right\|&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;ML = V, \Rightarrow M^{-1}V&amp;lt;/math&amp;gt;&lt;br /&gt;
Например, для нашего примера – кода Рида-Соломона (6, 4) матрица M имеет вид:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; M = S_1&amp;lt;/math&amp;gt;  , а вектор   &amp;lt;math&amp;gt;V = S_2; &amp;lt;/math&amp;gt;   &amp;lt;math&amp;gt;  L(1) = S(2) / S(1) = 3 / 1 = 3 &amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Таким образом, вычисление полинома локаторов сводится к построению матрицы M, нахождению обратной ей и умножению на вектор V.&lt;br /&gt;
Обратная матрица получается так же, как и в обычной математике, например Жордановым методом. &lt;br /&gt;
После того, как полином &amp;lt;math&amp;gt;L(x)&amp;lt;/math&amp;gt; найден, следует найти его корни – они будут обратны к локаторам ошибок. &amp;lt;br /&amp;gt;&lt;br /&gt;
Для нашего примера многочлен локаторов &amp;lt;math&amp;gt;L(x) =1 + 3x &amp;lt;/math&amp;gt; имеет корень \frac{1}{3}, а обратный к нему  &amp;lt;math&amp;gt; 3 = 2^{4}&amp;lt;/math&amp;gt;, а значит позиция ошибки равна &amp;lt;math&amp;gt;x^{4}&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
После нахождения позиции ошибки,займемся нахождением значением ошибки:&amp;lt;br /&amp;gt;&lt;br /&gt;
Воспользуемся определением синдромной функции:&amp;lt;br /&amp;gt; &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;S(1) = r(\alpha) = e_1 L_1 + e_2 L_2 + ... + e_n L_n&amp;lt;/math&amp;gt;,&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;S(2) = r(\alpha) = e_1 L_1^{2} + e_2 L_2^{2} + ... + e_n L_n^{2}&amp;lt;/math&amp;gt;,&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;...&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;S(n) = r(\alpha) = e_1 L_1^{n} + e_2 L_2^{n} + ... + e_n L_n^{n}&amp;lt;/math&amp;gt;,&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt; где &amp;lt;math&amp;gt;e_1,e_2,..,e_n - &amp;lt;/math&amp;gt;значение ошибки. &amp;lt;math&amp;gt;L_1,L_2,..,L_n - &amp;lt;/math&amp;gt;позиция ошибки.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Для нашего кода &amp;lt;math&amp;gt;RS(6,4): S(1) = e_1 L_1; e_1 = S(1) / L_1 = 1 / 3 = 2^{0} / 2^{4} = 2^{11} = 14&amp;lt;/math&amp;gt; - позиция ошибки.&amp;lt;br /&amp;gt;Таким образом сформируем многочлен вычисленной ошибки &amp;lt;math&amp;gt;E'(x) = 14x^{4}&amp;lt;/math&amp;gt;, который совпадает с заданным &amp;lt;math&amp;gt;E(x)&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;/div&gt;</summary>
		<author><name>NikZ</name></author>	</entry>

	<entry>
		<id>https://vscripts.ru/w/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nikz</id>
		<title>Участник:Nikz</title>
		<link rel="alternate" type="text/html" href="https://vscripts.ru/w/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nikz"/>
				<updated>2014-06-16T15:49:50Z</updated>
		
		<summary type="html">&lt;p&gt;NikZ: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Пример коррекции ошибки с помощью кодов Рида - Соломона =&lt;br /&gt;
== Постановка задачи ==&lt;br /&gt;
В данной статье разбирается пример работы алгоритма коррекции ошибки для 16-битных строк. Строка разбивает на блоки длиной 4 бита и каждый блок представляет собой элемент поля Галуа GF&amp;lt;sub&amp;gt;16&amp;lt;/sub&amp;gt;. Необходимо отследить и исправить одиночную ошибку, внесённую в один из блоков.&lt;br /&gt;
&lt;br /&gt;
== Теоретические основы алгоритма ==&lt;br /&gt;
=== Поля Галуа ===&lt;br /&gt;
Операцию сложения определим как &amp;quot;исключающее ИЛИ&amp;quot; &amp;lt;math&amp;gt;(XOR)&amp;lt;/math&amp;gt;.Очевидно, что в таком случае операция сложения является обратной самой себе. Тогда операция умножения в двоичном виде будет выглядеть так:&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;math&amp;gt; \begin{matrix} *\underline{\begin{matrix}&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1 &amp;amp; 1 \\&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 1 &amp;amp; 1 &amp;amp; 0 \\&lt;br /&gt;
\end{matrix}}\\&lt;br /&gt;
+\underline{\begin{matrix}&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 1 &amp;amp; 1 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 1 &amp;amp; 1 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
\end{matrix}} \\&lt;br /&gt;
\begin{matrix}&lt;br /&gt;
 &amp;amp; 0 &amp;amp; 1 &amp;amp; 0 &amp;amp; 1 &amp;amp; 0 \\&lt;br /&gt;
\end{matrix} \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так можно умножать полиномы, в данном случае мы умножили:&lt;br /&gt;
&amp;lt;math&amp;gt; (x + 1) * (x^2 + x) = x^3 + x&amp;lt;/math&amp;gt;.&lt;br /&gt;
Определим также операцию деления чисел(или полиномов) с остатком – по аналогичным правилам, например:&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{110010}{101011}=011001 &amp;lt;/math&amp;gt;&lt;br /&gt;
или &amp;lt;math&amp;gt; \frac{x^5 + x^4 + x}{x^5 + x^3 + x + 1} = x^4 + x^3 + 1  &amp;lt;/math&amp;gt;&lt;br /&gt;
Теперь построим поле из 16 элементов &amp;lt;math&amp;gt; GF_{16} &amp;lt;/math&amp;gt;. Операцию сложения определена на XOR, Операция деления дополнена получением остатка по некоторому модулю.&lt;br /&gt;
Выберем в качестве модуля неприводимый полином &amp;lt;math&amp;gt; x^4+x+1 (10011) &amp;lt;/math&amp;gt;.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Возьмем единицу и будем последовательно умножать ее на 2 и рассмотрим числа, которые будут при этом &lt;br /&gt;
# &amp;lt;math&amp;gt;1= 2^0=0001 &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; 2^0*2=2^1=0010 _{mod 10011} = 2 = x^1 &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; 2^1*2=2^2=0100 _{mod 10011} = 4 = x^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; 2^2*2=2^3=1000 _{mod 10011} = 8 = x^3 &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; 2^3*2=2^4=10000 _{mod 10011} = 0011 = 3 = x+1 &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; 2^4*2=2^5=100000 _{mod 10011} = 0110 = 6 = x^2+x &amp;lt;/math&amp;gt;&lt;br /&gt;
и так далее.&amp;lt;br /&amp;gt;&lt;br /&gt;
'''Составим таблицу умножения'''&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Степень&lt;br /&gt;
! Результат&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 0001&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 2&lt;br /&gt;
| 0010&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 4&lt;br /&gt;
| 0100&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| 8&lt;br /&gt;
| 1000&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 3&lt;br /&gt;
| 0011&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| 6&lt;br /&gt;
| 0110&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| 12&lt;br /&gt;
| 1100&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| 11&lt;br /&gt;
| 1011&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 5&lt;br /&gt;
| 0101&lt;br /&gt;
|-&lt;br /&gt;
| 9&lt;br /&gt;
| 10&lt;br /&gt;
| 1010&lt;br /&gt;
|-&lt;br /&gt;
| 10&lt;br /&gt;
| 7&lt;br /&gt;
| 0111&lt;br /&gt;
|-&lt;br /&gt;
| 11&lt;br /&gt;
| 14&lt;br /&gt;
| 1110&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| 15&lt;br /&gt;
| 1111&lt;br /&gt;
|-&lt;br /&gt;
| 13&lt;br /&gt;
| 13&lt;br /&gt;
| 1101&lt;br /&gt;
|-&lt;br /&gt;
| 14&lt;br /&gt;
| 9&lt;br /&gt;
| 1001&lt;br /&gt;
|-&lt;br /&gt;
| 15&lt;br /&gt;
| 1&lt;br /&gt;
| 0001&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Таким образом, при дальнейшем умножении весь цикл повторится снова. Полученные степени двойки не сложно умножать между собой, например: &amp;lt;math&amp;gt; 13*15=2^{13}*2^{12}=2^{25 mod 15}=2^{10}=7 &amp;lt;/math&amp;gt;. Можно проверить результат,разделив &amp;lt;math&amp;gt; \frac{7}{13}=\frac{2^{10}}{2^{13}}=2^{-3 mod 15}=2^{12}=15 &amp;lt;/math&amp;gt;.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Таким образом, получили поле &amp;lt;math&amp;gt;GF_{16}&amp;lt;/math&amp;gt;, то есть для двоичных 4-разрядных чисел.'''&lt;br /&gt;
== Коды Рида - Соломона ==&lt;br /&gt;
При построении кода Рида-Соломона задается пара чисел N,K, где N-Общее количество символов, а К- «полезное» количество символов, N-K символов задают избыточный код, предназначенный для восстановления ошибок.&lt;br /&gt;
Такой код Рида-Соломона будет иметь «расстояние Хемминга» &amp;lt;math&amp;gt;D=N-K+1&amp;lt;/math&amp;gt;.&lt;br /&gt;
В соответствии с теорией кодирования, код, имеющий расстояние Хемминга &amp;lt;math&amp;gt;D=2t+1&amp;lt;/math&amp;gt;, позволяет восстанавливать t ошибок. Таким образом, если нам необходимо восстановить t ошибок, то общее количество символов сообщения &amp;lt;math&amp;gt;N=K+2t&amp;lt;/math&amp;gt;.&lt;br /&gt;
Сообщения при кодировании Рида-Соломона представляются полиномами.&lt;br /&gt;
Исходное сообщение представляется как коэффициенты полинома &amp;lt;math&amp;gt;p(x)&amp;lt;/math&amp;gt; степени &amp;lt;math&amp;gt;K-1&amp;lt;/math&amp;gt;, имеющего &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; коэффициентов.&amp;lt;br /&amp;gt;&lt;br /&gt;
Порождающий многочлен Рида-Соломона,&amp;lt;math&amp;gt;g(x)&amp;lt;/math&amp;gt;, строится следующий образом:&lt;br /&gt;
&amp;lt;math&amp;gt; g(x)=(x+2)(x+2^{2})..(x+2^{ D-1 } ) &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;2 - &amp;lt;/math&amp;gt; примитивный член поля. Нетрудно понять, что &amp;lt;math&amp;gt;2^{1},2^{2},..,2^{D-1}&amp;lt;/math&amp;gt; - корни этого многочлена.&amp;lt;br&amp;gt;&lt;br /&gt;
Например, построим порождающий многочлен кода Рида-Соломона с &amp;lt;math&amp;gt;N=15,K=9&amp;lt;/math&amp;gt;, способного исправлять до 3 ошибок &amp;lt;math&amp;gt;(15-9)/2=3&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;math&amp;gt;g(x)=(x+2)(x+2^{2} )(x+2^{3} )(x+2^{4} )(x+2^{5} )(x+2^{6} )=x^{6}+7x^{5}+9x^{4}+3x^{3}+12x^{2}+10x+12&amp;lt;/math&amp;gt;.     ''(Возведение в степень и умножения выполнены над полем GF&amp;lt;sub&amp;gt;16&amp;lt;/sub&amp;gt; )!''&lt;br /&gt;
== Кодирование Рида-Соломона ==&lt;br /&gt;
Кодирование Рида-Соломона будем производить систематическим кодом, это означает, что в закодированное сообщение будет содержать в себе в явном виде исходное сообщение. Каким образом это делается:&lt;br /&gt;
Сначала полином сдвигается на &amp;lt;math&amp;gt;N-K&amp;lt;/math&amp;gt; коэффициентов влево &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;p'(x)=p(x)x^{N-K}&amp;lt;/math&amp;gt; ,а потом вычисляется остаток от деления на порождающий полином и прибавляется к &amp;lt;math&amp;gt;p'(x)&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;C(x)=p'(x)+p'(x)mod g(x)&amp;lt;/math&amp;gt;. &amp;lt;br /&amp;gt;&lt;br /&gt;
Для систематического кого очевидно, что &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; старших коэффициентов полученного кода &amp;lt;math&amp;gt;C(x)&amp;lt;/math&amp;gt; содержат исходное сообщение. Это удобно при декодировании.&lt;br /&gt;
Закодированное сообщение &amp;lt;math&amp;gt;C(x)&amp;lt;/math&amp;gt; обладает очень важным свойством: оно без остатка делится на порождающий многочлен &amp;lt;math&amp;gt;g(x)&amp;lt;/math&amp;gt;.&amp;lt;br /&amp;gt;&lt;br /&gt;
'''Докажем это свойство:''' &amp;lt;br /&amp;gt;&lt;br /&gt;
Пусь &amp;lt;math&amp;gt;r(x)&amp;lt;/math&amp;gt;-остаток от деления &amp;lt;math&amp;gt;p'(x)&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;g(x)&amp;lt;/math&amp;gt;.&amp;lt;br /&amp;gt;&lt;br /&gt;
Тогда,&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;p'(x)=g(x)u(x)+r(x)&amp;lt;/math&amp;gt; &amp;lt;br /&amp;gt;&lt;br /&gt;
Итак,&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;r(x)=p'(x)mod g(x)&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Тогда&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;C(x)=p'(x)+p'(x)mod g(x)=g(x)u(x)+r(x)+r(x)&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Вспомним, что в арифметике поля Галуа сложения являются одновременно и вычитанием, тогда &amp;lt;math&amp;gt;r(x)+r(x)=0&amp;lt;/math&amp;gt;!Следовательно &amp;lt;math&amp;gt;C(x)&amp;lt;/math&amp;gt; делится на &amp;lt;math&amp;gt;g(x)&amp;lt;/math&amp;gt; без остатка.&amp;lt;br /&amp;gt;&lt;br /&gt;
Таким образом, &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;C(x) mod g(x)=0&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
В случае, если закодированное сообщение будет изменено, то это равенство будет нарушенным, не считая случая, когда ошибка окажется кратной &amp;lt;math&amp;gt;g(x)&amp;lt;/math&amp;gt;. Факт искажения можно рассматривать как прибавление к &amp;lt;math&amp;gt;C(x)&amp;lt;/math&amp;gt; некоторого полинома ошибки &amp;lt;math&amp;gt;E(x)&amp;lt;/math&amp;gt;.&amp;lt;br /&amp;gt;&lt;br /&gt;
'''Пример:'''&amp;lt;br /&amp;gt;&lt;br /&gt;
Рассмотрим кодирование информации. Пусть наше сообщение такое:&lt;br /&gt;
&amp;lt;math&amp;gt;12, 10, 12, 7&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Полином сообщения получается такой:&lt;br /&gt;
&amp;lt;math&amp;gt;I(x)=12x^{3}+10x^{2}+12x+7&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Умножаем на &amp;lt;math&amp;gt;x^{2}&amp;lt;/math&amp;gt;,получаем:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;I'(x)=12x^{5}+10x^{4}+12x^{3}+7x^{2}&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Делим на &amp;lt;math&amp;gt;g(x)&amp;lt;/math&amp;gt; и получаем остаток: &amp;lt;math&amp;gt;r(x)= x + 4 &amp;lt;/math&amp;gt; &amp;lt;br /&amp;gt;&lt;br /&gt;
В итоге получается полином закодированного сообщения: &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;C(x)=12x^{5}+10x^{4}+12x^{3}+7x^{2}+x+4&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
== Декодирование Рида-Соломона ==&lt;br /&gt;
Первым шагом необходимо выполнить деление полинома на порождающий полином &amp;lt;math&amp;gt;g(x)&amp;lt;/math&amp;gt;. Если остаток от деления равен 0, то сообщение не искажено и декодирование для систематического кода тривиально.&amp;lt;br /&amp;gt;&lt;br /&gt;
В случае же присутствия ошибки придется выполнить следующие действия:&amp;lt;br /&amp;gt;&lt;br /&gt;
Декодирование основано на построении многочлена синдрома ошибки S(x) и отыскании соответствующего ему многочлена локаторов L(x).&amp;lt;br /&amp;gt;&lt;br /&gt;
Локаторы ошибок – это элементы поля Галуа, степень которых совпадает с позицией ошибки. Так, если искажён коэффициент при &amp;lt;math&amp;gt;x^{4}&amp;lt;/math&amp;gt;, то локатор этой ошибки равен &amp;lt;math&amp;gt;a^{4}&amp;lt;/math&amp;gt;, если искажён коэффициент при &amp;lt;math&amp;gt;x^{7}&amp;lt;/math&amp;gt; то локатор ошибки будет равен &amp;lt;math&amp;gt;a^{7}&amp;lt;/math&amp;gt; и т.п. (а – примитивный член, т.е. в нашем случае a=2).&lt;br /&gt;
Многочлен локаторов &amp;lt;math&amp;gt;L(x)&amp;lt;/math&amp;gt; – это многочлен, корни которого обратны локаторам ошибок. Таким образом, многочлен &amp;lt;math&amp;gt;L(x)&amp;lt;/math&amp;gt; должен иметь вид &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;L(x)=(1+xX_1 )(1+xX_2)..(1+xX_i)&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;X_1,X_2,..,X_i&amp;lt;/math&amp;gt; - локаторы ошибок&amp;lt;br /&amp;gt;&lt;br /&gt;
Ясно, что если этот многочлен будет найден, то мы легко сможем определить локаторы ошибок – для этого потребуется только определить его корни.&amp;lt;br /&amp;gt;&lt;br /&gt;
Для определения этого полинома сначала получают вспомогательный полином &amp;lt;math&amp;gt;S(x)&amp;lt;/math&amp;gt;, так называемый синдром ошибки. Коэффициенты синдрома ошибки получаются подстановкой степеней примитивного члена в остаток многочлен &amp;lt;math&amp;gt;r(x) = C(x) mod          g(x)&amp;lt;/math&amp;gt;:    &amp;lt;math&amp;gt;S_i=e(a^{i})&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Между &amp;lt;math&amp;gt;L(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;S(x)&amp;lt;/math&amp;gt; существует соотношение&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;L(x)S(x)=W(x)modx^{N-K}&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;W(x)&amp;lt;/math&amp;gt; называется многочленом ошибок. Степень многочлена &amp;lt;math&amp;gt;W(x)&amp;lt;/math&amp;gt; не может превышать &amp;lt;math&amp;gt;t-1&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; – количество ошибок, то есть в максимальном случае &amp;lt;math&amp;gt;(N-K)/2-1&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt; &lt;br /&gt;
С учётом этого обстоятельства, а также учитывая, что свободный член &amp;lt;math&amp;gt;L(x):  L_0=1&amp;lt;/math&amp;gt; (ведь &amp;lt;math&amp;gt;L(x)=(1+xX_1 )(1+xX_2 )..(1+xX_i) )&amp;lt;/math&amp;gt; можно составить систему линейных уравнений.&lt;br /&gt;
&amp;lt;math&amp;gt;W(x)=&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;L_0 S_0&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;(L_0 S_1+L_1 S_0 )X+&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;(L_0 S_2+L_1 S_1+L_2 S_0 ) X^2+&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;(L_0 S_3+L_1 S_2+L_2 S_1+L_3 S_0 ) X^3+&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;...&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;(L_0 S_{N-K-1}+L_1 S_{N-K-2}..L_{(N-K)/2} S_{(N-K)/2-1}X^{N-K-1}&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;t = (N-K)/2&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Коэффициенты при степенях от 0 до t – 1 не равны нулю, при старших степенях должны быть нулевыми.&amp;lt;br /&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;L_0 S_t+L_1 S_{t-1}+L_2 S_{t-2}+L_3 S_{t-3}...L_t S_0  = 0&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;L_0 S_{t+1}+L_1 S_t+L_2 S_{t-1}+L_3 S_{t-2}...L_t S_1  = 0&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;L_0 S_{t+2}+L_1 S_{t+1}+L_2 S_t+L_3 S_{t-1}...L_t S_2  = 0&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\dots&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;L_0 S_{2t-1}+L_1 S_{2t-2}+L_2 S_{2t-3}+L_3 S_{2t-4}...L_t S_t  = 0&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Коэффициент &amp;lt;math&amp;gt;L_0&amp;lt;/math&amp;gt; известен, остальные необходимо найти, следовательно требуется составить t уравнений.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;L_1 S_{t-1}+L_2 S_{t-2}+L_3 S_{t-3}...L_t S_0  = S_t&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;L_1 S_t+L_2 S_{t-1}+L_3 S_{t-2}...L_t S_1  = S_{t+1}&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;L_1 S_{t+1}+L_2 S_t+L_3 S_{t-1}...L_t S_2  = S_{t+2}&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;...&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;L_1 S_{2t-2}+L_2 S_{2t-3}+L_3 S_{2t-4}...L_t S_t  = S_{2t-1}&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
В матричном виде:&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;M=&lt;br /&gt;
\quad\left\|\begin{array}{ccccc} &lt;br /&gt;
S_{t-1} &amp;amp;  S_{t-2} &amp;amp; S_{t-3} &amp;amp; \cdots &amp;amp; S_0\\&lt;br /&gt;
S_{t} &amp;amp;  S_{t-1} &amp;amp; S_{t-2} &amp;amp; \cdots &amp;amp; S_1\\&lt;br /&gt;
S_{t+1} &amp;amp;  S_{t} &amp;amp; S_{t-1} &amp;amp; \cdots &amp;amp; S_2\\&lt;br /&gt;
\cdots &amp;amp; \cdots &amp;amp; \cdots &amp;amp; \cdots &amp;amp; \cdots \\ &lt;br /&gt;
S_{2t-2} &amp;amp;  S_{2t-3} &amp;amp; S_{2t-4} &amp;amp; \cdots &amp;amp; S_t\\&lt;br /&gt;
\end{array}\right\|&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;V=\quad\left\|\begin{array}{c} &lt;br /&gt;
S_{t} \\&lt;br /&gt;
S_{t+1} \\&lt;br /&gt;
S_{t+2} \\&lt;br /&gt;
\cdots \\ &lt;br /&gt;
S_{2t-1} \\&lt;br /&gt;
\end{array}\right\|&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;L=\quad\left\|\begin{array}{c} &lt;br /&gt;
L_{1} \\&lt;br /&gt;
L_{2} \\&lt;br /&gt;
L_{3} \\&lt;br /&gt;
\cdots \\ &lt;br /&gt;
L_{t} \\&lt;br /&gt;
\end{array}\right\|&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;ML = V, \Rightarrow M^{-1}V&amp;lt;/math&amp;gt;&lt;br /&gt;
Например, для нашего примера – кода Рида-Соломона (6, 4) матрица M имеет вид:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; M = S_1&amp;lt;/math&amp;gt;  , а вектор   &amp;lt;math&amp;gt;V = S_2; &amp;lt;/math&amp;gt;   &amp;lt;math&amp;gt;  L(1) = S(2) / S(1)&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Таким образом, вычисление полинома локаторов сводится к построению матрицы M, нахождению обратной ей и умножению на вектор V.&lt;br /&gt;
Обратная матрица получается так же, как и в обычной математике, например Жордановым методом. &lt;br /&gt;
После того, как полином &amp;lt;math&amp;gt;L(x)&amp;lt;/math&amp;gt; найден, следует найти его корни – они будут обратны к локаторам ошибок. &amp;lt;br /&amp;gt;&lt;br /&gt;
После нахождения позиции ошибки,займемся нахождением значением ошибки:&amp;lt;br /&amp;gt;&lt;br /&gt;
Воспользуемся определением синдромной функции:&amp;lt;br /&amp;gt; &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;S(1) = r(\alpha) = e_1 L_1 + e_2 L_2 + ... + e_n L_n&amp;lt;/math&amp;gt;,&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;S(2) = r(\alpha) = e_1 L_1^{2} + e_2 L_2^{2} + ... + e_n L_n^{2}&amp;lt;/math&amp;gt;,&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;...&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;S(n) = r(\alpha) = e_1 L_1^{n} + e_2 L_2^{n} + ... + e_n L_n^{n}&amp;lt;/math&amp;gt;,&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt; где &amp;lt;math&amp;gt;e_1,e_2,..,e_n - &amp;lt;/math&amp;gt;значение ошибки. &amp;lt;math&amp;gt;L_1,L_2,..,L_n - &amp;lt;/math&amp;gt;позиция ошибки.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Для нашего кода &amp;lt;math&amp;gt;RS(6,4): S(1) = e_1 L_1; e_1 = S(1) / L_1&amp;lt;/math&amp;gt;&lt;/div&gt;</summary>
		<author><name>NikZ</name></author>	</entry>

	<entry>
		<id>https://vscripts.ru/w/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nikz</id>
		<title>Участник:Nikz</title>
		<link rel="alternate" type="text/html" href="https://vscripts.ru/w/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nikz"/>
				<updated>2014-06-16T15:21:51Z</updated>
		
		<summary type="html">&lt;p&gt;NikZ: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Пример коррекции ошибки с помощью кодов Рида - Соломона =&lt;br /&gt;
== Постановка задачи ==&lt;br /&gt;
В данной статье разбирается пример работы алгоритма коррекции ошибки для 16-битных строк. Строка разбивает на блоки длиной 4 бита и каждый блок представляет собой элемент поля Галуа GF&amp;lt;sub&amp;gt;16&amp;lt;/sub&amp;gt;. Необходимо отследить и исправить одиночную ошибку, внесённую в один из блоков.&lt;br /&gt;
&lt;br /&gt;
== Теоретические основы алгоритма ==&lt;br /&gt;
=== Поля Галуа ===&lt;br /&gt;
Операцию сложения определим как &amp;quot;исключающее ИЛИ&amp;quot; &amp;lt;math&amp;gt;(XOR)&amp;lt;/math&amp;gt;.Очевидно, что в таком случае операция сложения является обратной самой себе. Тогда операция умножения в двоичном виде будет выглядеть так:&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;math&amp;gt; \begin{matrix} *\underline{\begin{matrix}&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1 &amp;amp; 1 \\&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 1 &amp;amp; 1 &amp;amp; 0 \\&lt;br /&gt;
\end{matrix}}\\&lt;br /&gt;
+\underline{\begin{matrix}&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 1 &amp;amp; 1 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 1 &amp;amp; 1 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
\end{matrix}} \\&lt;br /&gt;
\begin{matrix}&lt;br /&gt;
 &amp;amp; 0 &amp;amp; 1 &amp;amp; 0 &amp;amp; 1 &amp;amp; 0 \\&lt;br /&gt;
\end{matrix} \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так можно умножать полиномы, в данном случае мы умножили:&lt;br /&gt;
&amp;lt;math&amp;gt; (x + 1) * (x^2 + x) = x^3 + x&amp;lt;/math&amp;gt;.&lt;br /&gt;
Определим также операцию деления чисел(или полиномов) с остатком – по аналогичным правилам, например:&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{110010}{101011}=011001 &amp;lt;/math&amp;gt;&lt;br /&gt;
или &amp;lt;math&amp;gt; \frac{x^5 + x^4 + x}{x^5 + x^3 + x + 1} = x^4 + x^3 + 1  &amp;lt;/math&amp;gt;&lt;br /&gt;
Теперь построим поле из 16 элементов &amp;lt;math&amp;gt; GF_{16} &amp;lt;/math&amp;gt;. Операцию сложения определена на XOR, Операция деления дополнена получением остатка по некоторому модулю.&lt;br /&gt;
Выберем в качестве модуля неприводимый полином &amp;lt;math&amp;gt; x^4+x+1 (10011) &amp;lt;/math&amp;gt;.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Возьмем единицу и будем последовательно умножать ее на 2 и рассмотрим числа, которые будут при этом &lt;br /&gt;
# &amp;lt;math&amp;gt;1= 2^0=0001 &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; 2^0*2=2^1=0010 _{mod 10011} = 2 = x^1 &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; 2^1*2=2^2=0100 _{mod 10011} = 4 = x^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; 2^2*2=2^3=1000 _{mod 10011} = 8 = x^3 &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; 2^3*2=2^4=10000 _{mod 10011} = 0011 = 3 = x+1 &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; 2^4*2=2^5=100000 _{mod 10011} = 0110 = 6 = x^2+x &amp;lt;/math&amp;gt;&lt;br /&gt;
и так далее.&amp;lt;br /&amp;gt;&lt;br /&gt;
'''Составим таблицу умножения'''&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Степень&lt;br /&gt;
! Результат&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 0001&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 2&lt;br /&gt;
| 0010&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 4&lt;br /&gt;
| 0100&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| 8&lt;br /&gt;
| 1000&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 3&lt;br /&gt;
| 0011&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| 6&lt;br /&gt;
| 0110&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| 12&lt;br /&gt;
| 1100&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| 11&lt;br /&gt;
| 1011&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 5&lt;br /&gt;
| 0101&lt;br /&gt;
|-&lt;br /&gt;
| 9&lt;br /&gt;
| 10&lt;br /&gt;
| 1010&lt;br /&gt;
|-&lt;br /&gt;
| 10&lt;br /&gt;
| 7&lt;br /&gt;
| 0111&lt;br /&gt;
|-&lt;br /&gt;
| 11&lt;br /&gt;
| 14&lt;br /&gt;
| 1110&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| 15&lt;br /&gt;
| 1111&lt;br /&gt;
|-&lt;br /&gt;
| 13&lt;br /&gt;
| 13&lt;br /&gt;
| 1101&lt;br /&gt;
|-&lt;br /&gt;
| 14&lt;br /&gt;
| 9&lt;br /&gt;
| 1001&lt;br /&gt;
|-&lt;br /&gt;
| 15&lt;br /&gt;
| 1&lt;br /&gt;
| 0001&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Таким образом, при дальнейшем умножении весь цикл повторится снова. Полученные степени двойки не сложно умножать между собой, например: &amp;lt;math&amp;gt; 13*15=2^{13}*2^{12}=2^{25 mod 15}=2^{10}=7 &amp;lt;/math&amp;gt;. Можно проверить результат,разделив &amp;lt;math&amp;gt; \frac{7}{13}=\frac{2^{10}}{2^{13}}=2^{-3 mod 15}=2^{12}=15 &amp;lt;/math&amp;gt;.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Таким образом, получили поле &amp;lt;math&amp;gt;GF_{16}&amp;lt;/math&amp;gt;, то есть для двоичных 4-разрядных чисел.'''&lt;br /&gt;
== Коды Рида - Соломона ==&lt;br /&gt;
При построении кода Рида-Соломона задается пара чисел N,K, где N-Общее количество символов, а К- «полезное» количество символов, N-K символов задают избыточный код, предназначенный для восстановления ошибок.&lt;br /&gt;
Такой код Рида-Соломона будет иметь «расстояние Хемминга» &amp;lt;math&amp;gt;D=N-K+1&amp;lt;/math&amp;gt;.&lt;br /&gt;
В соответствии с теорией кодирования, код, имеющий расстояние Хемминга &amp;lt;math&amp;gt;D=2t+1&amp;lt;/math&amp;gt;, позволяет восстанавливать t ошибок. Таким образом, если нам необходимо восстановить t ошибок, то общее количество символов сообщения &amp;lt;math&amp;gt;N=K+2t&amp;lt;/math&amp;gt;.&lt;br /&gt;
Сообщения при кодировании Рида-Соломона представляются полиномами.&lt;br /&gt;
Исходное сообщение представляется как коэффициенты полинома &amp;lt;math&amp;gt;p(x)&amp;lt;/math&amp;gt; степени &amp;lt;math&amp;gt;K-1&amp;lt;/math&amp;gt;, имеющего &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; коэффициентов.&amp;lt;br /&amp;gt;&lt;br /&gt;
Порождающий многочлен Рида-Соломона,&amp;lt;math&amp;gt;g(x)&amp;lt;/math&amp;gt;, строится следующий образом:&lt;br /&gt;
&amp;lt;math&amp;gt; g(x)=(x+2)(x+2^{2})..(x+2^{ D-1 } ) &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;2 - &amp;lt;/math&amp;gt; примитивный член поля. Нетрудно понять, что &amp;lt;math&amp;gt;2^{1},2^{2},..,2^{D-1}&amp;lt;/math&amp;gt; - корни этого многочлена.&amp;lt;br&amp;gt;&lt;br /&gt;
Например, построим порождающий многочлен кода Рида-Соломона с &amp;lt;math&amp;gt;N=15,K=9&amp;lt;/math&amp;gt;, способного исправлять до 3 ошибок &amp;lt;math&amp;gt;(15-9)/2=3&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;math&amp;gt;g(x)=(x+2)(x+2^{2} )(x+2^{3} )(x+2^{4} )(x+2^{5} )(x+2^{6} )=x^{6}+7x^{5}+9x^{4}+3x^{3}+12x^{2}+10x+12&amp;lt;/math&amp;gt;.     ''(Возведение в степень и умножения выполнены над полем GF&amp;lt;sub&amp;gt;16&amp;lt;/sub&amp;gt; )!''&lt;br /&gt;
== Кодирование Рида-Соломона ==&lt;br /&gt;
Кодирование Рида-Соломона будем производить систематическим кодом, это означает, что в закодированное сообщение будет содержать в себе в явном виде исходное сообщение. Каким образом это делается:&lt;br /&gt;
Сначала полином сдвигается на &amp;lt;math&amp;gt;N-K&amp;lt;/math&amp;gt; коэффициентов влево &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;p'(x)=p(x)x^{N-K}&amp;lt;/math&amp;gt; ,а потом вычисляется остаток от деления на порождающий полином и прибавляется к &amp;lt;math&amp;gt;p'(x)&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;C(x)=p'(x)+p'(x)mod g(x)&amp;lt;/math&amp;gt;. &amp;lt;br /&amp;gt;&lt;br /&gt;
Для систематического кого очевидно, что &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; старших коэффициентов полученного кода &amp;lt;math&amp;gt;C(x)&amp;lt;/math&amp;gt; содержат исходное сообщение. Это удобно при декодировании.&lt;br /&gt;
Закодированное сообщение &amp;lt;math&amp;gt;C(x)&amp;lt;/math&amp;gt; обладает очень важным свойством: оно без остатка делится на порождающий многочлен &amp;lt;math&amp;gt;g(x)&amp;lt;/math&amp;gt;.&amp;lt;br /&amp;gt;&lt;br /&gt;
'''Докажем это свойство:''' &amp;lt;br /&amp;gt;&lt;br /&gt;
Пусь &amp;lt;math&amp;gt;r(x)&amp;lt;/math&amp;gt;-остаток от деления &amp;lt;math&amp;gt;p'(x)&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;g(x)&amp;lt;/math&amp;gt;.&amp;lt;br /&amp;gt;&lt;br /&gt;
Тогда,&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;p'(x)=g(x)u(x)+r(x)&amp;lt;/math&amp;gt; &amp;lt;br /&amp;gt;&lt;br /&gt;
Итак,&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;r(x)=p'(x)mod g(x)&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Тогда&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;C(x)=p'(x)+p'(x)mod g(x)=g(x)u(x)+r(x)+r(x)&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Вспомним, что в арифметике поля Галуа сложения являются одновременно и вычитанием, тогда &amp;lt;math&amp;gt;r(x)+r(x)=0&amp;lt;/math&amp;gt;!Следовательно &amp;lt;math&amp;gt;C(x)&amp;lt;/math&amp;gt; делится на &amp;lt;math&amp;gt;g(x)&amp;lt;/math&amp;gt; без остатка.&amp;lt;br /&amp;gt;&lt;br /&gt;
Таким образом, &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;C(x) mod g(x)=0&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
В случае, если закодированное сообщение будет изменено, то это равенство будет нарушенным, не считая случая, когда ошибка окажется кратной &amp;lt;math&amp;gt;g(x)&amp;lt;/math&amp;gt;. Факт искажения можно рассматривать как прибавление к &amp;lt;math&amp;gt;C(x)&amp;lt;/math&amp;gt; некоторого полинома ошибки &amp;lt;math&amp;gt;E(x)&amp;lt;/math&amp;gt;.&amp;lt;br /&amp;gt;&lt;br /&gt;
'''Пример:'''&amp;lt;br /&amp;gt;&lt;br /&gt;
Рассмотрим кодирование информации. Пусть наше сообщение такое:&lt;br /&gt;
&amp;lt;math&amp;gt;12, 10, 12, 7&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Полином сообщения получается такой:&lt;br /&gt;
&amp;lt;math&amp;gt;I(x)=12x^{3}+10x^{2}+12x+7&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Умножаем на &amp;lt;math&amp;gt;x^{2}&amp;lt;/math&amp;gt;,получаем:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;I'(x)=12x^{5}+10x^{4}+12x^{3}+7x^{2}&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Делим на &amp;lt;math&amp;gt;g(x)&amp;lt;/math&amp;gt; и получаем остаток: &amp;lt;math&amp;gt;r(x)= x + 4 &amp;lt;/math&amp;gt; &amp;lt;br /&amp;gt;&lt;br /&gt;
В итоге получается полином закодированного сообщения: &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;C(x)=12x^{5}+10x^{4}+12x^{3}+7x^{2}+x+4&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
== Декодирование Рида-Соломона ==&lt;br /&gt;
Первым шагом необходимо выполнить деление полинома на порождающий полином &amp;lt;math&amp;gt;g(x)&amp;lt;/math&amp;gt;. Если остаток от деления равен 0, то сообщение не искажено и декодирование для систематического кода тривиально.&amp;lt;br /&amp;gt;&lt;br /&gt;
В случае же присутствия ошибки придется выполнить следующие действия:&amp;lt;br /&amp;gt;&lt;br /&gt;
Декодирование основано на построении многочлена синдрома ошибки S(x) и отыскании соответствующего ему многочлена локаторов L(x).&amp;lt;br /&amp;gt;&lt;br /&gt;
Локаторы ошибок – это элементы поля Галуа, степень которых совпадает с позицией ошибки. Так, если искажён коэффициент при &amp;lt;math&amp;gt;x^{4}&amp;lt;/math&amp;gt;, то локатор этой ошибки равен &amp;lt;math&amp;gt;a^{4}&amp;lt;/math&amp;gt;, если искажён коэффициент при &amp;lt;math&amp;gt;x^{7}&amp;lt;/math&amp;gt; то локатор ошибки будет равен &amp;lt;math&amp;gt;a^{7}&amp;lt;/math&amp;gt; и т.п. (а – примитивный член, т.е. в нашем случае a=2).&lt;br /&gt;
Многочлен локаторов &amp;lt;math&amp;gt;L(x)&amp;lt;/math&amp;gt; – это многочлен, корни которого обратны локаторам ошибок. Таким образом, многочлен &amp;lt;math&amp;gt;L(x)&amp;lt;/math&amp;gt; должен иметь вид &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;L(x)=(1+xX_1 )(1+xX_2)..(1+xX_i)&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;X_1,X_2,..,X_i&amp;lt;/math&amp;gt; - локаторы ошибок&amp;lt;br /&amp;gt;&lt;br /&gt;
Ясно, что если этот многочлен будет найден, то мы легко сможем определить локаторы ошибок – для этого потребуется только определить его корни.&amp;lt;br /&amp;gt;&lt;br /&gt;
Для определения этого полинома сначала получают вспомогательный полином &amp;lt;math&amp;gt;S(x)&amp;lt;/math&amp;gt;, так называемый синдром ошибки. Коэффициенты синдрома ошибки получаются подстановкой степеней примитивного члена в остаток многочлен &amp;lt;math&amp;gt;r(x) = C(x) mod          g(x)&amp;lt;/math&amp;gt;:    &amp;lt;math&amp;gt;S_i=e(a^{i})&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Между &amp;lt;math&amp;gt;L(x)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;S(x)&amp;lt;/math&amp;gt; существует соотношение&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;L(x)S(x)=W(x)modx^{N-K}&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;W(x)&amp;lt;/math&amp;gt; называется многочленом ошибок. Степень многочлена &amp;lt;math&amp;gt;W(x)&amp;lt;/math&amp;gt; не может превышать &amp;lt;math&amp;gt;t-1&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; – количество ошибок, то есть в максимальном случае &amp;lt;math&amp;gt;(N-K)/2-1&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt; &lt;br /&gt;
С учётом этого обстоятельства, а также учитывая, что свободный член &amp;lt;math&amp;gt;L(x):  L_0=1&amp;lt;/math&amp;gt; (ведь &amp;lt;math&amp;gt;L(x)=(1+xX_1 )(1+xX_2 )..(1+xX_i) )&amp;lt;/math&amp;gt; можно составить систему линейных уравнений.&lt;br /&gt;
&amp;lt;math&amp;gt;W(x)=&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;L_0 S_0&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;(L_0 S_1+L_1 S_0 )X+&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;(L_0 S_2+L_1 S_1+L_2 S_0 ) X^2+&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;(L_0 S_3+L_1 S_2+L_2 S_1+L_3 S_0 ) X^3+&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;...&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;(L_0 S_{N-K-1}+L_1 S_{N-K-2}..L_{(N-K)/2} S_{(N-K)/2-1}X^{N-K-1}&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;t = (N-K)/2&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Коэффициенты при степенях от 0 до t – 1 не равны нулю, при старших степенях должны быть нулевыми.&amp;lt;br /&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;L_0 S_t+L_1 S_{t-1}+L_2 S_{t-2}+L_3 S_{t-3}...L_t S_0  = 0&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;L_0 S_{t+1}+L_1 S_t+L_2 S_{t-1}+L_3 S_{t-2}...L_t S_1  = 0&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;L_0 S_{t+2}+L_1 S_{t+1}+L_2 S_t+L_3 S_{t-1}...L_t S_2  = 0&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\dots&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;L_0 S_{2t-1}+L_1 S_{2t-2}+L_2 S_{2t-3}+L_3 S_{2t-4}...L_t S_t  = 0&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Коэффициент &amp;lt;math&amp;gt;L_0&amp;lt;/math&amp;gt; известен, остальные необходимо найти, следовательно требуется составить t уравнений.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;L_1 S_{t-1}+L_2 S_{t-2}+L_3 S_{t-3}...L_t S_0  = S_t&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;L_1 S_t+L_2 S_{t-1}+L_3 S_{t-2}...L_t S_1  = S_{t+1}&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;L_1 S_{t+1}+L_2 S_t+L_3 S_{t-1}...L_t S_2  = S_{t+2}&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;...&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;L_1 S_{2t-2}+L_2 S_{2t-3}+L_3 S_{2t-4}...L_t S_t  = S_{2t-1}&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
В матричном виде:&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;M=&lt;br /&gt;
\quad\left\|\begin{array}{ccccc} &lt;br /&gt;
S_{t-1} &amp;amp;  S_{t-2} &amp;amp; S_{t-3} &amp;amp; \cdots &amp;amp; S_0\\&lt;br /&gt;
S_{t} &amp;amp;  S_{t-1} &amp;amp; S_{t-2} &amp;amp; \cdots &amp;amp; S_1\\&lt;br /&gt;
S_{t+1} &amp;amp;  S_{t} &amp;amp; S_{t-1} &amp;amp; \cdots &amp;amp; S_2\\&lt;br /&gt;
\cdots &amp;amp; \cdots &amp;amp; \cdots &amp;amp; \cdots &amp;amp; \cdots \\ &lt;br /&gt;
S_{2t-2} &amp;amp;  S_{2t-3} &amp;amp; S_{2t-4} &amp;amp; \cdots &amp;amp; S_t\\&lt;br /&gt;
\end{array}\right\|&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;V=\quad\left\|\begin{array}{c} &lt;br /&gt;
S_{t} \\&lt;br /&gt;
S_{t+1} \\&lt;br /&gt;
S_{t+2} \\&lt;br /&gt;
\cdots \\ &lt;br /&gt;
S_{2t-1} \\&lt;br /&gt;
\end{array}\right\|&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;L=\quad\left\|\begin{array}{c} &lt;br /&gt;
L_{1} \\&lt;br /&gt;
L_{2} \\&lt;br /&gt;
L_{3} \\&lt;br /&gt;
\cdots \\ &lt;br /&gt;
L_{t} \\&lt;br /&gt;
\end{array}\right\|&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;ML = V, \Rightarrow M^{-1}V&amp;lt;/math&amp;gt;&lt;br /&gt;
Например, для нашего примера – кода Рида-Соломона (6, 4) матрица M имеет вид:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; M = S_1&amp;lt;/math&amp;gt;  , а вектор   &amp;lt;math&amp;gt;V = S_2; &amp;lt;/math&amp;gt;   &amp;lt;math&amp;gt;  L(1) = S(2) / S(1)&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Таким образом, вычисление полинома локаторов сводится к построению матрицы M, нахождению обратной ей и умножению на вектор V.&lt;br /&gt;
Обратная матрица получается так же, как и в обычной математике, например Жордановым методом. &lt;br /&gt;
После того, как полином &amp;lt;math&amp;gt;L(x)&amp;lt;/math&amp;gt; найден, следует найти его корни – они будут обратны к локаторам ошибок. &amp;lt;br /&amp;gt;&lt;br /&gt;
После нахождения позиции ошибки,займемся нахождением значением ошибки:&amp;lt;br /&amp;gt;&lt;br /&gt;
Воспользуемся определением синдромной функции:&amp;lt;br /&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;S(1) = r(\alpha) = e_1 L_1 + e_2 L_2 + ... + e_n L_n&amp;lt;/math&amp;gt;,&amp;lt;br /&amp;gt; где &amp;lt;math&amp;gt;e_1,e_2,..,e_n - &amp;lt;/math&amp;gt;значение ошибки. &amp;lt;math&amp;gt;L_1,L_2,..,L_n - &amp;lt;/math&amp;gt;позиция ошибки.&amp;lt;br /&amp;gt;&lt;br /&gt;
Для нашего кода &amp;lt;math&amp;gt;RS(6,4): S(1) = e_1 L_1; e_1 = S(1) / L_1&amp;lt;/math&amp;gt;&lt;/div&gt;</summary>
		<author><name>NikZ</name></author>	</entry>

	<entry>
		<id>https://vscripts.ru/w/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nikz</id>
		<title>Участник:Nikz</title>
		<link rel="alternate" type="text/html" href="https://vscripts.ru/w/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nikz"/>
				<updated>2014-06-15T16:47:24Z</updated>
		
		<summary type="html">&lt;p&gt;NikZ: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Пример коррекции ошибки с помощью кодов Рида - Соломона =&lt;br /&gt;
== Постановка задачи ==&lt;br /&gt;
В данной статье разбирается пример работы алгоритма коррекции ошибки для 16-битных строк. Строка разбивает на блоки длиной 4 бита и каждый блок представляет собой элемент поля Галуа GF&amp;lt;sub&amp;gt;16&amp;lt;/sub&amp;gt;. Необходимо отследить и исправить одиночную ошибку, внесённую в один из блоков.&lt;br /&gt;
&lt;br /&gt;
== Теоретические основы алгоритма ==&lt;br /&gt;
=== Поля Галуа ===&lt;br /&gt;
Операцию сложения определим как &amp;quot;исключающее ИЛИ&amp;quot; &amp;lt;math&amp;gt;(XOR)&amp;lt;/math&amp;gt;.Очевидно, что в таком случае операция сложения является обратной самой себе. Тогда операция умножения в двоичном виде будет выглядеть так:&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;math&amp;gt; \begin{matrix} *\underline{\begin{matrix}&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1 &amp;amp; 1 \\&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 1 &amp;amp; 1 &amp;amp; 0 \\&lt;br /&gt;
\end{matrix}}\\&lt;br /&gt;
+\underline{\begin{matrix}&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 1 &amp;amp; 1 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 1 &amp;amp; 1 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
\end{matrix}} \\&lt;br /&gt;
\begin{matrix}&lt;br /&gt;
 &amp;amp; 0 &amp;amp; 1 &amp;amp; 0 &amp;amp; 1 &amp;amp; 0 \\&lt;br /&gt;
\end{matrix} \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так можно умножать полиномы, в данном случае мы умножили:&lt;br /&gt;
&amp;lt;math&amp;gt; (x + 1) * (x^2 + x) = x^3 + x&amp;lt;/math&amp;gt;.&lt;br /&gt;
Определим также операцию деления чисел(или полиномов) с остатком – по аналогичным правилам, например:&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{110010}{101011}=011001 &amp;lt;/math&amp;gt;&lt;br /&gt;
или &amp;lt;math&amp;gt; \frac{x^5 + x^4 + x}{x^5 + x^3 + x + 1} = x^4 + x^3 + 1  &amp;lt;/math&amp;gt;&lt;br /&gt;
Теперь построим поле из 16 элементов &amp;lt;math&amp;gt; GF_{16} &amp;lt;/math&amp;gt;. Операцию сложения определена на XOR, Операция деления дополнена получением остатка по некоторому модулю.&lt;br /&gt;
Выберем в качестве модуля неприводимый полином &amp;lt;math&amp;gt; x^4+x+1 (10011) &amp;lt;/math&amp;gt;.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Возьмем единицу и будем последовательно умножать ее на 2 и рассмотрим числа, которые будут при этом &lt;br /&gt;
# &amp;lt;math&amp;gt;1= 2^0=0001 &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; 2^0*2=2^1=0010 _{mod 10011} = 2 = x^1 &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; 2^1*2=2^2=0100 _{mod 10011} = 4 = x^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; 2^2*2=2^3=1000 _{mod 10011} = 8 = x^3 &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; 2^3*2=2^4=10000 _{mod 10011} = 0011 = 3 = x+1 &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; 2^4*2=2^5=100000 _{mod 10011} = 0110 = 6 = x^2+x &amp;lt;/math&amp;gt;&lt;br /&gt;
и так далее.&amp;lt;br /&amp;gt;&lt;br /&gt;
'''Составим таблицу умножения'''&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Степень&lt;br /&gt;
! Результат&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 0001&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 2&lt;br /&gt;
| 0010&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 4&lt;br /&gt;
| 0100&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| 8&lt;br /&gt;
| 1000&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 3&lt;br /&gt;
| 0011&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| 6&lt;br /&gt;
| 0110&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| 12&lt;br /&gt;
| 1100&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| 11&lt;br /&gt;
| 1011&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 5&lt;br /&gt;
| 0101&lt;br /&gt;
|-&lt;br /&gt;
| 9&lt;br /&gt;
| 10&lt;br /&gt;
| 1010&lt;br /&gt;
|-&lt;br /&gt;
| 10&lt;br /&gt;
| 7&lt;br /&gt;
| 0111&lt;br /&gt;
|-&lt;br /&gt;
| 11&lt;br /&gt;
| 14&lt;br /&gt;
| 1110&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| 15&lt;br /&gt;
| 1111&lt;br /&gt;
|-&lt;br /&gt;
| 13&lt;br /&gt;
| 13&lt;br /&gt;
| 1101&lt;br /&gt;
|-&lt;br /&gt;
| 14&lt;br /&gt;
| 9&lt;br /&gt;
| 1001&lt;br /&gt;
|-&lt;br /&gt;
| 15&lt;br /&gt;
| 1&lt;br /&gt;
| 0001&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Таким образом, при дальнейшем умножении весь цикл повторится снова. Полученные степени двойки не сложно умножать между собой, например: &amp;lt;math&amp;gt; 13*15=2^{13}*2^{12}=2^{25 mod 15}=2^{10}=7 &amp;lt;/math&amp;gt;. Можно проверить результат,разделив &amp;lt;math&amp;gt; \frac{7}{13}=\frac{2^{10}}{2^{13}}=2^{-3 mod 15}=2^{12}=15 &amp;lt;/math&amp;gt;.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Таким образом, получили поле &amp;lt;math&amp;gt;GF_{16}&amp;lt;/math&amp;gt;, то есть для двоичных 4-разрядных чисел.'''&lt;br /&gt;
== Коды Рида - Соломона ==&lt;br /&gt;
При построении кода Рида-Соломона задается пара чисел N,K, где N-Общее количество символов, а К- «полезное» количество символов, N-K символов задают избыточный код, предназначенный для восстановления ошибок.&lt;br /&gt;
Такой код Рида-Соломона будет иметь «расстояние Хемминга» &amp;lt;math&amp;gt;D=N-K+1&amp;lt;/math&amp;gt;.&lt;br /&gt;
В соответствии с теорией кодирования, код, имеющий расстояние Хемминга &amp;lt;math&amp;gt;D=2t+1&amp;lt;/math&amp;gt;, позволяет восстанавливать t ошибок. Таким образом, если нам необходимо восстановить t ошибок, то общее количество символов сообщения &amp;lt;math&amp;gt;N=K+2t&amp;lt;/math&amp;gt;.&lt;br /&gt;
Сообщения при кодировании Рида-Соломона представляются полиномами.&lt;br /&gt;
Исходное сообщение представляется как коэффициенты полинома &amp;lt;math&amp;gt;p(x)&amp;lt;/math&amp;gt; степени &amp;lt;math&amp;gt;K-1&amp;lt;/math&amp;gt;, имеющего &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; коэффициентов.&amp;lt;br /&amp;gt;&lt;br /&gt;
Порождающий многочлен Рида-Соломона,&amp;lt;math&amp;gt;g(x)&amp;lt;/math&amp;gt;, строится следующий образом:&lt;br /&gt;
&amp;lt;math&amp;gt; g(x)=(x+2)(x+2^{2})..(x+2^{ D-1 } ) &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;2 - &amp;lt;/math&amp;gt; примитивный член поля. Нетрудно понять, что &amp;lt;math&amp;gt;2^{1},2^{2},..,2^{D-1}&amp;lt;/math&amp;gt; - корни этого многочлена.&amp;lt;br&amp;gt;&lt;br /&gt;
Например, построим порождающий многочлен кода Рида-Соломона с &amp;lt;math&amp;gt;N=15,K=9&amp;lt;/math&amp;gt;, способного исправлять до 3 ошибок &amp;lt;math&amp;gt;(15-9)/2=3&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;math&amp;gt;g(x)=(x+2)(x+2^{2} )(x+2^{3} )(x+2^{4} )(x+2^{5} )(x+2^{6} )=x^{6}+7x^{5}+9x^{4}+3x^{3}+12x^{2}+10x+12&amp;lt;/math&amp;gt;.     ''(Возведение в степень и умножения выполнены над полем GF&amp;lt;sub&amp;gt;16&amp;lt;/sub&amp;gt; )!''&lt;br /&gt;
== Кодирование Рида-Соломона ==&lt;br /&gt;
Кодирование Рида-Соломона будем производить систематическим кодом, это означает, что в закодированное сообщение будет содержать в себе в явном виде исходное сообщение. Каким образом это делается:&lt;br /&gt;
Сначала полином сдвигается на &amp;lt;math&amp;gt;N-K&amp;lt;/math&amp;gt; коэффициентов влево &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;p'(x)=p(x)x^{N-K}&amp;lt;/math&amp;gt; ,а потом вычисляется остаток от деления на порождающий полином и прибавляется к &amp;lt;math&amp;gt;p'(x)&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;C(x)=p'(x)+p'(x)mod g(x)&amp;lt;/math&amp;gt;. &amp;lt;br /&amp;gt;&lt;br /&gt;
Для систематического кого очевидно, что &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; старших коэффициентов полученного кода &amp;lt;math&amp;gt;C(x)&amp;lt;/math&amp;gt; содержат исходное сообщение. Это удобно при декодировании.&lt;br /&gt;
Закодированное сообщение &amp;lt;math&amp;gt;C(x)&amp;lt;/math&amp;gt; обладает очень важным свойством: оно без остатка делится на порождающий многочлен &amp;lt;math&amp;gt;g(x)&amp;lt;/math&amp;gt;.&amp;lt;br /&amp;gt;&lt;br /&gt;
'''Докажем это свойство:''' &amp;lt;br /&amp;gt;&lt;br /&gt;
Пусь &amp;lt;math&amp;gt;r(x)&amp;lt;/math&amp;gt;-остаток от деления &amp;lt;math&amp;gt;p'(x)&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;g(x)&amp;lt;/math&amp;gt;.&amp;lt;br /&amp;gt;&lt;br /&gt;
Тогда,&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;p'(x)=g(x)u(x)+r(x)&amp;lt;/math&amp;gt; &amp;lt;br /&amp;gt;&lt;br /&gt;
Итак,&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;r(x)=p'(x)mod g(x)&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Тогда&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;C(x)=p'(x)+p'(x)mod g(x)=g(x)u(x)+r(x)+r(x)&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Вспомним, что в арифметике поля Галуа сложения являются одновременно и вычитанием, тогда &amp;lt;math&amp;gt;r(x)+r(x)=0&amp;lt;/math&amp;gt;!Следовательно &amp;lt;math&amp;gt;C(x)&amp;lt;/math&amp;gt; делится на &amp;lt;math&amp;gt;g(x)&amp;lt;/math&amp;gt; без остатка.&amp;lt;br /&amp;gt;&lt;br /&gt;
Таким образом, &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;C(x) mod g(x)=0&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
В случае, если закодированное сообщение будет изменено, то это равенство будет нарушенным, не считая случая, когда ошибка окажется кратной &amp;lt;math&amp;gt;g(x)&amp;lt;/math&amp;gt;. Факт искажения можно рассматривать как прибавление к &amp;lt;math&amp;gt;C(x)&amp;lt;/math&amp;gt; некоторого полинома ошибки &amp;lt;math&amp;gt;E(x)&amp;lt;/math&amp;gt;.&amp;lt;br /&amp;gt;&lt;br /&gt;
'''Пример:'''&amp;lt;br /&amp;gt;&lt;br /&gt;
Рассмотрим кодирование информации. Пусть наше сообщение такое:&lt;br /&gt;
&amp;lt;math&amp;gt;12, 10, 12, 7&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Полином сообщения получается такой:&lt;br /&gt;
&amp;lt;math&amp;gt;I(x)=12x^{3}+10x^{2}+12x+7&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Умножаем на &amp;lt;math&amp;gt;x^{2}&amp;lt;/math&amp;gt;,получаем:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;I'(x)=12x^{5}+10x^{4}+12x^{3}+7x^{2}&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Делим на &amp;lt;math&amp;gt;g(x)&amp;lt;/math&amp;gt; и получаем остаток: &amp;lt;math&amp;gt;r(x)= x + 4 &amp;lt;/math&amp;gt; &amp;lt;br /&amp;gt;&lt;br /&gt;
В итоге получается полином закодированного сообщения: &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;C(x)=12x^{5}+10x^{4}+12x^{3}+7x^{2}+x+4&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
== Декодирование Рида-Соломона ==&lt;br /&gt;
Первым шагом необходимо выполнить деление полинома на порождающий полином &amp;lt;math&amp;gt;g(x)&amp;lt;/math&amp;gt;. Если остаток от деления равен 0, то сообщение не искажено и декодирование для систематического кода тривиально.&amp;lt;br /&amp;gt;&lt;br /&gt;
В случае же присутствия ошибки придется выполнить следующие действия:&amp;lt;br /&amp;gt;&lt;br /&gt;
Декодирование основано на построении многочлена синдрома ошибки S(x) и отыскании соответствующего ему многочлена локаторов L(x).&amp;lt;br /&amp;gt;&lt;br /&gt;
Локаторы ошибок – это элементы поля Галуа, степень которых совпадает с позицией ошибки. Так, если искажён коэффициент при &amp;lt;math&amp;gt;x^{4}&amp;lt;/math&amp;gt;, то локатор этой ошибки равен &amp;lt;math&amp;gt;a^{4}&amp;lt;/math&amp;gt;, если искажён коэффициент при &amp;lt;math&amp;gt;x^{7}&amp;lt;/math&amp;gt; то локатор ошибки будет равен &amp;lt;math&amp;gt;a^{7}&amp;lt;/math&amp;gt; и т.п. (а – примитивный член, т.е. в нашем случае a=2).&lt;br /&gt;
Многочлен локаторов &amp;lt;math&amp;gt;L(x)&amp;lt;/math&amp;gt; – это многочлен, корни которого обратны локаторам ошибок. Таким образом, многочлен &amp;lt;math&amp;gt;L(x)&amp;lt;/math&amp;gt; должен иметь вид &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;L(x)=(1+xX_1 )(1+xX_2)..(1+xX_i)&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;X_1,X_2,..,X_i&amp;lt;/math&amp;gt; - локаторы ошибок&amp;lt;br /&amp;gt;&lt;br /&gt;
Ясно, что если этот многочлен будет найден, то мы легко сможем определить локаторы ошибок – для этого потребуется только определить его корни.&amp;lt;br /&amp;gt;&lt;br /&gt;
Для определения этого полинома сначала получают вспомогательный полином &amp;lt;math&amp;gt;S(x)&amp;lt;/math&amp;gt;, так называемый синдром ошибки. Коэффициенты синдрома ошибки получаются подстановкой степеней примитивного члена в остаток многочлен &amp;lt;math&amp;gt;r(x)=C(x)mod g(x)&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;S_i=e(a^{i})&amp;lt;/math&amp;gt;&lt;/div&gt;</summary>
		<author><name>NikZ</name></author>	</entry>

	<entry>
		<id>https://vscripts.ru/w/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nikz</id>
		<title>Участник:Nikz</title>
		<link rel="alternate" type="text/html" href="https://vscripts.ru/w/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nikz"/>
				<updated>2014-06-15T15:59:38Z</updated>
		
		<summary type="html">&lt;p&gt;NikZ: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Пример коррекции ошибки с помощью кодов Рида - Соломона =&lt;br /&gt;
== Постановка задачи ==&lt;br /&gt;
В данной статье разбирается пример работы алгоритма коррекции ошибки для 16-битных строк. Строка разбивает на блоки длиной 4 бита и каждый блок представляет собой элемент поля Галуа GF&amp;lt;sub&amp;gt;16&amp;lt;/sub&amp;gt;. Необходимо отследить и исправить одиночную ошибку, внесённую в один из блоков.&lt;br /&gt;
&lt;br /&gt;
== Теоретические основы алгоритма ==&lt;br /&gt;
=== Поля Галуа ===&lt;br /&gt;
Операцию сложения определим как &amp;quot;исключающее ИЛИ&amp;quot; &amp;lt;math&amp;gt;(XOR)&amp;lt;/math&amp;gt;.Очевидно, что в таком случае операция сложения является обратной самой себе. Тогда операция умножения в двоичном виде будет выглядеть так:&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;math&amp;gt; \begin{matrix} *\underline{\begin{matrix}&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1 &amp;amp; 1 \\&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 1 &amp;amp; 1 &amp;amp; 0 \\&lt;br /&gt;
\end{matrix}}\\&lt;br /&gt;
+\underline{\begin{matrix}&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 1 &amp;amp; 1 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 1 &amp;amp; 1 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
\end{matrix}} \\&lt;br /&gt;
\begin{matrix}&lt;br /&gt;
 &amp;amp; 0 &amp;amp; 1 &amp;amp; 0 &amp;amp; 1 &amp;amp; 0 \\&lt;br /&gt;
\end{matrix} \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так можно умножать полиномы, в данном случае мы умножили:&lt;br /&gt;
&amp;lt;math&amp;gt; (x + 1) * (x^2 + x) = x^3 + x&amp;lt;/math&amp;gt;.&lt;br /&gt;
Определим также операцию деления чисел(или полиномов) с остатком – по аналогичным правилам, например:&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{110010}{101011}=011001 &amp;lt;/math&amp;gt;&lt;br /&gt;
или &amp;lt;math&amp;gt; \frac{x^5 + x^4 + x}{x^5 + x^3 + x + 1} = x^4 + x^3 + 1  &amp;lt;/math&amp;gt;&lt;br /&gt;
Теперь построим поле из 16 элементов &amp;lt;math&amp;gt; GF_{16} &amp;lt;/math&amp;gt;. Операцию сложения определена на XOR, Операция деления дополнена получением остатка по некоторому модулю.&lt;br /&gt;
Выберем в качестве модуля неприводимый полином &amp;lt;math&amp;gt; x^4+x+1 (10011) &amp;lt;/math&amp;gt;.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Возьмем единицу и будем последовательно умножать ее на 2 и рассмотрим числа, которые будут при этом &lt;br /&gt;
# &amp;lt;math&amp;gt;1= 2^0=0001 &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; 2^0*2=2^1=0010 _{mod 10011} = 2 = x^1 &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; 2^1*2=2^2=0100 _{mod 10011} = 4 = x^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; 2^2*2=2^3=1000 _{mod 10011} = 8 = x^3 &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; 2^3*2=2^4=10000 _{mod 10011} = 0011 = 3 = x+1 &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; 2^4*2=2^5=100000 _{mod 10011} = 0110 = 6 = x^2+x &amp;lt;/math&amp;gt;&lt;br /&gt;
и так далее.&amp;lt;br /&amp;gt;&lt;br /&gt;
'''Составим таблицу умножения'''&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Степень&lt;br /&gt;
! Результат&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 0001&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 2&lt;br /&gt;
| 0010&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 4&lt;br /&gt;
| 0100&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| 8&lt;br /&gt;
| 1000&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 3&lt;br /&gt;
| 0011&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| 6&lt;br /&gt;
| 0110&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| 12&lt;br /&gt;
| 1100&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| 11&lt;br /&gt;
| 1011&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 5&lt;br /&gt;
| 0101&lt;br /&gt;
|-&lt;br /&gt;
| 9&lt;br /&gt;
| 10&lt;br /&gt;
| 1010&lt;br /&gt;
|-&lt;br /&gt;
| 10&lt;br /&gt;
| 7&lt;br /&gt;
| 0111&lt;br /&gt;
|-&lt;br /&gt;
| 11&lt;br /&gt;
| 14&lt;br /&gt;
| 1110&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| 15&lt;br /&gt;
| 1111&lt;br /&gt;
|-&lt;br /&gt;
| 13&lt;br /&gt;
| 13&lt;br /&gt;
| 1101&lt;br /&gt;
|-&lt;br /&gt;
| 14&lt;br /&gt;
| 9&lt;br /&gt;
| 1001&lt;br /&gt;
|-&lt;br /&gt;
| 15&lt;br /&gt;
| 1&lt;br /&gt;
| 0001&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Таким образом, при дальнейшем умножении весь цикл повторится снова. Полученные степени двойки не сложно умножать между собой, например: &amp;lt;math&amp;gt; 13*15=2^{13}*2^{12}=2^{25 mod 15}=2^{10}=7 &amp;lt;/math&amp;gt;. Можно проверить результат,разделив &amp;lt;math&amp;gt; \frac{7}{13}=\frac{2^{10}}{2^{13}}=2^{-3 mod 15}=2^{12}=15 &amp;lt;/math&amp;gt;.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Таким образом, получили поле &amp;lt;math&amp;gt;GF_{16}&amp;lt;/math&amp;gt;, то есть для двоичных 4-разрядных чисел.'''&lt;br /&gt;
== Коды Рида - Соломона ==&lt;br /&gt;
При построении кода Рида-Соломона задается пара чисел N,K, где N-Общее количество символов, а К- «полезное» количество символов, N-K символов задают избыточный код, предназначенный для восстановления ошибок.&lt;br /&gt;
Такой код Рида-Соломона будет иметь «расстояние Хемминга» &amp;lt;math&amp;gt;D=N-K+1&amp;lt;/math&amp;gt;.&lt;br /&gt;
В соответствии с теорией кодирования, код, имеющий расстояние Хемминга &amp;lt;math&amp;gt;D=2t+1&amp;lt;/math&amp;gt;, позволяет восстанавливать t ошибок. Таким образом, если нам необходимо восстановить t ошибок, то общее количество символов сообщения &amp;lt;math&amp;gt;N=K+2t&amp;lt;/math&amp;gt;.&lt;br /&gt;
Сообщения при кодировании Рида-Соломона представляются полиномами.&lt;br /&gt;
Исходное сообщение представляется как коэффициенты полинома &amp;lt;math&amp;gt;p(x)&amp;lt;/math&amp;gt; степени &amp;lt;math&amp;gt;K-1&amp;lt;/math&amp;gt;, имеющего &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; коэффициентов.&amp;lt;br /&amp;gt;&lt;br /&gt;
Порождающий многочлен Рида-Соломона,&amp;lt;math&amp;gt;g(x)&amp;lt;/math&amp;gt;, строится следующий образом:&lt;br /&gt;
&amp;lt;math&amp;gt; g(x)=(x+2)(x+2^{2})..(x+2^{ D-1 } ) &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;2 - &amp;lt;/math&amp;gt; примитивный член поля. Нетрудно понять, что &amp;lt;math&amp;gt;2^{1},2^{2},..,2^{D-1}&amp;lt;/math&amp;gt; - корни этого многочлена.&amp;lt;br&amp;gt;&lt;br /&gt;
Например, построим порождающий многочлен кода Рида-Соломона с &amp;lt;math&amp;gt;N=15,K=9&amp;lt;/math&amp;gt;, способного исправлять до 3 ошибок &amp;lt;math&amp;gt;(15-9)/2=3&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;math&amp;gt;g(x)=(x+2)(x+2^{2} )(x+2^{3} )(x+2^{4} )(x+2^{5} )(x+2^{6} )=x^{6}+7x^{5}+9x^{4}+3x^{3}+12x^{2}+10x+12&amp;lt;/math&amp;gt;.     ''(Возведение в степень и умножения выполнены над полем GF&amp;lt;sub&amp;gt;16&amp;lt;/sub&amp;gt; )!''&lt;br /&gt;
== Кодирование Рида-Соломона ==&lt;br /&gt;
Кодирование Рида-Соломона будем производить систематическим кодом, это означает, что в закодированное сообщение будет содержать в себе в явном виде исходное сообщение. Каким образом это делается:&lt;br /&gt;
Сначала полином сдвигается на &amp;lt;math&amp;gt;N-K&amp;lt;/math&amp;gt; коэффициентов влево &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;p'(x)=p(x)x^{N-K}&amp;lt;/math&amp;gt; ,а потом вычисляется остаток от деления на порождающий полином и прибавляется к &amp;lt;math&amp;gt;p'(x)&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;C(x)=p'(x)+p'(x)mod g(x)&amp;lt;/math&amp;gt;. &amp;lt;br /&amp;gt;&lt;br /&gt;
Для систематического кого очевидно, что &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; старших коэффициентов полученного кода &amp;lt;math&amp;gt;C(x)&amp;lt;/math&amp;gt; содержат исходное сообщение. Это удобно при декодировании.&lt;br /&gt;
Закодированное сообщение &amp;lt;math&amp;gt;C(x)&amp;lt;/math&amp;gt; обладает очень важным свойством: оно без остатка делится на порождающий многочлен &amp;lt;math&amp;gt;g(x)&amp;lt;/math&amp;gt;.&amp;lt;br /&amp;gt;&lt;br /&gt;
'''Докажем это свойство:''' &amp;lt;br /&amp;gt;&lt;br /&gt;
Пусь &amp;lt;math&amp;gt;r(x)&amp;lt;/math&amp;gt;-остаток от деления &amp;lt;math&amp;gt;p'(x)&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;g(x)&amp;lt;/math&amp;gt;.&amp;lt;br /&amp;gt;&lt;br /&gt;
Тогда,&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;p'(x)=g(x)u(x)+r(x)&amp;lt;/math&amp;gt; &amp;lt;br /&amp;gt;&lt;br /&gt;
Итак,&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;r(x)=p'(x)mod g(x)&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Тогда&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;C(x)=p'(x)+p'(x)mod g(x)=g(x)u(x)+r(x)+r(x)&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Вспомним, что в арифметике поля Галуа сложения являются одновременно и вычитанием, тогда &amp;lt;math&amp;gt;r(x)+r(x)=0&amp;lt;/math&amp;gt;!Следовательно &amp;lt;math&amp;gt;C(x)&amp;lt;/math&amp;gt; делится на &amp;lt;math&amp;gt;g(x)&amp;lt;/math&amp;gt; без остатка.&amp;lt;br /&amp;gt;&lt;br /&gt;
Таким образом, &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;C(x) mod g(x)=0&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
В случае, если закодированное сообщение будет изменено, то это равенство будет нарушенным, не считая случая, когда ошибка окажется кратной &amp;lt;math&amp;gt;g(x)&amp;lt;/math&amp;gt;. Факт искажения можно рассматривать как прибавление к &amp;lt;math&amp;gt;C(x)&amp;lt;/math&amp;gt; некоторого полинома ошибки &amp;lt;math&amp;gt;E(x)&amp;lt;/math&amp;gt;.&amp;lt;br /&amp;gt;&lt;br /&gt;
'''Пример:'''&amp;lt;br /&amp;gt;&lt;br /&gt;
Рассмотрим кодирование информации. Пусть наше сообщение такое:&lt;br /&gt;
&amp;lt;math&amp;gt;12, 10, 12, 7&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Полином сообщения получается такой:&lt;br /&gt;
&amp;lt;math&amp;gt;I(x)=12x^{3}+10x^{2}+12x+7&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Умножаем на &amp;lt;math&amp;gt;x^{2}&amp;lt;/math&amp;gt;,получаем:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;I'(x)=12x^{5}+10x^{4}+12x^{3}+7x^{2}&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Делим на &amp;lt;math&amp;gt;g(x)&amp;lt;/math&amp;gt; и получаем остаток: &amp;lt;math&amp;gt;r(x)= x + 4 &amp;lt;/math&amp;gt; &amp;lt;br /&amp;gt;&lt;br /&gt;
В итоге получается полином закодированного сообщения: &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;C(x)=12x^{5}+10x^{4}+12x^{3}+7x^{2}+x+4&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
== Декодирование Рида-Соломона ==&lt;/div&gt;</summary>
		<author><name>NikZ</name></author>	</entry>

	<entry>
		<id>https://vscripts.ru/w/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nikz</id>
		<title>Участник:Nikz</title>
		<link rel="alternate" type="text/html" href="https://vscripts.ru/w/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nikz"/>
				<updated>2014-06-15T14:19:26Z</updated>
		
		<summary type="html">&lt;p&gt;NikZ: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Пример коррекции ошибки с помощью кодов Рида - Соломона =&lt;br /&gt;
== Постановка задачи ==&lt;br /&gt;
В данной статье разбирается пример работы алгоритма коррекции ошибки для 16-битных строк. Строка разбивает на блоки длиной 4 бита и каждый блок представляет собой элемент поля Галуа GF&amp;lt;sub&amp;gt;16&amp;lt;/sub&amp;gt;. Необходимо отследить и исправить одиночную ошибку, внесённую в один из блоков.&lt;br /&gt;
&lt;br /&gt;
== Теоретические основы алгоритма ==&lt;br /&gt;
=== Поля Галуа ===&lt;br /&gt;
Операцию сложения определим как &amp;quot;исключающее ИЛИ&amp;quot; &amp;lt;math&amp;gt;(XOR)&amp;lt;/math&amp;gt;.Очевидно, что в таком случае операция сложения является обратной самой себе. Тогда операция умножения в двоичном виде будет выглядеть так:&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;math&amp;gt; \begin{matrix} *\underline{\begin{matrix}&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1 &amp;amp; 1 \\&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 1 &amp;amp; 1 &amp;amp; 0 \\&lt;br /&gt;
\end{matrix}}\\&lt;br /&gt;
+\underline{\begin{matrix}&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 1 &amp;amp; 1 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 1 &amp;amp; 1 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
\end{matrix}} \\&lt;br /&gt;
\begin{matrix}&lt;br /&gt;
 &amp;amp; 0 &amp;amp; 1 &amp;amp; 0 &amp;amp; 1 &amp;amp; 0 \\&lt;br /&gt;
\end{matrix} \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так можно умножать полиномы, в данном случае мы умножили:&lt;br /&gt;
&amp;lt;math&amp;gt; (x + 1) * (x^2 + x) = x^3 + x&amp;lt;/math&amp;gt;.&lt;br /&gt;
Определим также операцию деления чисел(или полиномов) с остатком – по аналогичным правилам, например:&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{110010}{101011}=011001 &amp;lt;/math&amp;gt;&lt;br /&gt;
или &amp;lt;math&amp;gt; \frac{x^5 + x^4 + x}{x^5 + x^3 + x + 1} = x^4 + x^3 + 1  &amp;lt;/math&amp;gt;&lt;br /&gt;
Теперь построим поле из 16 элементов &amp;lt;math&amp;gt; GF_{16} &amp;lt;/math&amp;gt;. Операцию сложения определена на XOR, Операция деления дополнена получением остатка по некоторому модулю.&lt;br /&gt;
Выберем в качестве модуля неприводимый полином &amp;lt;math&amp;gt; x^4+x+1 (10011) &amp;lt;/math&amp;gt;.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Возьмем единицу и будем последовательно умножать ее на 2 и рассмотрим числа, которые будут при этом &lt;br /&gt;
# &amp;lt;math&amp;gt;1= 2^0=0001 &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; 2^0*2=2^1=0010 _{mod 10011} = 2 = x^1 &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; 2^1*2=2^2=0100 _{mod 10011} = 4 = x^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; 2^2*2=2^3=1000 _{mod 10011} = 8 = x^3 &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; 2^3*2=2^4=10000 _{mod 10011} = 0011 = 3 = x+1 &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; 2^4*2=2^5=100000 _{mod 10011} = 0110 = 6 = x^2+x &amp;lt;/math&amp;gt;&lt;br /&gt;
и так далее.&amp;lt;br /&amp;gt;&lt;br /&gt;
'''Составим таблицу умножения'''&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Степень&lt;br /&gt;
! Результат&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 0001&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 2&lt;br /&gt;
| 0010&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 4&lt;br /&gt;
| 0100&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| 8&lt;br /&gt;
| 1000&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 3&lt;br /&gt;
| 0011&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| 6&lt;br /&gt;
| 0110&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| 12&lt;br /&gt;
| 1100&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| 11&lt;br /&gt;
| 1011&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 5&lt;br /&gt;
| 0101&lt;br /&gt;
|-&lt;br /&gt;
| 9&lt;br /&gt;
| 10&lt;br /&gt;
| 1010&lt;br /&gt;
|-&lt;br /&gt;
| 10&lt;br /&gt;
| 7&lt;br /&gt;
| 0111&lt;br /&gt;
|-&lt;br /&gt;
| 11&lt;br /&gt;
| 14&lt;br /&gt;
| 1110&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| 15&lt;br /&gt;
| 1111&lt;br /&gt;
|-&lt;br /&gt;
| 13&lt;br /&gt;
| 13&lt;br /&gt;
| 1101&lt;br /&gt;
|-&lt;br /&gt;
| 14&lt;br /&gt;
| 9&lt;br /&gt;
| 1001&lt;br /&gt;
|-&lt;br /&gt;
| 15&lt;br /&gt;
| 1&lt;br /&gt;
| 0001&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Таким образом, при дальнейшем умножении весь цикл повторится снова. Полученные степени двойки не сложно умножать между собой, например: &amp;lt;math&amp;gt; 13*15=2^{13}*2^{12}=2^{25 mod 15}=2^{10}=7 &amp;lt;/math&amp;gt;. Можно проверить результат,разделив &amp;lt;math&amp;gt; \frac{7}{13}=\frac{2^{10}}{2^{13}}=2^{-3 mod 15}=2^{12}=15 &amp;lt;/math&amp;gt;.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Таким образом, получили поле &amp;lt;math&amp;gt;GF_{16}&amp;lt;/math&amp;gt;, то есть для двоичных 4-разрядных чисел.'''&lt;br /&gt;
== Коды Рида - Соломона ==&lt;br /&gt;
При построении кода Рида-Соломона задается пара чисел N,K, где N-Общее количество символов, а К- «полезное» количество символов, N-K символов задают избыточный код, предназначенный для восстановления ошибок.&lt;br /&gt;
Такой код Рида-Соломона будет иметь «расстояние Хемминга» &amp;lt;math&amp;gt;D=N-K+1&amp;lt;/math&amp;gt;.&lt;br /&gt;
В соответствии с теорией кодирования, код, имеющий расстояние Хемминга &amp;lt;math&amp;gt;D=2t+1&amp;lt;/math&amp;gt;, позволяет восстанавливать t ошибок. Таким образом, если нам необходимо восстановить t ошибок, то общее количество символов сообщения &amp;lt;math&amp;gt;N=K+2t&amp;lt;/math&amp;gt;.&lt;br /&gt;
Сообщения при кодировании Рида-Соломона представляются полиномами.&lt;br /&gt;
Исходное сообщение представляется как коэффициенты полинома &amp;lt;math&amp;gt;p(x)&amp;lt;/math&amp;gt; степени &amp;lt;math&amp;gt;K-1&amp;lt;/math&amp;gt;, имеющего &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; коэффициентов.&amp;lt;br /&amp;gt;&lt;br /&gt;
Порождающий многочлен Рида-Соломона,&amp;lt;math&amp;gt;g(x)&amp;lt;/math&amp;gt;, строится следующий образом:&lt;br /&gt;
&amp;lt;math&amp;gt; g(x)=(x+2)(x+2^{2})..(x+2^{ D-1 } ) &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;2 - &amp;lt;/math&amp;gt; примитивный член поля. Нетрудно понять, что &amp;lt;math&amp;gt;2^{1},2^{2},..,2^{D-1}&amp;lt;/math&amp;gt; - корни этого многочлена.&amp;lt;br&amp;gt;&lt;br /&gt;
Например, построим порождающий многочлен кода Рида-Соломона с &amp;lt;math&amp;gt;N=15,K=9&amp;lt;/math&amp;gt;, способного исправлять до 3 ошибок &amp;lt;math&amp;gt;(15-9)/2=3&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;math&amp;gt;g(x)=(x+2)(x+2^{2} )(x+2^{3} )(x+2^{4} )(x+2^{5} )(x+2^{6} )=x^{6}+7x^{5}+9x^{4}+3x^{3}+12x^{2}+10x+12&amp;lt;/math&amp;gt;.     ''(Возведение в степень и умножения выполнены над полем GF&amp;lt;sub&amp;gt;16&amp;lt;/sub&amp;gt; )!''&lt;br /&gt;
== Кодирование Рида-Соломона ==&lt;br /&gt;
Кодирование Рида-Соломона будем производить систематическим кодом, это означает, что в закодированное сообщение будет содержать в себе в явном виде исходное сообщение. Каким образом это делается:&lt;br /&gt;
Сначала полином сдвигается на &amp;lt;math&amp;gt;N-K&amp;lt;/math&amp;gt; коэффициентов влево &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;p'(x)=p(x)x^{N-K}&amp;lt;/math&amp;gt; ,а потом вычисляется остаток от деления на порождающий полином и прибавляется к &amp;lt;math&amp;gt;p'(x)&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;C(x)=p'(x)+p'(x)mod g(x)&amp;lt;/math&amp;gt;. &amp;lt;br /&amp;gt;&lt;br /&gt;
Для систематического кого очевидно, что &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; старших коэффициентов полученного кода &amp;lt;math&amp;gt;C(x)&amp;lt;/math&amp;gt; содержат исходное сообщение. Это удобно при декодировании.&lt;br /&gt;
Закодированное сообщение &amp;lt;math&amp;gt;C(x)&amp;lt;/math&amp;gt; обладает очень важным свойством: оно без остатка делится на порождающий многочлен &amp;lt;math&amp;gt;g(x)&amp;lt;/math&amp;gt;.&amp;lt;br /&amp;gt;&lt;br /&gt;
'''Докажем это свойство:''' &amp;lt;br /&amp;gt;&lt;br /&gt;
Пусь &amp;lt;math&amp;gt;r(x)&amp;lt;/math&amp;gt;-остаток от деления &amp;lt;math&amp;gt;p'(x)&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;g(x)&amp;lt;/math&amp;gt;.&amp;lt;br /&amp;gt;&lt;br /&gt;
Тогда,&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;p'(x)=g(x)u(x)+r(x)&amp;lt;/math&amp;gt; &amp;lt;br /&amp;gt;&lt;br /&gt;
Итак,&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;r(x)=p'(x)mod g(x)&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Тогда&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;C(x)=p'(x)+p'(x)mod g(x)=g(x)u(x)+r(x)+r(x)&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Вспомним, что в арифметике поля Галуа сложения являются одновременно и вычитанием, тогда &amp;lt;math&amp;gt;r(x)+r(x)=0&amp;lt;/math&amp;gt;!Следовательно &amp;lt;math&amp;gt;C(x)&amp;lt;/math&amp;gt; делится на &amp;lt;math&amp;gt;g(x)&amp;lt;/math&amp;gt; без остатка.&amp;lt;br /&amp;gt;&lt;br /&gt;
Таким образом, &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;C(x) mod g(x)=0&amp;lt;/math&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
В случае, если закодированное сообщение будет изменено, то это равенство будет нарушенным, не считая случая, когда ошибка окажется кратной &amp;lt;math&amp;gt;g(x)&amp;lt;/math&amp;gt;. Факт искажения можно рассматривать как прибавление к &amp;lt;math&amp;gt;C(x)&amp;lt;/math&amp;gt; некоторого полинома ошибки &amp;lt;math&amp;gt;E(x)&amp;lt;/math&amp;gt;.&amp;lt;br /&amp;gt;&lt;br /&gt;
'''Пример:'''&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
== Декодирование Рида-Соломона ==&lt;/div&gt;</summary>
		<author><name>NikZ</name></author>	</entry>

	<entry>
		<id>https://vscripts.ru/w/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nikz</id>
		<title>Участник:Nikz</title>
		<link rel="alternate" type="text/html" href="https://vscripts.ru/w/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nikz"/>
				<updated>2014-06-15T14:03:11Z</updated>
		
		<summary type="html">&lt;p&gt;NikZ: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Пример коррекции ошибки с помощью кодов Рида - Соломона =&lt;br /&gt;
== Постановка задачи ==&lt;br /&gt;
В данной статье разбирается пример работы алгоритма коррекции ошибки для 16-битных строк. Строка разбивает на блоки длиной 4 бита и каждый блок представляет собой элемент поля Галуа GF&amp;lt;sub&amp;gt;16&amp;lt;/sub&amp;gt;. Необходимо отследить и исправить одиночную ошибку, внесённую в один из блоков.&lt;br /&gt;
&lt;br /&gt;
== Теоретические основы алгоритма ==&lt;br /&gt;
=== Поля Галуа ===&lt;br /&gt;
Операцию сложения определим как &amp;quot;исключающее ИЛИ&amp;quot; &amp;lt;math&amp;gt;(XOR)&amp;lt;/math&amp;gt;.Очевидно, что в таком случае операция сложения является обратной самой себе. Тогда операция умножения в двоичном виде будет выглядеть так:&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;math&amp;gt; \begin{matrix} *\underline{\begin{matrix}&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1 &amp;amp; 1 \\&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 1 &amp;amp; 1 &amp;amp; 0 \\&lt;br /&gt;
\end{matrix}}\\&lt;br /&gt;
+\underline{\begin{matrix}&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 1 &amp;amp; 1 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 1 &amp;amp; 1 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
\end{matrix}} \\&lt;br /&gt;
\begin{matrix}&lt;br /&gt;
 &amp;amp; 0 &amp;amp; 1 &amp;amp; 0 &amp;amp; 1 &amp;amp; 0 \\&lt;br /&gt;
\end{matrix} \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так можно умножать полиномы, в данном случае мы умножили:&lt;br /&gt;
&amp;lt;math&amp;gt; (x + 1) * (x^2 + x) = x^3 + x&amp;lt;/math&amp;gt;.&lt;br /&gt;
Определим также операцию деления чисел(или полиномов) с остатком – по аналогичным правилам, например:&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{110010}{101011}=011001 &amp;lt;/math&amp;gt;&lt;br /&gt;
или &amp;lt;math&amp;gt; \frac{x^5 + x^4 + x}{x^5 + x^3 + x + 1} = x^4 + x^3 + 1  &amp;lt;/math&amp;gt;&lt;br /&gt;
Теперь построим поле из 16 элементов &amp;lt;math&amp;gt; GF_{16} &amp;lt;/math&amp;gt;. Операцию сложения определена на XOR, Операция деления дополнена получением остатка по некоторому модулю.&lt;br /&gt;
Выберем в качестве модуля неприводимый полином &amp;lt;math&amp;gt; x^4+x+1 (10011) &amp;lt;/math&amp;gt;.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Возьмем единицу и будем последовательно умножать ее на 2 и рассмотрим числа, которые будут при этом &lt;br /&gt;
# &amp;lt;math&amp;gt;1= 2^0=0001 &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; 2^0*2=2^1=0010 _{mod 10011} = 2 = x^1 &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; 2^1*2=2^2=0100 _{mod 10011} = 4 = x^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; 2^2*2=2^3=1000 _{mod 10011} = 8 = x^3 &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; 2^3*2=2^4=10000 _{mod 10011} = 0011 = 3 = x+1 &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; 2^4*2=2^5=100000 _{mod 10011} = 0110 = 6 = x^2+x &amp;lt;/math&amp;gt;&lt;br /&gt;
и так далее.&amp;lt;br /&amp;gt;&lt;br /&gt;
'''Составим таблицу умножения'''&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Степень&lt;br /&gt;
! Результат&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 0001&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 2&lt;br /&gt;
| 0010&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 4&lt;br /&gt;
| 0100&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| 8&lt;br /&gt;
| 1000&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 3&lt;br /&gt;
| 0011&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| 6&lt;br /&gt;
| 0110&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| 12&lt;br /&gt;
| 1100&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| 11&lt;br /&gt;
| 1011&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 5&lt;br /&gt;
| 0101&lt;br /&gt;
|-&lt;br /&gt;
| 9&lt;br /&gt;
| 10&lt;br /&gt;
| 1010&lt;br /&gt;
|-&lt;br /&gt;
| 10&lt;br /&gt;
| 7&lt;br /&gt;
| 0111&lt;br /&gt;
|-&lt;br /&gt;
| 11&lt;br /&gt;
| 14&lt;br /&gt;
| 1110&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| 15&lt;br /&gt;
| 1111&lt;br /&gt;
|-&lt;br /&gt;
| 13&lt;br /&gt;
| 13&lt;br /&gt;
| 1101&lt;br /&gt;
|-&lt;br /&gt;
| 14&lt;br /&gt;
| 9&lt;br /&gt;
| 1001&lt;br /&gt;
|-&lt;br /&gt;
| 15&lt;br /&gt;
| 1&lt;br /&gt;
| 0001&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Таким образом, при дальнейшем умножении весь цикл повторится снова. Полученные степени двойки не сложно умножать между собой, например: &amp;lt;math&amp;gt; 13*15=2^{13}*2^{12}=2^{25 mod 15}=2^{10}=7 &amp;lt;/math&amp;gt;. Можно проверить результат,разделив &amp;lt;math&amp;gt; \frac{7}{13}=\frac{2^{10}}{2^{13}}=2^{-3 mod 15}=2^{12}=15 &amp;lt;/math&amp;gt;.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Таким образом, получили поле &amp;lt;math&amp;gt;GF_{16}&amp;lt;/math&amp;gt;, то есть для двоичных 4-разрядных чисел.'''&lt;br /&gt;
== Коды Рида - Соломона ==&lt;br /&gt;
При построении кода Рида-Соломона задается пара чисел N,K, где N-Общее количество символов, а К- «полезное» количество символов, N-K символов задают избыточный код, предназначенный для восстановления ошибок.&lt;br /&gt;
Такой код Рида-Соломона будет иметь «расстояние Хемминга» &amp;lt;math&amp;gt;D=N-K+1&amp;lt;/math&amp;gt;.&lt;br /&gt;
В соответствии с теорией кодирования, код, имеющий расстояние Хемминга &amp;lt;math&amp;gt;D=2t+1&amp;lt;/math&amp;gt;, позволяет восстанавливать t ошибок. Таким образом, если нам необходимо восстановить t ошибок, то общее количество символов сообщения &amp;lt;math&amp;gt;N=K+2t&amp;lt;/math&amp;gt;.&lt;br /&gt;
Сообщения при кодировании Рида-Соломона представляются полиномами.&lt;br /&gt;
Исходное сообщение представляется как коэффициенты полинома &amp;lt;math&amp;gt;p(x)&amp;lt;/math&amp;gt; степени &amp;lt;math&amp;gt;K-1&amp;lt;/math&amp;gt;, имеющего &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; коэффициентов.&amp;lt;br /&amp;gt;&lt;br /&gt;
Порождающий многочлен Рида-Соломона,&amp;lt;math&amp;gt;g(x)&amp;lt;/math&amp;gt;, строится следующий образом:&lt;br /&gt;
&amp;lt;math&amp;gt; g(x)=(x+2)(x+2^{2})..(x+2^{ D-1 } ) &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;2 - &amp;lt;/math&amp;gt; примитивный член поля. Нетрудно понять, что &amp;lt;math&amp;gt;2^{1},2^{2},..,2^{D-1}&amp;lt;/math&amp;gt; - корни этого многочлена.&amp;lt;br&amp;gt;&lt;br /&gt;
Например, построим порождающий многочлен кода Рида-Соломона с &amp;lt;math&amp;gt;N=15,K=9&amp;lt;/math&amp;gt;, способного исправлять до 3 ошибок &amp;lt;math&amp;gt;(15-9)/2=3&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;math&amp;gt;g(x)=(x+2)(x+2^{2} )(x+2^{3} )(x+2^{4} )(x+2^{5} )(x+2^{6} )=x^{6}+7x^{5}+9x^{4}+3x^{3}+12x^{2}+10x+12&amp;lt;/math&amp;gt;.     ''(Возведение в степень и умножения выполнены над полем GF&amp;lt;sub&amp;gt;16&amp;lt;/sub&amp;gt; )!''&lt;br /&gt;
== Кодирование Рида-Соломона ==&lt;br /&gt;
Кодирование Рида-Соломона будем производить систематическим кодом, это означает, что в закодированное сообщение будет содержать в себе в явном виде исходное сообщение. Каким образом это делается:&lt;br /&gt;
Сначала полином сдвигается на &amp;lt;math&amp;gt;N-K&amp;lt;/math&amp;gt; коэффициентов влево &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;P'(x)=p(x)x^{N-K}&amp;lt;/math&amp;gt;&lt;br /&gt;
,а потом вычисляется остаток от деления на порождающий полином и прибавляется к p’(x):&lt;/div&gt;</summary>
		<author><name>NikZ</name></author>	</entry>

	<entry>
		<id>https://vscripts.ru/w/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nikz</id>
		<title>Участник:Nikz</title>
		<link rel="alternate" type="text/html" href="https://vscripts.ru/w/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nikz"/>
				<updated>2014-06-13T18:31:02Z</updated>
		
		<summary type="html">&lt;p&gt;NikZ: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Пример коррекции ошибки с помощью кодов Рида - Соломона =&lt;br /&gt;
== Постановка задачи ==&lt;br /&gt;
В данной статье разбирается пример работы алгоритма коррекции ошибки для 16-битных строк. Строка разбивает на блоки длиной 4 бита и каждый блок представляет собой элемент поля Галуа GF&amp;lt;sub&amp;gt;16&amp;lt;/sub&amp;gt;. Необходимо отследить и исправить одиночную ошибку, внесённую в один из блоков.&lt;br /&gt;
&lt;br /&gt;
== Теоретические основы алгоритма ==&lt;br /&gt;
=== Поля Галуа ===&lt;br /&gt;
Операцию сложения определим как &amp;quot;исключающее ИЛИ&amp;quot; &amp;lt;math&amp;gt;(XOR)&amp;lt;/math&amp;gt;.Очевидно, что в таком случае операция сложения является обратной самой себе. Тогда операция умножения в двоичном виде будет выглядеть так:&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;math&amp;gt; \begin{matrix} *\underline{\begin{matrix}&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1 &amp;amp; 1 \\&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 1 &amp;amp; 1 &amp;amp; 0 \\&lt;br /&gt;
\end{matrix}}\\&lt;br /&gt;
+\underline{\begin{matrix}&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 1 &amp;amp; 1 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 1 &amp;amp; 1 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
\end{matrix}} \\&lt;br /&gt;
\begin{matrix}&lt;br /&gt;
 &amp;amp; 0 &amp;amp; 1 &amp;amp; 0 &amp;amp; 1 &amp;amp; 0 \\&lt;br /&gt;
\end{matrix} \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так можно умножать полиномы, в данном случае мы умножили:&lt;br /&gt;
&amp;lt;math&amp;gt; (x + 1) * (x^2 + x) = x^3 + x&amp;lt;/math&amp;gt;.&lt;br /&gt;
Определим также операцию деления чисел(или полиномов) с остатком – по аналогичным правилам, например:&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{110010}{101011}=011001 &amp;lt;/math&amp;gt;&lt;br /&gt;
или &amp;lt;math&amp;gt; \frac{x^5 + x^4 + x}{x^5 + x^3 + x + 1} = x^4 + x^3 + 1  &amp;lt;/math&amp;gt;&lt;br /&gt;
Теперь построим поле из 16 элементов &amp;lt;math&amp;gt; GF_{16} &amp;lt;/math&amp;gt;. Операцию сложения определена на XOR, Операция деления дополнена получением остатка по некоторому модулю.&lt;br /&gt;
Выберем в качестве модуля неприводимый полином &amp;lt;math&amp;gt; x^4+x+1 (10011) &amp;lt;/math&amp;gt;.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Возьмем единицу и будем последовательно умножать ее на 2 и рассмотрим числа, которые будут при этом &lt;br /&gt;
# &amp;lt;math&amp;gt;1= 2^0=0001 &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; 2^0*2=2^1=0010 _{mod 10011} = 2 = x^1 &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; 2^1*2=2^2=0100 _{mod 10011} = 4 = x^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; 2^2*2=2^3=1000 _{mod 10011} = 8 = x^3 &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; 2^3*2=2^4=10000 _{mod 10011} = 0011 = 3 = x+1 &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; 2^4*2=2^5=100000 _{mod 10011} = 0110 = 6 = x^2+x &amp;lt;/math&amp;gt;&lt;br /&gt;
и так далее.&amp;lt;br /&amp;gt;&lt;br /&gt;
'''Составим таблицу умножения'''&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Степень&lt;br /&gt;
! Результат&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 0001&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 2&lt;br /&gt;
| 0010&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 4&lt;br /&gt;
| 0100&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| 8&lt;br /&gt;
| 1000&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 3&lt;br /&gt;
| 0011&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| 6&lt;br /&gt;
| 0110&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| 12&lt;br /&gt;
| 1100&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| 11&lt;br /&gt;
| 1011&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 5&lt;br /&gt;
| 0101&lt;br /&gt;
|-&lt;br /&gt;
| 9&lt;br /&gt;
| 10&lt;br /&gt;
| 1010&lt;br /&gt;
|-&lt;br /&gt;
| 10&lt;br /&gt;
| 7&lt;br /&gt;
| 0111&lt;br /&gt;
|-&lt;br /&gt;
| 11&lt;br /&gt;
| 14&lt;br /&gt;
| 1110&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| 15&lt;br /&gt;
| 1111&lt;br /&gt;
|-&lt;br /&gt;
| 13&lt;br /&gt;
| 13&lt;br /&gt;
| 1101&lt;br /&gt;
|-&lt;br /&gt;
| 14&lt;br /&gt;
| 9&lt;br /&gt;
| 1001&lt;br /&gt;
|-&lt;br /&gt;
| 15&lt;br /&gt;
| 1&lt;br /&gt;
| 0001&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Таким образом, при дальнейшем умножении весь цикл повторится снова. Полученные степени двойки не сложно умножать между собой, например: &amp;lt;math&amp;gt; 13*15=2^{13}*2^{12}=2^{25 mod 15}=2^{10}=7 &amp;lt;/math&amp;gt;. Можно проверить результат,разделив &amp;lt;math&amp;gt; \frac{7}{13}=\frac{2^{10}}{2^{13}}=2^{-3 mod 15}=2^{12}=15 &amp;lt;/math&amp;gt;.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Таким образом, получили поле &amp;lt;math&amp;gt;GF_{16}&amp;lt;/math&amp;gt;, то есть для двоичных 4-разрядных чисел.'''&lt;br /&gt;
== Коды Рида - Соломона ==&lt;br /&gt;
При построении кода Рида-Соломона задается пара чисел N,K, где N-Общее количество символов, а К- «полезное» количество символов, N-K символов задают избыточный код, предназначенный для восстановления ошибок.&lt;br /&gt;
Такой код Рида-Соломона будет иметь «расстояние Хемминга» &amp;lt;math&amp;gt;D=N-K+1&amp;lt;/math&amp;gt;.&lt;br /&gt;
В соответствии с теорией кодирования, код, имеющий расстояние Хемминга &amp;lt;math&amp;gt;D=2t+1&amp;lt;/math&amp;gt;, позволяет восстанавливать t ошибок. Таким образом, если нам необходимо восстановить t ошибок, то общее количество символов сообщения &amp;lt;math&amp;gt;N=K+2t&amp;lt;/math&amp;gt;.&lt;br /&gt;
Сообщения при кодировании Рида-Соломона представляются полиномами.&lt;br /&gt;
Исходное сообщение представляется как коэффициенты полинома &amp;lt;math&amp;gt;p(x)&amp;lt;/math&amp;gt; степени &amp;lt;math&amp;gt;K-1&amp;lt;/math&amp;gt;, имеющего &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; коэффициентов.&amp;lt;br /&amp;gt;&lt;br /&gt;
Порождающий многочлен Рида-Соломона,&amp;lt;math&amp;gt;g(x)&amp;lt;/math&amp;gt;, строится следующий образом:&lt;br /&gt;
&amp;lt;math&amp;gt; g(x)=(x+2)(x+2^{2})..(x+2^{ D-1 } ) &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;2 - &amp;lt;/math&amp;gt; примитивный член поля. Нетрудно понять, что &amp;lt;math&amp;gt;2^{1},2^{2},..,2^{D-1}&amp;lt;/math&amp;gt; - корни этого многочлена.&amp;lt;br&amp;gt;&lt;br /&gt;
Например, построим порождающий многочлен кода Рида-Соломона с &amp;lt;math&amp;gt;N=15,K=9&amp;lt;/math&amp;gt;, способного исправлять до 3 ошибок &amp;lt;math&amp;gt;(15-9)/2=3&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;math&amp;gt;g(x)=(x+2)(x+2^{2} )(x+2^{3} )(x+2^{4} )(x+2^{5} )(x+2^{6} )=x^{6}+7x^{5}+9x^{4}+3x^{3}+12x^{2}+10x+12&amp;lt;/math&amp;gt;.     ''(Возведение в степень и умножения выполнены над полем GF&amp;lt;sub&amp;gt;16&amp;lt;/sub&amp;gt; )!''&lt;/div&gt;</summary>
		<author><name>NikZ</name></author>	</entry>

	<entry>
		<id>https://vscripts.ru/w/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nikz</id>
		<title>Участник:Nikz</title>
		<link rel="alternate" type="text/html" href="https://vscripts.ru/w/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nikz"/>
				<updated>2014-05-19T11:24:35Z</updated>
		
		<summary type="html">&lt;p&gt;NikZ: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Постановка задачи ==&lt;br /&gt;
В данной статье разбирается пример работы алгоритма коррекции ошибки для 16-битных строк. Строка разбивает на блоки длиной 4 бита и каждый блок представляет собой элемент поля Галуа GF&amp;lt;sub&amp;gt;16&amp;lt;/sub&amp;gt;. Необходимо отследить и исправить одиночную ошибку, внесённую в один из блоков.&lt;br /&gt;
&lt;br /&gt;
== Теоретические основы алгоритма ==&lt;br /&gt;
=== Поля Галуа ===&lt;br /&gt;
Операцию сложения определим как «исключающее ИЛИ»(XOR).Очевидно, что в таком случае операция сложения является обратной самой себе. Тогда операция умножения в двоичном виде будет выглядеть так:&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;math&amp;gt; \begin{matrix} *\underline{\begin{matrix}&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1 &amp;amp; 1 \\&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 1 &amp;amp; 1 &amp;amp; 0 \\&lt;br /&gt;
\end{matrix}}\\&lt;br /&gt;
+\underline{\begin{matrix}&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 1 &amp;amp; 1 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 1 &amp;amp; 1 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
\end{matrix}} \\&lt;br /&gt;
\begin{matrix}&lt;br /&gt;
 &amp;amp; 0 &amp;amp; 1 &amp;amp; 0 &amp;amp; 1 &amp;amp; 0 \\&lt;br /&gt;
\end{matrix} \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так можно умножать полиномы, в данном случае мы умножили:&lt;br /&gt;
&amp;lt;math&amp;gt; (x + 1) * (x^2 + x) = x^3 + x&amp;lt;/math&amp;gt;.&lt;br /&gt;
Определим также операцию деления чисел(или полиномов) с остатком – по аналогичным правилам, например:&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{110010}{101011}=011001 &amp;lt;/math&amp;gt;&lt;br /&gt;
или &amp;lt;math&amp;gt; \frac{x^5 + x^4 + x}{x^5 + x^3 + x + 1} = x^4 + x^3 + 1  &amp;lt;/math&amp;gt;&lt;br /&gt;
Теперь построим поле из 16 элементов &amp;lt;math&amp;gt; GF_{16} &amp;lt;/math&amp;gt;. Операцию сложения определена на XOR, Операция деления дополнена получением остатка по некоторому модулю.&lt;br /&gt;
Выберем в качестве модуля неприводимый полином &amp;lt;math&amp;gt; x^4+x+1 (10011) &amp;lt;/math&amp;gt;.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Возьмем единицу и будем последовательно умножать ее на 2 и рассмотрим числа, которые будут при этом &lt;br /&gt;
# &amp;lt;math&amp;gt;1= 2^0=0001 &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; 2^0*2=2^1=0010 _{mod 10011} = 2 = x^1 &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; 2^1*2=2^2=0100 _{mod 10011} = 4 = x^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; 2^2*2=2^3=1000 _{mod 10011} = 8 = x^3 &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; 2^3*2=2^4=10000 _{mod 10011} = 0011 = 3 = x+1 &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; 2^4*2=2^5=100000 _{mod 10011} = 0110 = 6 = x^2+x &amp;lt;/math&amp;gt;&lt;br /&gt;
и так далее.&amp;lt;br /&amp;gt;&lt;br /&gt;
'''Составим таблицу умножения'''&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Степень&lt;br /&gt;
! Результат&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 0001&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 2&lt;br /&gt;
| 0010&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 4&lt;br /&gt;
| 0100&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| 8&lt;br /&gt;
| 1000&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 3&lt;br /&gt;
| 0011&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| 6&lt;br /&gt;
| 0110&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| 12&lt;br /&gt;
| 1100&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| 11&lt;br /&gt;
| 1011&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 5&lt;br /&gt;
| 0101&lt;br /&gt;
|-&lt;br /&gt;
| 9&lt;br /&gt;
| 10&lt;br /&gt;
| 1010&lt;br /&gt;
|-&lt;br /&gt;
| 10&lt;br /&gt;
| 7&lt;br /&gt;
| 0111&lt;br /&gt;
|-&lt;br /&gt;
| 11&lt;br /&gt;
| 14&lt;br /&gt;
| 1110&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| 15&lt;br /&gt;
| 1111&lt;br /&gt;
|-&lt;br /&gt;
| 13&lt;br /&gt;
| 13&lt;br /&gt;
| 1101&lt;br /&gt;
|-&lt;br /&gt;
| 14&lt;br /&gt;
| 9&lt;br /&gt;
| 1001&lt;br /&gt;
|-&lt;br /&gt;
| 15&lt;br /&gt;
| 1&lt;br /&gt;
| 0001&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Таким образом, при дальнейшем умножении весь цикл повторится снова. Полученные степени двойки не сложно умножать между собой, например: &amp;lt;math&amp;gt; 13*15=2^{13}*2^{12}=2^{25 mod 15}=2^{10}=7 &amp;lt;/math&amp;gt;. Можно проверить результат,разделив &amp;lt;math&amp;gt; \frac{7}{13}=\frac{2^{10}}{2^{13}}=2^{-3 mod 15}=2^{12}=15 &amp;lt;/math&amp;gt;.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Таким образом, получили поле &amp;lt;math&amp;gt;GF_{16}&amp;lt;/math&amp;gt;, то есть для двоичных 4-разрядных чисел.'''&lt;/div&gt;</summary>
		<author><name>NikZ</name></author>	</entry>

	<entry>
		<id>https://vscripts.ru/w/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nikz</id>
		<title>Участник:Nikz</title>
		<link rel="alternate" type="text/html" href="https://vscripts.ru/w/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nikz"/>
				<updated>2014-05-19T11:24:00Z</updated>
		
		<summary type="html">&lt;p&gt;NikZ: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Постановка задачи ==&lt;br /&gt;
В данной статье разбирается пример работы алгоритма коррекции ошибки для 16-битных строк. Строка разбивает на блоки длиной 4 бита и каждый блок представляет собой элемент поля Галуа GF&amp;lt;sub&amp;gt;16&amp;lt;/sub&amp;gt;. Необходимо отследить и исправить одиночную ошибку, внесённую в один из блоков.&lt;br /&gt;
&lt;br /&gt;
== Теоретические основы алгоритма ==&lt;br /&gt;
=== Поля Галуа ===&lt;br /&gt;
Операцию сложения определим как «исключающее ИЛИ»(XOR).Очевидно, что в таком случае операция сложения является обратной самой себе. Тогда операция умножения в двоичном виде будет выглядеть так:&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;math&amp;gt; \begin{matrix} *\underline{\begin{matrix}&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1 &amp;amp; 1 \\&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 1 &amp;amp; 1 &amp;amp; 0 \\&lt;br /&gt;
\end{matrix}}\\&lt;br /&gt;
+\underline{\begin{matrix}&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 1 &amp;amp; 1 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 1 &amp;amp; 1 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
\end{matrix}} \\&lt;br /&gt;
\begin{matrix}&lt;br /&gt;
 &amp;amp; 0 &amp;amp; 1 &amp;amp; 0 &amp;amp; 1 &amp;amp; 0 \\&lt;br /&gt;
\end{matrix} \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так можно умножать полиномы, в данном случае мы умножили:&lt;br /&gt;
&amp;lt;math&amp;gt; (x + 1) * (x^2 + x) = x^3 + x&amp;lt;/math&amp;gt;.&lt;br /&gt;
Определим также операцию деления чисел(или полиномов) с остатком – по аналогичным правилам, например:&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{110010}{101011}=011001 &amp;lt;/math&amp;gt;&lt;br /&gt;
или &amp;lt;math&amp;gt; \frac{x^5 + x^4 + x}{x^5 + x^3 + x + 1} = x^4 + x^3 + 1  &amp;lt;/math&amp;gt;&lt;br /&gt;
Теперь построим поле из 16 элементов &amp;lt;math&amp;gt; GF_{16} &amp;lt;/math&amp;gt;. Операцию сложения определена на XOR, Операция деления дополнена получением остатка по некоторому модулю.&lt;br /&gt;
Выберем в качестве модуля неприводимый полином &amp;lt;math&amp;gt; x^4+x+1 (10011) &amp;lt;/math&amp;gt;.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Возьмем единицу и будем последовательно умножать ее на 2 и рассмотрим числа, которые будут при этом &lt;br /&gt;
# &amp;lt;math&amp;gt;1= 2^0=0001 &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; 2^0*2=2^1=0010 _{mod 10011} = 2 = x^1 &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; 2^1*2=2^2=0100 _{mod 10011} = 4 = x^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; 2^2*2=2^3=1000 _{mod 10011} = 8 = x^3 &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; 2^3*2=2^4=10000 _{mod 10011} = 0011 = 3 = x+1 &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; 2^4*2=2^5=100000 _{mod 10011} = 0110 = 6 = x^2+x &amp;lt;/math&amp;gt;&lt;br /&gt;
и так далее.&amp;lt;br /&amp;gt;&lt;br /&gt;
'''Составим таблицу умножения'''&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Степень&lt;br /&gt;
! Результат&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 0001&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 2&lt;br /&gt;
| 0010&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 4&lt;br /&gt;
| 0100&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| 8&lt;br /&gt;
| 1000&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 3&lt;br /&gt;
| 0011&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| 6&lt;br /&gt;
| 0110&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| 12&lt;br /&gt;
| 1100&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| 11&lt;br /&gt;
| 1011&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 5&lt;br /&gt;
| 0101&lt;br /&gt;
|-&lt;br /&gt;
| 9&lt;br /&gt;
| 10&lt;br /&gt;
| 1010&lt;br /&gt;
|-&lt;br /&gt;
| 10&lt;br /&gt;
| 7&lt;br /&gt;
| 0111&lt;br /&gt;
|-&lt;br /&gt;
| 11&lt;br /&gt;
| 14&lt;br /&gt;
| 1110&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| 15&lt;br /&gt;
| 1111&lt;br /&gt;
|-&lt;br /&gt;
| 13&lt;br /&gt;
| 13&lt;br /&gt;
| 1101&lt;br /&gt;
|-&lt;br /&gt;
| 14&lt;br /&gt;
| 9&lt;br /&gt;
| 1001&lt;br /&gt;
|-&lt;br /&gt;
| 15&lt;br /&gt;
| 1&lt;br /&gt;
| 0001&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Таким образом, при дальнейшем умножении весь цикл повторится снова. Полученные степени двойки не сложно умножать между собой, например: &amp;lt;math&amp;gt; 13*15=2^{13}*2^{12}=2^{25 mod 15}=2^{10}=7 &amp;lt;/math&amp;gt;. Можно проверить результат,разделив &amp;lt;math&amp;gt; \frac{7}{13}=\frac{2^{10}}{2^{13}}=2^{-3 mod 15}=2^{12}=15 &amp;lt;/math&amp;gt;.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Таким образом, получили поле GF_{16}, то есть для двоичных 4-разрядных чисел.'''&lt;/div&gt;</summary>
		<author><name>NikZ</name></author>	</entry>

	<entry>
		<id>https://vscripts.ru/w/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nikz</id>
		<title>Участник:Nikz</title>
		<link rel="alternate" type="text/html" href="https://vscripts.ru/w/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nikz"/>
				<updated>2014-05-19T11:23:15Z</updated>
		
		<summary type="html">&lt;p&gt;NikZ: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Постановка задачи ==&lt;br /&gt;
В данной статье разбирается пример работы алгоритма коррекции ошибки для 16-битных строк. Строка разбивает на блоки длиной 4 бита и каждый блок представляет собой элемент поля Галуа GF&amp;lt;sub&amp;gt;16&amp;lt;/sub&amp;gt;. Необходимо отследить и исправить одиночную ошибку, внесённую в один из блоков.&lt;br /&gt;
&lt;br /&gt;
== Теоретические основы алгоритма ==&lt;br /&gt;
=== Поля Галуа ===&lt;br /&gt;
Операцию сложения определим как «исключающее ИЛИ»(XOR).Очевидно, что в таком случае операция сложения является обратной самой себе. Тогда операция умножения в двоичном виде будет выглядеть так:&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;math&amp;gt; \begin{matrix} *\underline{\begin{matrix}&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1 &amp;amp; 1 \\&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 1 &amp;amp; 1 &amp;amp; 0 \\&lt;br /&gt;
\end{matrix}}\\&lt;br /&gt;
+\underline{\begin{matrix}&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 1 &amp;amp; 1 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 1 &amp;amp; 1 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
\end{matrix}} \\&lt;br /&gt;
\begin{matrix}&lt;br /&gt;
 &amp;amp; 0 &amp;amp; 1 &amp;amp; 0 &amp;amp; 1 &amp;amp; 0 \\&lt;br /&gt;
\end{matrix} \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так можно умножать полиномы, в данном случае мы умножили:&lt;br /&gt;
&amp;lt;math&amp;gt; (x + 1) * (x^2 + x) = x^3 + x&amp;lt;/math&amp;gt;.&lt;br /&gt;
Определим также операцию деления чисел(или полиномов) с остатком – по аналогичным правилам, например:&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{110010}{101011}=011001 &amp;lt;/math&amp;gt;&lt;br /&gt;
или &amp;lt;math&amp;gt; \frac{x^5 + x^4 + x}{x^5 + x^3 + x + 1} = x^4 + x^3 + 1  &amp;lt;/math&amp;gt;&lt;br /&gt;
Теперь построим поле из 16 элементов &amp;lt;math&amp;gt; GF_{16} &amp;lt;/math&amp;gt;. Операцию сложения определена на XOR, Операция деления дополнена получением остатка по некоторому модулю.&lt;br /&gt;
Выберем в качестве модуля неприводимый полином &amp;lt;math&amp;gt; x^4+x+1 (10011) &amp;lt;/math&amp;gt;.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Возьмем единицу и будем последовательно умножать ее на 2 и рассмотрим числа, которые будут при этом &lt;br /&gt;
# &amp;lt;math&amp;gt;1= 2^0=0001 &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; 2^0*2=2^1=0010 _{mod 10011} = 2 = x^1 &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; 2^1*2=2^2=0100 _{mod 10011} = 4 = x^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; 2^2*2=2^3=1000 _{mod 10011} = 8 = x^3 &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; 2^3*2=2^4=10000 _{mod 10011} = 0011 = 3 = x+1 &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; 2^4*2=2^5=100000 _{mod 10011} = 0110 = 6 = x^2+x &amp;lt;/math&amp;gt;&lt;br /&gt;
и так далее.&amp;lt;br /&amp;gt;&lt;br /&gt;
'''Составим таблицу умножения'''&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Степень&lt;br /&gt;
! Результат&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 0001&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 2&lt;br /&gt;
| 0010&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 4&lt;br /&gt;
| 0100&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| 8&lt;br /&gt;
| 1000&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 3&lt;br /&gt;
| 0011&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| 6&lt;br /&gt;
| 0110&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| 12&lt;br /&gt;
| 1100&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| 11&lt;br /&gt;
| 1011&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 5&lt;br /&gt;
| 0101&lt;br /&gt;
|-&lt;br /&gt;
| 9&lt;br /&gt;
| 10&lt;br /&gt;
| 1010&lt;br /&gt;
|-&lt;br /&gt;
| 10&lt;br /&gt;
| 7&lt;br /&gt;
| 0111&lt;br /&gt;
|-&lt;br /&gt;
| 11&lt;br /&gt;
| 14&lt;br /&gt;
| 1110&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| 15&lt;br /&gt;
| 1111&lt;br /&gt;
|-&lt;br /&gt;
| 13&lt;br /&gt;
| 13&lt;br /&gt;
| 1101&lt;br /&gt;
|-&lt;br /&gt;
| 14&lt;br /&gt;
| 9&lt;br /&gt;
| 1001&lt;br /&gt;
|-&lt;br /&gt;
| 15&lt;br /&gt;
| 1&lt;br /&gt;
| 0001&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Таким образом, при дальнейшем умножении весь цикл повторится снова. Полученные степени двойки не сложно умножать между собой, например: &amp;lt;math&amp;gt; 13*15=2^{13}*2^{12}=2^{25 mod 15}=2^{10}=7 &amp;lt;/math&amp;gt;. Можно проверить результат,разделив &amp;lt;math&amp;gt; \frac{7}{13}=\frac{2^{10}}{2^{13}}=2^{-3 mod 15}=2^{12}=15 &amp;lt;/math&amp;gt;.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Таким образом, получили поле GF(16), то есть для двоичных 4-разрядных чисел.'''&lt;/div&gt;</summary>
		<author><name>NikZ</name></author>	</entry>

	<entry>
		<id>https://vscripts.ru/w/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nikz</id>
		<title>Участник:Nikz</title>
		<link rel="alternate" type="text/html" href="https://vscripts.ru/w/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nikz"/>
				<updated>2014-05-19T11:22:12Z</updated>
		
		<summary type="html">&lt;p&gt;NikZ: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Постановка задачи ==&lt;br /&gt;
В данной статье разбирается пример работы алгоритма коррекции ошибки для 16-битных строк. Строка разбивает на блоки длиной 4 бита и каждый блок представляет собой элемент поля Галуа GF&amp;lt;sub&amp;gt;16&amp;lt;/sub&amp;gt;. Необходимо отследить и исправить одиночную ошибку, внесённую в один из блоков.&lt;br /&gt;
&lt;br /&gt;
== Теоретические основы алгоритма ==&lt;br /&gt;
=== Поля Галуа ===&lt;br /&gt;
Операцию сложения определим как «исключающее ИЛИ»(XOR).Очевидно, что в таком случае операция сложения является обратной самой себе. Тогда операция умножения в двоичном виде будет выглядеть так:&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;math&amp;gt; \begin{matrix} *\underline{\begin{matrix}&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1 &amp;amp; 1 \\&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 1 &amp;amp; 1 &amp;amp; 0 \\&lt;br /&gt;
\end{matrix}}\\&lt;br /&gt;
+\underline{\begin{matrix}&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 1 &amp;amp; 1 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 1 &amp;amp; 1 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
\end{matrix}} \\&lt;br /&gt;
\begin{matrix}&lt;br /&gt;
 &amp;amp; 0 &amp;amp; 1 &amp;amp; 0 &amp;amp; 1 &amp;amp; 0 \\&lt;br /&gt;
\end{matrix} \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так можно умножать полиномы, в данном случае мы умножили:&lt;br /&gt;
&amp;lt;math&amp;gt; (x + 1) * (x^2 + x) = x^3 + x&amp;lt;/math&amp;gt;.&lt;br /&gt;
Определим также операцию деления чисел(или полиномов) с остатком – по аналогичным правилам, например:&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{110010}{101011}=011001 &amp;lt;/math&amp;gt;&lt;br /&gt;
или &amp;lt;math&amp;gt; \frac{x^5 + x^4 + x}{x^5 + x^3 + x + 1} = x^4 + x^3 + 1  &amp;lt;/math&amp;gt;&lt;br /&gt;
Теперь построим поле из 16 элементов &amp;lt;math&amp;gt; GF_{16} &amp;lt;/math&amp;gt;. Операцию сложения определена на XOR, Операция деления дополнена получением остатка по некоторому модулю.&lt;br /&gt;
Выберем в качестве модуля неприводимый полином &amp;lt;math&amp;gt; x^4+x+1 (10011) &amp;lt;/math&amp;gt;.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Возьмем единицу и будем последовательно умножать ее на 2 и рассмотрим числа, которые будут при этом &lt;br /&gt;
# &amp;lt;math&amp;gt;1= 2^0=0001 &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; 2^0*2=2^1=0010 _{mod 10011} = 2 = x^1 &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; 2^1*2=2^2=0100 _{mod 10011} = 4 = x^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; 2^2*2=2^3=1000 _{mod 10011} = 8 = x^3 &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; 2^3*2=2^4=10000 _{mod 10011} = 0011 = 3 = x+1 &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; 2^4*2=2^5=100000 _{mod 10011} = 0110 = 6 = x^2+x &amp;lt;/math&amp;gt;&lt;br /&gt;
и так далее.&amp;lt;br /&amp;gt;&lt;br /&gt;
'''Составим таблицу умножения'''&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Степень&lt;br /&gt;
! Результат&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 0001&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 2&lt;br /&gt;
| 0010&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 4&lt;br /&gt;
| 0100&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| 8&lt;br /&gt;
| 1000&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 3&lt;br /&gt;
| 0011&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| 6&lt;br /&gt;
| 0110&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| 12&lt;br /&gt;
| 1100&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| 11&lt;br /&gt;
| 1011&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 5&lt;br /&gt;
| 0101&lt;br /&gt;
|-&lt;br /&gt;
| 9&lt;br /&gt;
| 10&lt;br /&gt;
| 1010&lt;br /&gt;
|-&lt;br /&gt;
| 10&lt;br /&gt;
| 7&lt;br /&gt;
| 0111&lt;br /&gt;
|-&lt;br /&gt;
| 11&lt;br /&gt;
| 14&lt;br /&gt;
| 1110&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| 15&lt;br /&gt;
| 1111&lt;br /&gt;
|-&lt;br /&gt;
| 13&lt;br /&gt;
| 13&lt;br /&gt;
| 1101&lt;br /&gt;
|-&lt;br /&gt;
| 14&lt;br /&gt;
| 9&lt;br /&gt;
| 1001&lt;br /&gt;
|-&lt;br /&gt;
| 15&lt;br /&gt;
| 1&lt;br /&gt;
| 0001&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Таким образом, при дальнейшем умножении весь цикл повторится снова. Полученные степени двойки не сложно умножать между собой, например: &amp;lt;math&amp;gt; 13*15=2^{13}*2^{12}=2^{25 mod 15}=2^{10}=7 &amp;lt;/math&amp;gt;. Можно проверить результат,разделив &amp;lt;math&amp;gt; \frac{7}{13}=\frac{2^{10}}{2^{13}}=2^{-3 mod 15}=2^{12}=15 &amp;lt;/math&amp;gt;.&lt;br /&gt;
Таким образом, получили поле GF(16), то есть для двоичных 4-разрядных чисел.&lt;/div&gt;</summary>
		<author><name>NikZ</name></author>	</entry>

	<entry>
		<id>https://vscripts.ru/w/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nikz</id>
		<title>Участник:Nikz</title>
		<link rel="alternate" type="text/html" href="https://vscripts.ru/w/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nikz"/>
				<updated>2014-05-19T11:13:48Z</updated>
		
		<summary type="html">&lt;p&gt;NikZ: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Постановка задачи ==&lt;br /&gt;
В данной статье разбирается пример работы алгоритма коррекции ошибки для 16-битных строк. Строка разбивает на блоки длиной 4 бита и каждый блок представляет собой элемент поля Галуа GF&amp;lt;sub&amp;gt;16&amp;lt;/sub&amp;gt;. Необходимо отследить и исправить одиночную ошибку, внесённую в один из блоков.&lt;br /&gt;
&lt;br /&gt;
== Теоретические основы алгоритма ==&lt;br /&gt;
=== Поля Галуа ===&lt;br /&gt;
Операцию сложения определим как «исключающее ИЛИ»(XOR).Очевидно, что в таком случае операция сложения является обратной самой себе. Тогда операция умножения в двоичном виде будет выглядеть так:&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;math&amp;gt; \begin{matrix} *\underline{\begin{matrix}&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1 &amp;amp; 1 \\&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 1 &amp;amp; 1 &amp;amp; 0 \\&lt;br /&gt;
\end{matrix}}\\&lt;br /&gt;
+\underline{\begin{matrix}&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 1 &amp;amp; 1 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 1 &amp;amp; 1 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
\end{matrix}} \\&lt;br /&gt;
\begin{matrix}&lt;br /&gt;
 &amp;amp; 0 &amp;amp; 1 &amp;amp; 0 &amp;amp; 1 &amp;amp; 0 \\&lt;br /&gt;
\end{matrix} \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так можно умножать полиномы, в данном случае мы умножили:&lt;br /&gt;
&amp;lt;math&amp;gt; (x + 1) * (x^2 + x) = x^3 + x&amp;lt;/math&amp;gt;.&lt;br /&gt;
Определим также операцию деления чисел(или полиномов) с остатком – по аналогичным правилам, например:&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{110010}{101011}=011001 &amp;lt;/math&amp;gt;&lt;br /&gt;
или &amp;lt;math&amp;gt; \frac{x^5 + x^4 + x}{x^5 + x^3 + x + 1} = x^4 + x^3 + 1  &amp;lt;/math&amp;gt;&lt;br /&gt;
Теперь построим поле из 16 элементов &amp;lt;math&amp;gt; GF_{16} &amp;lt;/math&amp;gt;. Операцию сложения определена на XOR, Операция деления дополнена получением остатка по некоторому модулю.&lt;br /&gt;
Выберем в качестве модуля неприводимый полином &amp;lt;math&amp;gt; x^4+x+1 (10011) &amp;lt;/math&amp;gt;.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Возьмем единицу и будем последовательно умножать ее на 2 и рассмотрим числа, которые будут при этом &lt;br /&gt;
# &amp;lt;math&amp;gt;1= 2^0=0001 &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; 2^0*2=2^1=0010 _{mod 10011} = 2 = x^1 &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; 2^1*2=2^2=0100 _{mod 10011} = 4 = x^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; 2^2*2=2^3=1000 _{mod 10011} = 8 = x^3 &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; 2^3*2=2^4=10000 _{mod 10011} = 0011 = 3 = x+1 &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt; 2^4*2=2^5=100000 _{mod 10011} = 0110 = 6 = x^2+x &amp;lt;/math&amp;gt;&lt;br /&gt;
и так далее.&amp;lt;br /&amp;gt;&lt;br /&gt;
'''Составим таблицу умножения'''&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Степень&lt;br /&gt;
! Результат&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 0001&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 2&lt;br /&gt;
| 0010&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 4&lt;br /&gt;
| 0100&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| 8&lt;br /&gt;
| 1000&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 3&lt;br /&gt;
| 0011&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| 6&lt;br /&gt;
| 0110&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| 12&lt;br /&gt;
| 1100&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| 11&lt;br /&gt;
| 1011&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 5&lt;br /&gt;
| 0101&lt;br /&gt;
|-&lt;br /&gt;
| 9&lt;br /&gt;
| 10&lt;br /&gt;
| 1010&lt;br /&gt;
|-&lt;br /&gt;
| 10&lt;br /&gt;
| 7&lt;br /&gt;
| 0111&lt;br /&gt;
|-&lt;br /&gt;
| 11&lt;br /&gt;
| 14&lt;br /&gt;
| 1110&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| 15&lt;br /&gt;
| 1111&lt;br /&gt;
|-&lt;br /&gt;
| 13&lt;br /&gt;
| 13&lt;br /&gt;
| 1101&lt;br /&gt;
|-&lt;br /&gt;
| 14&lt;br /&gt;
| 9&lt;br /&gt;
| 1001&lt;br /&gt;
|-&lt;br /&gt;
| 15&lt;br /&gt;
| 1&lt;br /&gt;
| 0001&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>NikZ</name></author>	</entry>

	<entry>
		<id>https://vscripts.ru/w/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nikz</id>
		<title>Участник:Nikz</title>
		<link rel="alternate" type="text/html" href="https://vscripts.ru/w/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nikz"/>
				<updated>2014-05-19T10:15:57Z</updated>
		
		<summary type="html">&lt;p&gt;NikZ: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Постановка задачи ==&lt;br /&gt;
В данной статье разбирается пример работы алгоритма коррекции ошибки для 16-битных строк. Строка разбивает на блоки длиной 4 бита и каждый блок представляет собой элемент поля Галуа GF&amp;lt;sub&amp;gt;16&amp;lt;/sub&amp;gt;. Необходимо отследить и исправить одиночную ошибку, внесённую в один из блоков.&lt;br /&gt;
&lt;br /&gt;
== Теоретические основы алгоритма ==&lt;br /&gt;
=== Поля Галуа ===&lt;br /&gt;
Операцию сложения определим как «исключающее ИЛИ»(XOR).Очевидно, что в таком случае операция сложения является обратной самой себе. Тогда операция умножения в двоичном виде будет выглядеть так:&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;math&amp;gt; \begin{matrix} *\underline{\begin{matrix}&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1 &amp;amp; 1 \\&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 1 &amp;amp; 1 &amp;amp; 0 \\&lt;br /&gt;
\end{matrix}}\\&lt;br /&gt;
+\underline{\begin{matrix}&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 1 &amp;amp; 1 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 1 &amp;amp; 1 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
\end{matrix}} \\&lt;br /&gt;
\begin{matrix}&lt;br /&gt;
 &amp;amp; 0 &amp;amp; 1 &amp;amp; 0 &amp;amp; 1 &amp;amp; 0 \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так можно умножать полиномы, в данном случае мы умножили:&lt;br /&gt;
&amp;lt;math&amp;gt; (x + 1) * (x^2 + x) = x^3 + x&amp;lt;/math&amp;gt;.&lt;/div&gt;</summary>
		<author><name>NikZ</name></author>	</entry>

	<entry>
		<id>https://vscripts.ru/w/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nikz</id>
		<title>Участник:Nikz</title>
		<link rel="alternate" type="text/html" href="https://vscripts.ru/w/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nikz"/>
				<updated>2014-05-19T10:00:54Z</updated>
		
		<summary type="html">&lt;p&gt;NikZ: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Постановка задачи ==&lt;br /&gt;
В данной статье разбирается пример работы алгоритма коррекции ошибки для 16-битных строк. Строка разбивает на блоки длиной 4 бита и каждый блок представляет собой элемент поля Галуа GF&amp;lt;sub&amp;gt;16&amp;lt;/sub&amp;gt;. Необходимо отследить и исправить одиночную ошибку, внесённую в один из блоков.&lt;br /&gt;
&lt;br /&gt;
== Теоретические основы алгоритма ==&lt;br /&gt;
=== Поля Галуа ===&lt;br /&gt;
Операцию сложения определим как «исключающее ИЛИ»(XOR).Очевидно, что в таком случае операция сложения является обратной самой себе. Тогда операция умножения в двоичном виде будет выглядеть так:   &amp;lt;math&amp;gt; \begin{matrix}&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1 &amp;amp; 1 \\&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 1 &amp;amp; 1 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 1 &amp;amp; 1 &amp;amp; 0 \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;/div&gt;</summary>
		<author><name>NikZ</name></author>	</entry>

	<entry>
		<id>https://vscripts.ru/w/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nikz</id>
		<title>Участник:Nikz</title>
		<link rel="alternate" type="text/html" href="https://vscripts.ru/w/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nikz"/>
				<updated>2014-05-19T09:33:20Z</updated>
		
		<summary type="html">&lt;p&gt;NikZ: NikZ переименовал страницу Участник:Пример коррекции ошибки с помощью кодов Рида-Соломона в Участник:Nikz&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Постановка задачи ==&lt;br /&gt;
В данной статье разбирается пример работы алгоритма коррекции ошибки для 16-битных строк. Строка разбивает на блоки длиной 4 бита и каждый блок представляет собой элемент поля Галуа GF&amp;lt;sub&amp;gt;16&amp;lt;/sub&amp;gt;. Необходимо отследить и исправить одиночную ошибку, внесённую в один из блоков.&lt;br /&gt;
&lt;br /&gt;
== Теоретические основы алгоритма ==&lt;br /&gt;
=== Поля Галуа ===&lt;/div&gt;</summary>
		<author><name>NikZ</name></author>	</entry>

	<entry>
		<id>https://vscripts.ru/w/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80_%D0%BA%D0%BE%D1%80%D1%80%D0%B5%D0%BA%D1%86%D0%B8%D0%B8_%D0%BE%D1%88%D0%B8%D0%B1%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E_%D0%BA%D0%BE%D0%B4%D0%BE%D0%B2_%D0%A0%D0%B8%D0%B4%D0%B0-%D0%A1%D0%BE%D0%BB%D0%BE%D0%BC%D0%BE%D0%BD%D0%B0</id>
		<title>Участник:Пример коррекции ошибки с помощью кодов Рида-Соломона</title>
		<link rel="alternate" type="text/html" href="https://vscripts.ru/w/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80_%D0%BA%D0%BE%D1%80%D1%80%D0%B5%D0%BA%D1%86%D0%B8%D0%B8_%D0%BE%D1%88%D0%B8%D0%B1%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E_%D0%BA%D0%BE%D0%B4%D0%BE%D0%B2_%D0%A0%D0%B8%D0%B4%D0%B0-%D0%A1%D0%BE%D0%BB%D0%BE%D0%BC%D0%BE%D0%BD%D0%B0"/>
				<updated>2014-05-19T09:33:20Z</updated>
		
		<summary type="html">&lt;p&gt;NikZ: NikZ переименовал страницу Участник:Пример коррекции ошибки с помощью кодов Рида-Соломона в Участник:Nikz&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#перенаправление [[Участник:Nikz]]&lt;/div&gt;</summary>
		<author><name>NikZ</name></author>	</entry>

	<entry>
		<id>https://vscripts.ru/w/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nikz</id>
		<title>Участник:Nikz</title>
		<link rel="alternate" type="text/html" href="https://vscripts.ru/w/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nikz"/>
				<updated>2014-05-19T09:32:01Z</updated>
		
		<summary type="html">&lt;p&gt;NikZ: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Постановка задачи ==&lt;br /&gt;
В данной статье разбирается пример работы алгоритма коррекции ошибки для 16-битных строк. Строка разбивает на блоки длиной 4 бита и каждый блок представляет собой элемент поля Галуа GF&amp;lt;sub&amp;gt;16&amp;lt;/sub&amp;gt;. Необходимо отследить и исправить одиночную ошибку, внесённую в один из блоков.&lt;br /&gt;
&lt;br /&gt;
== Теоретические основы алгоритма ==&lt;br /&gt;
=== Поля Галуа ===&lt;/div&gt;</summary>
		<author><name>NikZ</name></author>	</entry>

	<entry>
		<id>https://vscripts.ru/w/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nikz</id>
		<title>Участник:Nikz</title>
		<link rel="alternate" type="text/html" href="https://vscripts.ru/w/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nikz"/>
				<updated>2014-05-19T09:31:08Z</updated>
		
		<summary type="html">&lt;p&gt;NikZ: NikZ переименовал страницу Участник:NikZ в Участник:Пример коррекции ошибки с помощью кодов Рида-Соломона&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Пример коррекции ошибки с помощью кодов Рида-Соломона =&lt;br /&gt;
== Постановка задачи ==&lt;br /&gt;
В данной статье разбирается пример работы алгоритма коррекции ошибки для 16-битных строк. Строка разбивает на блоки длиной 4 бита и каждый блок представляет собой элемент поля Галуа GF&amp;lt;sub&amp;gt;16&amp;lt;/sub&amp;gt;. Необходимо отследить и исправить одиночную ошибку, внесённую в один из блоков.&lt;br /&gt;
&lt;br /&gt;
== Теоретические основы алгоритма ==&lt;br /&gt;
=== Поля Галуа ===&lt;/div&gt;</summary>
		<author><name>NikZ</name></author>	</entry>

	<entry>
		<id>https://vscripts.ru/w/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:NikZ</id>
		<title>Участник:NikZ</title>
		<link rel="alternate" type="text/html" href="https://vscripts.ru/w/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:NikZ"/>
				<updated>2014-05-19T09:31:08Z</updated>
		
		<summary type="html">&lt;p&gt;NikZ: NikZ переименовал страницу Участник:NikZ в Участник:Пример коррекции ошибки с помощью кодов Рида-Соломона&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#перенаправление [[Участник:Пример коррекции ошибки с помощью кодов Рида-Соломона]]&lt;/div&gt;</summary>
		<author><name>NikZ</name></author>	</entry>

	<entry>
		<id>https://vscripts.ru/w/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nikz</id>
		<title>Участник:Nikz</title>
		<link rel="alternate" type="text/html" href="https://vscripts.ru/w/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nikz"/>
				<updated>2014-05-19T09:20:36Z</updated>
		
		<summary type="html">&lt;p&gt;NikZ: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Пример коррекции ошибки с помощью кодов Рида-Соломона =&lt;br /&gt;
== Постановка задачи ==&lt;br /&gt;
В данной статье разбирается пример работы алгоритма коррекции ошибки для 16-битных строк. Строка разбивает на блоки длиной 4 бита и каждый блок представляет собой элемент поля Галуа GF&amp;lt;sub&amp;gt;16&amp;lt;/sub&amp;gt;. Необходимо отследить и исправить одиночную ошибку, внесённую в один из блоков.&lt;br /&gt;
&lt;br /&gt;
== Теоретические основы алгоритма ==&lt;br /&gt;
=== Поля Галуа ===&lt;/div&gt;</summary>
		<author><name>NikZ</name></author>	</entry>

	<entry>
		<id>https://vscripts.ru/w/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nikz</id>
		<title>Участник:Nikz</title>
		<link rel="alternate" type="text/html" href="https://vscripts.ru/w/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nikz"/>
				<updated>2014-05-19T09:14:42Z</updated>
		
		<summary type="html">&lt;p&gt;NikZ: Новая страница: «== Пример коррекции ошибки с помощью кодов Рида-Соломона ==»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Пример коррекции ошибки с помощью кодов Рида-Соломона ==&lt;/div&gt;</summary>
		<author><name>NikZ</name></author>	</entry>

	</feed>