помехоустойчивое кодирование: Что такое Код на Простых Числах

Тема в разделе "WASM.CRYPTO", создана пользователем 4d5a, 29 май 2007.

  1. 4d5a

    4d5a New Member

    Публикаций:
    0
    Регистрация:
    29 май 2007
    Сообщения:
    4
    Здраствуйте ! Подскажите знающие люди ,
    ЧТО ТАКОЕ КОРРЕКТИРУЮЩИЙ ОШИБКИ КОД НА ПРОСТЫХ ЧИСЛАХ (КПЧ) И ГДЕ ПРО НЕГО МОЖНО ПОЧИТАТЬ ???

    Прочитал про код Рида-Соломона (например http://ygam.livejournal.com/236181.html). Там сказано, что кодовые слова Рида-Соломона есть многочлены над полями Галуа, которые, грубо говоря, основываются на ПРОСТЫХ ЧИСЛАХ.

    подскажите :
    1 Код Рида-Соломона есть КПЧ ?
    2 Если нет, то знаете ли Вы что такое КПЧ или как он еще может называться?

    Читал про ПУ на:
    http://ru.wikipedia.org/wiki/Коррекция_ошибок - Общая инфа
    http://ru.wikibooks.org/wiki/Помехоустойчивое_кодирование - использ. кодов ПУ в OSI, + общ. инфа по основным методам, кратко
    http://www.kgtu.runnet.ru/WD/TUTOR/net/net3.html - про коды с точки зрения технологий и сетей, уч материал
    http://www.msclub.ce.cctpu.edu.ru/bibl/PDS/kurs.htm - изложены мат. основы кодирования
    http://lib.mexmat.ru/books/5119 - Теория корректирующих кодов, книжка, основательно, много математики
    http://kunegin.narod.ru/ref3/code/index.htm
    http://kunegin.narod.ru/ref1/coding/index.htm пара рефератов про коды коректирующие и обнаруживающие ошибки, пойдет для начала ознакомления с ПУ
    http://www.compression.ru/download/articles/ti/potapov_1999_info_theory_pdf.rar методичка по кодированию источников
    http://www.compression.ru/download/articles/ti/lidovski_2004_information_theory_pdf.rar
    Учебное пособие по теории информации ну и тд на http://www.compression.ru/download/ti.html
    http://www.omsu.ru/file.asp?id=1127 книжка Р.Блейхут Теория и практика кодов, контролирующих ошибки (можно исп. как ученик для ВУЗОВ по курсу "Коды, исправляющие ошибки" )

    .. там ничего про КПЧ не попалось, все что я знаю про этот код это то что он
    1 простой в реализации (не сложнее хеминга)
    2 кол-во проверчных битов у него определяется формулой k=]2.4+0.24*m[ ,где m-колво инф. битов)
    3 что возможно он блоковый
    4 Что если a1 a2 a3 a4 - инф биты, a5 a6 a7 - проверочные (далее '+' это операция XOR), то проверка осущ так: П1 = a1+a2+a5+a7=0 П2=a2+a3+a6+a7=0 ..
    5 Что он использует простые числа
     
  2. halyavin

    halyavin New Member

    Публикаций:
    0
    Регистрация:
    13 май 2005
    Сообщения:
    252
    Адрес:
    Russia
    Никогда такого кода не встречал. Многие коды используют конечные поля, но прямого отношения к простым числам они не имеют.
     
  3. Stiver

    Stiver Партизан дзена

    Публикаций:
    0
    Регистрация:
    18 дек 2004
    Сообщения:
    812
    Адрес:
    Germany
    4d5a

    Так как речь идет явно о каком-то линейном коде, могу предположить Simplex Code (он оптимальный линейный). Кода с названием "корректирующий ошибки код на простых числах" естественно не существует и простые числа сами по себе имеют очень приблизительное отношение к кодированию.
     
  4. 4d5a

    4d5a New Member

    Публикаций:
    0
    Регистрация:
    29 май 2007
    Сообщения:
    4
    Наконец у меня появилось время чтобы описать решение данной задачи. Возможно кому то это пригодится. Задача заключалась именно в <построении п/у кода основанного на простых числах> (те так ее сформулировали преподы одного из пензенских вузов, а целью был диплом. Из разговоров с ними стало ясно что подразумевается кокой то блочный квазисовершенный код , отдаленно напоминающий модифицированный код Хеминга). Так как ответ на вопрос <Существует ли КПЧ> получил отрицательный, то создал его сам. Теперь он существует :)
    После нескольких дней читания теории я придумал вот такой метод кодирования.
    В данном случае исправляется одна, обнаруживаются не более 2, но ‘производительность’ описанного (4,8) кода можно увеличить.
    Целью работы является демонстация работы ПУ метода в обучающих целях поэтому оптимизация здесь никакая.

    Код на простых числах: КПЧ (4,8).
    (4 бит исходн. инфы -> 8 бит кодирован. инфы) (Далее номера битов считаются слева направо)
    0) A- исходное сообщ (a1a2a3a4 напр 1001) B- ЗАкодированное (b1b2b3b4b5b6b7b8)
    1) Пусть позиция информационных битов определяется простыми числами , позиция p: 2,3,5,7 а в остальных - проверочные биты(S),
    Тогда кодированное соощение
    B=b1 b2 b3 b4 b5 b6 b7 b8
    B=s1 a1 a2 s2 a3 s3 a4 s4
    2) Определим S как
    s1 = a1 xor a2 xor a3
    s2 = a1 xor a2 xor a4
    s3 = a1 xor a3 xor a4
    s4 = a2 xor a3 xor a4
    Например, для A=1001
    a1=1 a2=0 a3=0 a4=1
    s1=1 s2 =0 s3 = 0 s4 = 1
    Т.е.
    s1 a1 a2 s2 a3 s3 a4 s4
    1 2 3 4 5 6 7 8
    B= 1 1 0 0 0 0 1 1
    3) Вот и закодировали. Пусть теперь испортился любой один бит (1->0 или 0->1)
    Например испортим при передаче третий бит 0->1
    После приема будет
    s1 a1 a2 s2 a3 s3 a4 s4
    1 2 3 4 5 6 7 8
    B*= 1 1 1 0 0 0 1 1
    4) Выбираем из принятой кодовой комбинации контрольные суммы S* и информационные символы A*
    s1*=1 s2* =0 s3*= 0 s4* = 1
    т.е.
    S*=1001
    A*=1101
    Посчитаем контрольные суммы S** по принятым информационным битам A*
    s1**=a1* xor a2* xor a3* = 1 xor 1 xor 0 =0
    s2**=a1* xor a2* xor a4* = 1
    s3**=a1* xor a3* xor a4* = 0
    s4**=a2* xor a3* xor a4* = 0
    5)Составим строку НЕсоответствия контрольных сумм
    Es= S1* xor S1**= | 1 1 0 1 |

    Составим матрицу востановления Ms[4][4]

    Ms=
    s1 s2 s3 s4

    1 | 1 1 1 0 |
    2 | 1 1 0 1 |
    3 | 1 0 1 1 |
    4 | 0 1 1 1 |

    Найдем в ней строку (n1) соответствующую Es, n1=2, значит повреждению подвергся второй информационный бит, исправим его:
    a2**=a2* xor 1
    остальные оставим без изменения.
    a1**=a1*
    a3**=a3*
    a4**=a4*
    исправленное сообщение будет таким
    A**=1001 т.о. была востановлена исходная инфа.
    Прим. Если Es получилось таким что ему нет соответствия в Ms, то возможны 3 варианта
    первый вар.:
    Es=0000, значит ошибки небыло
    второй вар.:
    Es есть какая либо строка из единичной матрицы
    M1s=
    1 | 1 0 0 0 |
    2 | 0 1 0 0 |
    3 | 0 0 1 0 |
    4 | 0 0 0 1 |
    те ошибка возникла в одном из битов контрольных сумм, (например Es= | 0 1 0 0 | ошибка в s2) значит исправлять нечего, инф. биты получены верно
    третий вар.: в Es какое либо другое значение (напр. Es= | 0 1 1 0 |), значит произошло более одной ошибки, действия по ситуации либо исправлять не будем A*=0 запрос на повторную передачу, либо A**=A* те надеемся что ошики были в s(тогда получим хоть что то вероятность = 1/2, но в это случае следует учитывть что данные недостоверны)

    Вот таким образом исправляет одиночную ошибку на 1 кодовое слово мой п/у код основанный на простых числах.
    ссылку на полноценные исходники могу дать после 20.06.07 сейчас приведу только процедуру кодирования/декодирования полубайта( младшие 4 бита ) в байт

    Код (Text):
    1. function Encode(A_In:byte):byte;
    2.  
    3. type t1=array [1..4] of byte;
    4.      t2=array [1..8] of byte;
    5.  
    6. const A_POS:t1=(2,3,5,7);
    7.       S_POS:t1=(1,4,6,8);
    8.  
    9. var a,s:t1;
    10.     z:byte;
    11.     i:integer;
    12.     b:t2;
    13. begin
    14.   a[1]:=(A_In and (1 shl 3)) shr 3;
    15.   a[2]:=(A_In and (1 shl 2)) shr 2;
    16.   a[3]:=(A_In and (1 shl 1)) shr 1;
    17.   a[4]:=(A_In and (1 shl 0)) shr 0;
    18.   s[1]:=a[1] xor a[2] xor a[3];
    19.   s[2]:=a[1] xor a[2] xor a[4];
    20.   s[3]:=a[1] xor a[3] xor a[4];
    21.   s[4]:=a[2] xor a[3] xor a[4];
    22.   for i:=1 to 4 do
    23.   begin
    24.     b[A_POS[i]]:=a[i];
    25.     b[S_POS[i]]:=s[i];
    26.   end;
    27.   z:=0;
    28.   for i:=1 to 8 do
    29.     z:=z or((b[i] and 1) shl (8-i) );
    30.   result:=z;
    31. end;
    32.  
    33.  
    34. function Decode(B_In:byte ;var ecInf:byte):byte;
    35.  
    36. type t1=array [1..4] of byte;
    37.  
    38. const A_POS:t1=(2,3,5,7);
    39.       S_POS:t1=(1,4,6,8);
    40.       C_S:array[1..12] of byte=
    41.                (1,2,3,
    42.                 1,2,4,
    43.                 1,3,4,
    44.                 2,3,4);
    45. var a,s,esum,b:t1;
    46.     rs,ra:byte;
    47.     i,j:integer;
    48. begin
    49.   for i:=1 to 4 do
    50.   begin
    51.     a[i]:=( B_In and (1 shl (8-A_POS[i])) ) shr (8-A_POS[i]);
    52.     s[i]:=( B_In and (1 shl (8-S_POS[i])) ) shr (8-S_POS[i]);
    53.   end;
    54.   for i:=0 to 3 do
    55.   begin
    56.     rs:=s[i+1];
    57.     for j:=1 to 3 do
    58.       rs:=rs xor a[C_S[3*i+j]];
    59.     esum[i+1]:= rs;
    60.   end;
    61.   rs:=0;
    62.   for i:=1 to 4 do
    63.     rs:=rs or ((esum[i]) shl (4-i));
    64.   //
    65.   //
    66.   case rs of
    67.         0:    ecInf:=0{not err};
    68.         $07:  begin a[4]:= a[4] xor 1; ecInf:=1; end; // rs=1110
    69.         $0b:  begin a[3]:= a[3] xor 1; ecInf:=1; end; // rs=1101
    70.         $0d:  begin a[2]:= a[2] xor 1; ecInf:=1; end; // rs=1011
    71.         $0e:  begin a[1]:= a[1] xor 1; ecInf:=1; end; // rs=0111
    72.         $01:  ecInf:=0;
    73.         $02:  ecInf:=0;
    74.         $04:  ecInf:=0;
    75.         $08:  ecInf:=0;
    76.         else  ecInf:=10; {more or equ 2 err};
    77.       end;
    78.   ra:=0;
    79.   for i:=1 to 4 do
    80.     ra:=ra or (a[i] shl (4-i));
    81.   result:=ra;
    82.   {
    83.   MxCorrect= array [1..32] of byte
    84.                ( 1,0,0,0
    85.                  1,1,0,1
    86.                  1,0,1,1
    87.                  0,1,0,0
    88.                  1,0,1,1
    89.                  0,0,1,0
    90.                  0,1,1,1
    91.                  0,0,0,1 );
    92.   for i:=1 to 4 do
    93.   b[i]:=( B_In and (1 shl (8-i)) ) shr (8-i);
    94.     b[4+i]:=( B_In and (1 shl (4-i)) ) shr (4-i);
    95.  
    96.   while (j<8) and ( not (
    97.           (esum[1]=MxCorrect[j*4+1]) and (esum[2]=MxCorrect[j*4+2]) and
    98.           (esum[3]=MxCorrect[j*4+3]) and (esum[4]=MxCorrect[j*4+4]) )) do
    99.     Inc(j);
    100.   if (j<8) then
    101.     b[i]:= b[i] xor 1;
    102.   }
    103. end;
     
  5. 4d5a

    4d5a New Member

    Публикаций:
    0
    Регистрация:
    29 май 2007
    Сообщения:
    4
    Комилятор Borland Delphi 6
    За комментами обращатся на мыло.
     
  6. 4d5a

    4d5a New Member

    Публикаций:
    0
    Регистрация:
    29 май 2007
    Сообщения:
    4
    пасиб что не оставили вопрос без внимания
     
  7. Stiver

    Stiver Партизан дзена

    Публикаций:
    0
    Регистрация:
    18 дек 2004
    Сообщения:
    812
    Адрес:
    Germany
    4d5a
    Да нет, не напоминающий.. Это он и есть. Расширенный Hamming code Hamming(8,4) (в другой записи HAM(3,2)) с битом паритета, также известный под названием Bauer code. Если нужно наглядное построение, то лучше всего через многомерную (в данном случае трехмерную) решетку. Простые числа здесь - не пришей кобыле хвост.. В общем велосипед изобретен успешно :) Только не стоит его в таком виде где-нибудь кроме диплома использовать - засмеют.
     
  8. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    Тоже сложилось впечатление, что это одно и то же. Просто разница в размещении информационных разрядов, в которой выигрыша/проигрыша мне (пока) не видно. Где же здесь простые числа и их свойства используются?
     
  9. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Может, имелась в виду ортогональность, а не простые числа?
     
  10. dag

    dag New Member

    Публикаций:
    0
    Регистрация:
    17 авг 2004
    Сообщения:
    446
    asmfan
    Quantum
     
  11. persicum

    persicum New Member

    Публикаций:
    0
    Регистрация:
    2 фев 2007
    Сообщения:
    947
    Вот как работает RAID-массив на остатках от деления на простое число =))).
    Излагаю вариант, когда места потерянных символов известны.

    Простое число пусть будет, эээ… 257.

    Пусть 5 устройств будут пользовательскими, а 3 - проверочными.

    Матрица Вандермонда A(i,j)=i^(j-1):
    1 1 1 1 1
    1 2 4 8 16
    1 3 9 27 81

    Наши данные, например,
    D=
    7
    15
    144
    200
    250

    Вычисляем проверочные данные R=A*D mod 257:
    R=
    102
    45
    13

    Теперь, положим, мы потеряли тома сo значением 15, 200, 250

    Берем вместо пользовательских томов три резервных тома:
    X=
    7
    102
    144
    45
    13

    Матрица для лечения будет
    B=
    1 0 0 0 0
    1 1 1 1 1
    0 0 1 0 0
    1 2 4 8 16
    1 3 9 27 81

    Тут самое интересное!
    Эту матрицу нужно О-Б-Е-Р-Н-У-Т-Ь!!!
    Обратной матрицей будет:
    I=
    1 0 0 0 0
    135 25 163 58 39
    0 0 1 0 0
    51 151 163 59 253
    70 82 187 140 222

    Умножаем теперь I*X mod 257 и получаем
    7
    15
    144
    200
    250

    Урра!!!! Три случайных диска грохнули и все пять восстановили!!!

    А вот этим кодом мы оборачивали матрицу =))).


    Код (Text):
    1.  
    2. for k=1:5,
    3.  p=a(k,k);
    4.  a(k,k)=1;
    5.  for i=1:5,
    6.   if i != k,
    7.    a(k,i)=-a(k,i);
    8.   end;
    9.  end;
    10.  for i=1:5,
    11.   for j=1:5,
    12.    if (i !=k ) && (j != k),
    13.     a(i,j)=a(i,j)*p+a(i,k)*a(k,j);
    14.    end;
    15.   end;
    16.  end;
    17.  for i=1:256,
    18.   if mod(i*p,257) == 1,
    19.    inv_el=i;
    20.   end;
    21.  end;
    22.  for i=1:5,
    23.   for j=1:5,
    24.    a(i,j)=mod(a(i,j)*inv_el,257);
    25.   end;
    26.  end;
    27. end;