Схема коррекции ошибок Rajendra S. Katti

Материал из Модулярная арифметики
(Различия между версиями)
Перейти к: навигация, поиск
 
(не показаны 2 промежуточные версии 1 участника)
Строка 1: Строка 1:
 
== Введение ==
 
== Введение ==
Метод, описанный автором, основан на использовании избыточной системы остаточных классов. Недостатки представления чисел в такой системе с целью коррекции ошибок при вычислениях покажем на примере.
+
Традиционный метод коррекции ошибок, основан на использовании избыточной системы остаточных классов с взаимнопростыми основаниями. Недостатки представления чисел в такой системе с целью коррекции ошибок при вычислениях покажем на примере.
  
 
Пусть избыточная СОК определяется следующими модулями <math> m_1 = 3, m_2 = 4, m_3 = 5, m_4 = 7</math>, а динамический диапазон определяется <math>m_1</math> и <math>m_2</math> и соответственно равен <math>\{0,...,11\}</math>, а модули <math>m_3, m_4</math> являются дополнительными и необходимы для проверки на ошибки.
 
Пусть избыточная СОК определяется следующими модулями <math> m_1 = 3, m_2 = 4, m_3 = 5, m_4 = 7</math>, а динамический диапазон определяется <math>m_1</math> и <math>m_2</math> и соответственно равен <math>\{0,...,11\}</math>, а модули <math>m_3, m_4</math> являются дополнительными и необходимы для проверки на ошибки.
Строка 12: Строка 12:
  
 
== Модули, имеющие общие делители ==
 
== Модули, имеющие общие делители ==
Каждый набор остатков необязательно соответствует числу из динамического диапазона, если модули не являются попарно взаимно простыми. Легко показать, что такое соответствие есть тогда и только тогда, когда
+
Каждый набор остатков необязательно соответствует числу из динамического диапазона, если модули не являются попарно взаимно простыми. Легко показать, что такое соответствие есть тогда и только тогда, когда равенство
 
:<math>|r_i|_k = |r_j|_k</math>,
 
:<math>|r_i|_k = |r_j|_k</math>,
 
выполняется для любых <math>i, j</math>, где <math>k = gcd(r_i, r_j)</math>. Таким образом, ошибочный разряд может быть найден выполнением только простой операции вычисления остатка.
 
выполняется для любых <math>i, j</math>, где <math>k = gcd(r_i, r_j)</math>. Таким образом, ошибочный разряд может быть найден выполнением только простой операции вычисления остатка.
Строка 124: Строка 124:
 
Начнём описание алгоритма со следующей леммы.
 
Начнём описание алгоритма со следующей леммы.
  
'''Лемма 1'''. Существует и единственно кодовое слово в множестве <math>A</math>
+
'''Лемма 1'''. Существует и единственно кодовое слово в множестве <math>A</math>, такое что кодовое расстояние между этим словом и остаточным представлением <math>(r_1, r_2, r_3, r_4)</math> равно <math>1</math>.
 +
 
 +
Опишем теперь коррекцию ошибки для каждого варианта:
 +
#Кодовое слово за пределами динамического диапазона и совместно.
 +
#Кодовое слово не совместно.
 +
 
 +
'''Вариант 1'''. Пусть остаточное представление <math>(r_1, r_2, r_3, r_4)</math> соответствует целому <math>R</math>. Так как только один разряд ошибочный, то <math>R</math> принадлежит множеству <math>C</math>. Коррекция выполняется следующим образом:
 +
#Для всех кортежей из трёх остатков вычислить по КТО соответствующее целое.
 +
#Если полученное целое принадлежит динамическому диапазону, то ошибка в исключённом разряде.
 +
#Предположим без потери общности, что ошибочным является <math>r_3</math>. Найдём правильное значение <math>\bar {r_3}</math> из следующих уравнений:
 +
:<math>|\bar{r_3}|_{k_a} = |r_1|_{k_a}, k_a = gcd(m_3, m_1)</math>,
 +
:<math>|\bar{r_3}|_{k_b} = |r_2|_{k_b}, k_b = gcd(m_3, m_2)</math>,
 +
:<math>|\bar{r_3}|_{k_c} = |r_4|_{k_c}, k_c = gcd(m_3, m_4)</math>.
 +
 
 +
Если полученных решений несколько, то согласно Лемме 1 только одно из них принадлежит динамическому диапазону.
 +
 
 +
'''Вариант 2'''. Пусть кодовое слово <math>(r_1, r_2, r_3, r_4)</math> не является совместным, то есть не выполняется равенство:
 +
:<math>|r_i|_{k_a} = |r_j|_{k_a}, k_a = gcd(m_i, m_j)</math>.
 +
 
 +
Значит ошибочным является либо <math>r_i</math>, либо <math>r_j</math>. Пусть ошибка в <math>r_i</math>, найдём правильное значение, как в шаге 3 выше. Если для полученных решений, соответствующие целые не лежат в динамическом диапазоне, то ошибка в <math>r_j</math>, и её можно исправить тем же способом, описанным в шаге 3.
 +
 
 +
==== Примеры ====
 +
Определим множество модулей <math>(m_1, m_2, m_3, m_4) = (8,6,4,2)</math>. Все кодовые слова и их целые эквиваленты приведены ниже:
 +
:<math>(0,0,0,0) = 0</math>
 +
:<math>(1,1,1,1) = 1</math>
 +
:<math>(2,2,2,0) = 2</math>
 +
:<math>(3,3,3,1) = 3</math>
 +
:<math>(4,4,0,0) = 4</math>
 +
:<math>(5,5,1,3) = 5</math>
 +
:<math>(6,0,2,0) = 6</math>
 +
:<math>(7,1,3,1) = 7</math>
 +
:<math>(0,2,0,0) = 8</math>
 +
:<math>(1,3,1,1) = 9</math>
 +
:<math>(2,4,2,0) = 10</math>
 +
:<math>(3,5,3,1) = 11</math>
 +
:<math>(4,0,0,0) = 12</math>
 +
:<math>(5,1,1,1) = 13</math>
 +
:<math>(6,2,2,0) = 14</math>
 +
:<math>(7,3,3,1) = 15</math>
 +
:<math>(0,4,0,0) = 16</math>
 +
:<math>(1,5,1,1) = 17</math>
 +
:<math>(2,0,2,0) = 18</math>
 +
:<math>(3,1,3,1) = 19</math>
 +
:<math>(4,2,0,0) = 20</math>
 +
:<math>(5,3,1,1) = 21</math>
 +
:<math>(6,4,2,0) = 22</math>
 +
:<math>(7,5,3,1) = 23</math>
 +
 
 +
Множества <math>A, B, C</math>, определённые выше, равны <math>A = \{0, ..., 3\}, B = \{4, ..., 7\}, C = \{8, ..., 23\}</math>.
 +
 
 +
Рассмотрим теперь несколько примеров обнаружения и коррекции.
 +
 
 +
'''Пример 1 '''. Остаточное представление <math>(r_1, r_2, r_3, r_4) = (2,0,2,0)</math> является совместным и не принадлежит динамическому диапазону. Четыре кортежа из трёх остатков и соответствующие им целые:
 +
:<math>(2,0,2) = 18</math>
 +
:<math>(0,2,0) = 6</math>
 +
:<math>(2,0,0) = 18</math>
 +
:<math>(2,2,0) = 2</math>
 +
 
 +
Единственное представление, лежащее в <math>\{0, ..., 3\}</math> -  это <math>(2,2,0)</math>, следовательно <math>r_2 = 0</math> является ошибочным. Эта ошибка может быть исправлена, правильное значение можно найти из следующих уравнений:
 +
:<math>|\bar {r_2}|_2 = |r_1|_2 = 0</math>,
 +
:<math>|\bar {r_2}|_2 = |r_3|_2 = 0</math>,
 +
:<math>|\bar {r_2}|_2 = |r_4|_2 = 0</math>,
 +
:<math>\bar {r_2} \leq 5</math>.
 +
 
 +
Им удовлетворяют три решения: <math>0, 2, 4</math>. Правильным является <math> \bar {r_2} = 2</math>, так оставшиеся два соответствуют представлениям, лежащим вне динамического диапазона.
 +
 
 +
'''Пример 2 '''. Остаточное представление <math>(r_1, r_2, r_3, r_4) = (0,0,0,5)</math>. Так как <math>r_4 \geq 2</math>, то <math>r_4</math> - ошибочный. Найдём правильное значение из следующих уравнений:
 +
:<math>|\bar {r_4}|_2 = |r_1|_2 = 0</math>,
 +
:<math>|\bar {r_4}|_2 = |r_2|_2 = 0</math>,
 +
:<math>|\bar {r_4}|_2 = |r_3|_2 = 0</math>,
 +
:<math>\bar {r_4} \leq 1</math>.
 +
 
 +
Получаем <math>\bar {r_4} = 1</math>.
 +
 
 +
'''Пример 3 '''. Остаточное представление <math>(r_1, r_2, r_3, r_4) = (1,3,3,1)</math> является несовместным, так как не выполняется следующее равенство:
 +
:<math>|r_1|_4 = |r_3|_4</math>.
 +
 
 +
Пусть <math>r_3</math> - ошибочный. Тогда скорректированное значение <math>r_3</math> может быть найдено из следующих уравнений:
 +
:<math>|\bar {r_3}|_4 = |r_1|_4 = 1</math>,
 +
:<math>|\bar {r_3}|_2 = |r_2|_2 = 1</math>,
 +
:<math>|\bar {r_3}|_2 = |r_4|_2 = 1</math>,
 +
:<math>\bar {r_3} \leq 3</math>.
 +
 
 +
Решая, находим <math> \bar {r_3} = 1 </math>. Скорректированное остаточное представление <math>(1,3,1,1) = 9</math> лежит вне динамического диапазона. Значит, ошибочным является <math>r_1</math>. Проводя аналогичную процедуру, находим <math>r_1 = 3</math>. Полученное остаточное представление <math>(3,3,3,1) = 3</math> лежит в динамическом диапазоне, коррекция завершена. Заметим, что мы пытались обнаружить ошибку в остаточном представлении <math>(1,3,3,1)</math>, которое имеет кодовое расстояние равное <math>1</math> с совместными представлениями <math>(1,3,1,1)</math> и <math>(3,3,3,1)</math>. По Лемме 1 только одно из них лежит в динамическом диапазоне.
 +
== Литература ==
 +
Rajendra S. Katti, A New Residue Arithmetic Error Correction Scheme, IEEE Trans. Computers, 1996, том 45, стр. 13-19

Текущая версия на 11:35, 26 мая 2014

Содержание

[править] Введение

Традиционный метод коррекции ошибок, основан на использовании избыточной системы остаточных классов с взаимнопростыми основаниями. Недостатки представления чисел в такой системе с целью коррекции ошибок при вычислениях покажем на примере.

Пусть избыточная СОК определяется следующими модулями  m_1 = 3, m_2 = 4, m_3 = 5, m_4 = 7, а динамический диапазон определяется m_1 и m_2 и соответственно равен \{0,...,11\}, а модули m_3, m_4 являются дополнительными и необходимы для проверки на ошибки.

Натуральное число из динамического диапазона может быть восстановлено по любым трём из четырёх остатков по представленным модулям. Например, число x=5=(2,1,0,2) может быть представлено как (2,1,0) в системе модулей \{m_1, m_2, m_3\} или (2,0,2), (1,0,2) в системах \{m_1, m_3, m_4\} и \{m_2, m_3, m_4\} соответственно. Поэтому, если одна цифра отбрасывается в представлении (2,1,0,2), правильный результат восстановления будет получен тогда и только тогда, когда отбрасываемая цифра ошибочна. Итак, обнаружение ошибок и коррекция выполняется следующим образом:

  1. Если число лежит вне динамического диапазона - произошла ошибка.
  2. Остатки отбрасываются по одному и если в результате одного из отбрасываний полученное число лежит в динамическом диапазоне, то отброшенный остаток является ошибочным.
  3. Корректное значение остатка получается расширением полученного на шаге 2 множества модулей, остатки по которым не содержат ошибок.

Такой подход требует много времени и вычислительных ресурсов. Ниже будет предложена новая схема обнаружения и коррекции ошибок на основе СОК.

[править] Модули, имеющие общие делители

Каждый набор остатков необязательно соответствует числу из динамического диапазона, если модули не являются попарно взаимно простыми. Легко показать, что такое соответствие есть тогда и только тогда, когда равенство

|r_i|_k = |r_j|_k,

выполняется для любых i, j, где k = gcd(r_i, r_j). Таким образом, ошибочный разряд может быть найден выполнением только простой операции вычисления остатка.

Приведём пример, демонстрирующий, как можно проверить набор остатков на наличие ошибок. Проверим набор (2, 6, 30, 42) в системе модулей \{4, 15, 36, 48\}. Наибольшие общие делители всевозможных пар модулей соответственно равны: gcd(4, 15) = 1, gcd(4, 36) = 4, gcd(4, 48) = 4, gcd(15, 36) = 3, gcd(15, 48) = 3, gcd(36, 48) = 12. Используя описанное выше соотношение для проверки, получаем: |2|_4=|30|_4, |2|_4=|42|_4, |6|_3 = |30|_3, |6|_3=|42|_3 и  |30|_{12}=|42|_{12}. То есть ошибок нет и число может быть восстановлено с использованием китайской теоремы об остатках (КТО) для модулей, имеющих нетривиальные общие делители.

КТО для системы модулей, попарно не взаимно простых. Пусть есть представление (r_1, ..., r_n) натурального числа x, определяемое системой модулей (m_1, ..., m_n). Тогда

|x|_M = \left | \sum^{n}_{i=1} {{{\alpha}_i}r_i} \right |,

где  {\alpha}_i - число, такое что |{\alpha}_i|_M = 0, |{\alpha}_i|_{\frac{M}{{\mu}_i}} = 1 , где  {\mu}_i - числа, такие что  M = \prod^n_{i=1}{{\mu}_i} ,  {\mu}_i делит  m_i и  M = lcm(m_1, ..., m_n) . Если для некоторого i такое {\alpha}_i не существует, то соответствующее слагаемое в сумме опускается.

Операции над числами остаются корректными и в системе не взаимно простых попарно модулей.

[править] Алгоритм

Если в множестве модулей (m_1, ..., m_n) есть имеющие нетривиальный общий делитель, то каждый набор остатков (r_1, ..., r_n) необязательно соответствует некоторому числу. Каждый набор, для которого такое соответствие имеет место, будем называть кодовым словом.

Расстоянием между двумя представлениями чисел в СОК(кодовыми словами) будем считать количество разрядов, в которых кодовые слова различаются между собой.

Кодовым расстоянием назовём минимальное расстояние среди всех пар кодовых слов.

Чтобы обнаружить и исправить d-1 или меньше ошибок, необходимо и достаточно, чтобы кодовое расстояние было не меньше d. Не более t ошибок может быть обнаружено и исправлено тогда и только тогда, когда кодовое расстояние больше, чем (2t+1). Если кодовое расстояние больше или равно, чем (t+d+1), то любая комбинация из t ошибок может быть исправлена и до dошибок могут быть обнаружены. Для множества из n модулей в соответствующей системе могут быть представлены числа (0, ..., M-1), где M = lcm(m_1, ..., m_n).

Циклическим числом c_i для каждого модуля m_i назовём c_i = M/m_i.

[править] Модули с попарно взаимно простыми циклическими числами

Построим теперь систему модулей с попарно взаимно простыми циклическими числами, которая поможет получит эффективный алгоритм обнаружения и коррекции ошибок.

Построение 1.

  1. Выберем n попарно взаимно простых циклических чисел, не равных единице (c_1, ..., c_n).
  2. Получим систему модулей (m_1, ..., m_n) следующим образом:
m_i = \frac{1}{c_i}\prod^n_{k=1}{c_k}.

Полученные модули обладают двумя свойствами:

  1. Наименьшие общие кратны всевозможных пар модулей равны между собой.
  2. Наибольшие общие делители всевозможных пар модулей различны.

Теорема 1. Для построенной системы модулей кодовое расстояние равно n-1, где n - количество модулей.

[править] Алгоритм обнаружения ошибки

  1. Если r_i \geqslant m_i, то произошла ошибка в i-том разряде.
  2. Если не выполняется хотя бы одно из следующей системы равенств:
|r_i|_{k_{ij}}=|r_j|_{k_{ij}}, k_{ij} = gcd(m_i, m_j),

то произошла ошибка.

Теорема 2. Для системы из четырёх модулей (m_1, m_2, m_3, m_4) ошибка в одном разряде влечёт за собой невыполнением как минимум двух, а как максимум трёх равенств из системы выше. Причём, если ошибка в r_i, то равенства, которые не выполняются, содержат r_i.

[править] Алгоритм локализации ошибки

Теорема 2 даёт алгоритм локализации ошибки. Ошибочным является разряд, который содержится во всех равенствах, которые не выполняются.

[править] Алгоритм коррекции ошибки

Предложим, что ошибка в r_i и \bar{r_i} - правильное значение. Тогда \bar{r_i} можно найти, решая следующую систему уравнений:

|\bar{r_i}|_{k_a} = |r_j|_{k_a}, k_a = gcd(m_i, m_j),
|\bar{r_i}|_{k_b} = |r_k|_{k_b}, k_b = gcd(m_i, m_k).

Решение заключается в составлении множеств A и B:

A = \left \{ f = |r_j|_{k_a}  + k_a k_x : f < m_i, k_x \geq 0 \right \},
B = \left \{ g = |r_k|_{k_b}  + k_b k_y : g < m_i, k_y \geq 0 \right \}.

и поиске пересечения A \cap B. Можно доказать, что такое пересечение всегда непусто и состоит ровно из одного элемента.

[править] Примеры

Пример обнаружения одной ошибки. Воспользуемся Построением 1 для получения системы модулей. Используя попарно взаимно простые циклические числа (c_1, c_2, c_3, c_4)=(2, 3, 5, 7), получим систему модулей (m_1, m_2, m_3, m_4)=(105, 70, 42, 30). Пусть теперь в остаточном представлении (r_1, r_2, r_3, r_4)=(30, 60, 30, 0) содержится одна ошибка. Проверяя совместность представления, найдём, что следующие равенства не выполняются:

|r_1|_{35} = |r_2|_{35}, 35 = gcd(105, 70),
|r_2|_{14} = |r_3k|_{14}, 14 = gcd(70, 42).

Так как r_2 является общим в этих равенствах, ошибочным является остаток 60. Для того чтобы получить правильное значение, составим множества A и B как было описано выше:

A = \left \{ f = |r_1|_{35}  + 35 k_x : f < 70, k_x \geq 0 \right \},
B = \left \{ g = |r_3|_{14}  + 14 k_y : g < 70, k_y \geq 0 \right \}.

Получим:

A = \left \{ 30, 65 \right \},
B = \left \{ 2,16,30,44,58\right \}.

Таким образом скорректированное значение \{ \bar {r_2} \}= A \cap B = \{ 30 \}.

Необязательно вычислять множество B полностью. Так как |r_1|_{35} > 14, то k_y \geq 2. Вычисления элементов множеств следует прекратить, как только их пересечение больше не пусто. Пример обнаружения двух и коррекции одной ошибки. Для обнаружения двух и коррекции одной ошибки требуется по крайней мере 5 модулей и кодовое расстояние равное 4. Если мы выберем циклические числа (2, 3, 5, 7, 11) мы получим набор модулей (m_1, m_2, m_3, m_4, m_5) = (1155, 770, 462, 330, 210). Чтобы проверить, есть ли ошибки в остаточном представлении (r_1, r_2, r_3, r_4, r_5), нужно выяснить, какие из следующих равенств не выполняются:

|r_1|_{385} = |r_2|_{385}, 385 = gcd(1155, 770),
|r_1|_{231} = |r_3|_{231}, 231 = gcd(1155, 462),
|r_1|_{105} = |r_5|_{105}, 105 = gcd(1155, 210),
|r_2|_{154} = |r_3|_{154}, 154 = gcd(462, 770),
|r_2|_{110} = |r_4|_{110}, 110 = gcd(330, 770),
|r_2|_{70} = |r_5|_{70}, 70 = gcd(210, 770),
|r_3|_{66} = |r_4|_{66}, 66 = gcd(462, 330),
|r_3|_{42} = |r_5|_{42}, 42 = gcd(462, 210),
|r_4|_{30} = |r_5|_{30}, 30 = gcd(330, 210).

Следует отметить, что если три или четыре из равенств выше не выполняются, то обнаружена одна ошибка. Если их пять и больше, то ошибок две. Аналогично предыдущему примеру, можно построить три множества A, B, C. Исправленное значение ошибочного разряда получим, найдя пересечение этих множеств: \{ \bar {r_i} \}= A \cap B \cap C.

[править] Модули с произвольными циклическими числами

Если мы уберём ограничение на взаимную простоту циклических числе, то обнаружение и коррекция ошибки может быть всё ещё осуществлена сокращением динамического диапазона. Следующие теорема и следствие связывают кодовое расстояние и динамический диапазон.

Теорема 3. Пусть есть множество модулей (m_1, m_2, ..., m_n) и (l_1, l_2, ..., l_a) - множество наименьших общих кратных всевозможных различных пар модулей, где a = C^2_n. Тогда, если l = \min{(l_1, l_2, ..., l_a)}, то кодовое расстояние множества всех представлений чисел \{0, ..., l-1\} в системе остаточных классов равно n-1.

Следствие. Пусть есть множество модулей (m_1, m_2, ..., m_n) и (l_1, l_2, ..., l_a) - множество наименьших общих кратных всевозможных кортежей из i различных модулей, где a = C^i_n. Тогда, если l = \min{(l_1, l_2, ..., l_a)}, то кодовое расстояние множества всех представлений чисел \{0, ..., l-1\} в системе остаточных классов равно n - 1 + i.

Далее будем предполагать, что ошибочный разряд только один. Из теоремы 3 следует, что для коррекции одной ошибки требуется множество из 4 модулей (m_1, m_2, m_3, m_4). Пусть l_1, l_2, l_3 - соответственно наименьшее из НОК всех пар, наименьшее из НОК всех троек и НОК всех модулей. Из теоремы 3 и следствия из неё следует, что для множества чисел \{0, ..., l_1-1\} кодовое расстояние соответствующего множества кодовых слов равно 3, а для множеств \{0, ..., l_2-1\} и \{0, ..., l_3-1\} - не меньше 2 и не меньше 1 соответственно. Разделим множество всех кодовых слов на три подмножества:

A = \{x : 0 \leq x \leq l_1-1\},
B = \{x : l_1 \leq x \leq l_2-1\},
C = \{x : l_2 \leq x \leq l_3-1\}.

Для коррекции одной ошибки необходимо кодовое расстояние, равное трём, то есть все слова из A и B выходят за границы динамического диапазона. Пусть необходимо обнаружить/исправить одну ошибку в остаточном представлении.

[править] Алгоритм обнаружения ошибки

  1. Если r_i \geqslant m_i, то произошла ошибка в i-том разряде.
  2. Если остаточное представление не является совместным и слово не лежит в динамическом диапазоне, то произошла ошибка. Для проверки нужно воспользоваться КТО для перевода числа из остаточного представления и проверить, выполняется ли x \leq l_1-1.
  3. Если остаточное представление не является совместным, то произошла ошибка.
  4. Если остаточное представление является совместным и лежит в динамическом диапазоне, то ошибок нет.

[править] Алгоритм коррекции ошибки

Начнём описание алгоритма со следующей леммы.

Лемма 1. Существует и единственно кодовое слово в множестве A, такое что кодовое расстояние между этим словом и остаточным представлением (r_1, r_2, r_3, r_4) равно 1.

Опишем теперь коррекцию ошибки для каждого варианта:

  1. Кодовое слово за пределами динамического диапазона и совместно.
  2. Кодовое слово не совместно.

Вариант 1. Пусть остаточное представление (r_1, r_2, r_3, r_4) соответствует целому R. Так как только один разряд ошибочный, то R принадлежит множеству C. Коррекция выполняется следующим образом:

  1. Для всех кортежей из трёх остатков вычислить по КТО соответствующее целое.
  2. Если полученное целое принадлежит динамическому диапазону, то ошибка в исключённом разряде.
  3. Предположим без потери общности, что ошибочным является r_3. Найдём правильное значение \bar {r_3} из следующих уравнений:
|\bar{r_3}|_{k_a} = |r_1|_{k_a}, k_a = gcd(m_3, m_1),
|\bar{r_3}|_{k_b} = |r_2|_{k_b}, k_b = gcd(m_3, m_2),
|\bar{r_3}|_{k_c} = |r_4|_{k_c}, k_c = gcd(m_3, m_4).

Если полученных решений несколько, то согласно Лемме 1 только одно из них принадлежит динамическому диапазону.

Вариант 2. Пусть кодовое слово (r_1, r_2, r_3, r_4) не является совместным, то есть не выполняется равенство:

|r_i|_{k_a} = |r_j|_{k_a}, k_a = gcd(m_i, m_j).

Значит ошибочным является либо r_i, либо r_j. Пусть ошибка в r_i, найдём правильное значение, как в шаге 3 выше. Если для полученных решений, соответствующие целые не лежат в динамическом диапазоне, то ошибка в r_j, и её можно исправить тем же способом, описанным в шаге 3.

[править] Примеры

Определим множество модулей (m_1, m_2, m_3, m_4) = (8,6,4,2). Все кодовые слова и их целые эквиваленты приведены ниже:

(0,0,0,0) = 0
(1,1,1,1) = 1
(2,2,2,0) = 2
(3,3,3,1) = 3
(4,4,0,0) = 4
(5,5,1,3) = 5
(6,0,2,0) = 6
(7,1,3,1) = 7
(0,2,0,0) = 8
(1,3,1,1) = 9
(2,4,2,0) = 10
(3,5,3,1) = 11
(4,0,0,0) = 12
(5,1,1,1) = 13
(6,2,2,0) = 14
(7,3,3,1) = 15
(0,4,0,0) = 16
(1,5,1,1) = 17
(2,0,2,0) = 18
(3,1,3,1) = 19
(4,2,0,0) = 20
(5,3,1,1) = 21
(6,4,2,0) = 22
(7,5,3,1) = 23

Множества A, B, C, определённые выше, равны A = \{0, ..., 3\}, B = \{4, ..., 7\}, C = \{8, ..., 23\}.

Рассмотрим теперь несколько примеров обнаружения и коррекции.

Пример 1 . Остаточное представление (r_1, r_2, r_3, r_4) = (2,0,2,0) является совместным и не принадлежит динамическому диапазону. Четыре кортежа из трёх остатков и соответствующие им целые:

(2,0,2) = 18
(0,2,0) = 6
(2,0,0) = 18
(2,2,0) = 2

Единственное представление, лежащее в \{0, ..., 3\} - это (2,2,0), следовательно r_2 = 0 является ошибочным. Эта ошибка может быть исправлена, правильное значение можно найти из следующих уравнений:

|\bar {r_2}|_2 = |r_1|_2 = 0,
|\bar {r_2}|_2 = |r_3|_2 = 0,
|\bar {r_2}|_2 = |r_4|_2 = 0,
\bar {r_2} \leq 5.

Им удовлетворяют три решения: 0, 2, 4. Правильным является  \bar {r_2} = 2, так оставшиеся два соответствуют представлениям, лежащим вне динамического диапазона.

Пример 2 . Остаточное представление (r_1, r_2, r_3, r_4) = (0,0,0,5). Так как r_4 \geq 2, то r_4 - ошибочный. Найдём правильное значение из следующих уравнений:

|\bar {r_4}|_2 = |r_1|_2 = 0,
|\bar {r_4}|_2 = |r_2|_2 = 0,
|\bar {r_4}|_2 = |r_3|_2 = 0,
\bar {r_4} \leq 1.

Получаем \bar {r_4} = 1.

Пример 3 . Остаточное представление (r_1, r_2, r_3, r_4) = (1,3,3,1) является несовместным, так как не выполняется следующее равенство:

|r_1|_4 = |r_3|_4.

Пусть r_3 - ошибочный. Тогда скорректированное значение r_3 может быть найдено из следующих уравнений:

|\bar {r_3}|_4 = |r_1|_4 = 1,
|\bar {r_3}|_2 = |r_2|_2 = 1,
|\bar {r_3}|_2 = |r_4|_2 = 1,
\bar {r_3} \leq 3.

Решая, находим  \bar {r_3} = 1 . Скорректированное остаточное представление (1,3,1,1) = 9 лежит вне динамического диапазона. Значит, ошибочным является r_1. Проводя аналогичную процедуру, находим r_1 = 3. Полученное остаточное представление (3,3,3,1) = 3 лежит в динамическом диапазоне, коррекция завершена. Заметим, что мы пытались обнаружить ошибку в остаточном представлении (1,3,3,1), которое имеет кодовое расстояние равное 1 с совместными представлениями (1,3,1,1) и (3,3,3,1). По Лемме 1 только одно из них лежит в динамическом диапазоне.

[править] Литература

Rajendra S. Katti, A New Residue Arithmetic Error Correction Scheme, IEEE Trans. Computers, 1996, том 45, стр. 13-19


Персональные инструменты
Пространства имён

Варианты
Действия
Навигация