вычитание, умножение, деление по модулю 2

Тема в разделе "WASM.BEGINNERS", создана пользователем dasssha, 17 май 2010.

  1. dasssha

    dasssha New Member

    Публикаций:
    0
    Регистрация:
    17 май 2010
    Сообщения:
    3
    Добрый день!
    Подскажите, пожалуйста чайнику, как производится вычитание, умножение, деление по модулю 2.
    Очень нужно найти определитель и обратную матрицу к двоичной.
    Заранее большое спасибо!
     
  2. persicum

    persicum New Member

    Публикаций:
    0
    Регистрация:
    2 фев 2007
    Сообщения:
    947
    Ну слушай Дашша!
    Сложение и вычитание - XOR
    умножение и деление - AND

    что такое эти XOR и AND - предлагаю разобраться самостоятельно.
    Обращение матрицы ничем не отличается от гаусса или жордана для обычных чисел. Ясен глаз, нужна перестановка строк чтобы не делить на ноль. А перестановка столбцов не нужна, тк ошибок округления нет. Детерменант - это просто 0 или 1 в зависимости от того вырождена матрица или нет. Находится приведением матрицы к треугольному виду.
     
  3. persicum

    persicum New Member

    Публикаций:
    0
    Регистрация:
    2 фев 2007
    Сообщения:
    947
    Вот еще, вероятность того что случайная двоичная матрица невырождена довольна высока и равна 28%. Стало быть с третьего раза получится =)))
     
  4. dasssha

    dasssha New Member

    Публикаций:
    0
    Регистрация:
    17 май 2010
    Сообщения:
    3
    Добрый день!
    Пожалуйста, помогите еще раз!
    Не могу найти ошибку в коде. Нужно найти обратную матрицу с помощью верхнетреугольной (системой линейных уравнений).
    for i:=n-1 downto 0 do
    begin
    j:=i+1;
    while (j<n) do
    begin
    o[i,k]:=o[i,k]-(z[i,j]*x[j,k]);
    j:=j+1
    end;
    x[i,k]:=o[i,k]/z[i,i]
    end
    o - единичная матрица,
    z - исходная матрица, преобразованная к верхнетреугольному виду,
    x - искомая матрица.
     
  5. persicum

    persicum New Member

    Публикаций:
    0
    Регистрация:
    2 фев 2007
    Сообщения:
    947
    Дашш... А ты эта... мальчонка или девчонка?
    Получай курсовую работу целиком!
    Надеюсь, разберешься что к чему...

    Код (Text):
    1. {$APPTYPE CONSOLE}
    2.  
    3. const N=10;
    4.  
    5. type Field=byte;
    6. type matrix=array of array of Field;
    7.  
    8. var U,A,B,At:Matrix;
    9.  
    10.  
    11. procedure GetMemory(var a:Matrix);
    12. var i:Cardinal;
    13. begin
    14.  SetLength(a,N);
    15.  i:=0;
    16.  while i<N do begin
    17.   SetLength(a[i],N);
    18.   inc(i);
    19.  end;
    20. end;
    21.  
    22. procedure FreeMemory(var a:Matrix);
    23. var i:Cardinal;
    24. begin
    25.  i:=0;
    26.  while i<N do begin
    27.   SetLength(a[i],0);
    28.   inc(i);
    29.  end;
    30.  SetLength(a,0);
    31. end;
    32.  
    33. procedure PrintMatrix(var a:Matrix);
    34. var i,j:Cardinal;
    35. begin
    36.  i:=0;
    37.  while i<N do begin
    38.   j:=0;
    39.   while j<N do begin
    40.    write(a[i,j]:2);
    41.    inc(j);
    42.   end;
    43.   writeln;
    44.   inc(i);
    45.  end;
    46. end;
    47.  
    48. procedure MultMatrix(var c,a,b:Matrix);
    49. var i,j,k:Cardinal;
    50. begin
    51.  i:=0;
    52.  while i<N do begin
    53.   j:=0;
    54.   while j<N do begin
    55.    c[i,j]:=0;
    56.    k:=0;
    57.    while k<N do begin
    58.     c[i,j]:=c[i,j] xor (a[i,k] and b[k,j]);
    59.     inc(k);
    60.    end;
    61.    inc(j);
    62.   end;
    63.   inc(i);
    64.  end;
    65. end;
    66.  
    67. procedure CopyMatrix(var a,b:Matrix);
    68. var i,j:Cardinal;
    69. begin
    70.  i:=0;
    71.  while i<N do begin
    72.   j:=0;
    73.   while j<N do begin
    74.    a[i,j]:=b[i,j];
    75.    inc(j);
    76.   end;
    77.   inc(i);
    78.  end;
    79. end;
    80.  
    81. procedure GetRandomMatrix(var a:Matrix);
    82. var i,j:cardinal;
    83. begin
    84.  i:=0;
    85.  while i<N do begin
    86.   j:=0;
    87.   while j<N do begin
    88.    a[i,j]:=Random(2);
    89.    inc(j);
    90.   end;
    91.   writeln;
    92.   inc(i);
    93.  end;
    94. end;
    95.  
    96. procedure GetUnityMatrix(var a:Matrix);
    97. var i,j:cardinal;
    98. begin
    99.  i:=0;
    100.  while i<N do begin
    101.   j:=0;
    102.   while j<N do begin
    103.    if i=j then a[i,j]:=1 else a[i,j]:=0;
    104.    inc(j);
    105.   end;
    106.   inc(i);
    107.  end;
    108. end;
    109.  
    110. function InvMatrix(var a,b:Matrix):boolean;
    111. var i,j,k:Cardinal;
    112.     tmp:Field;
    113. begin
    114.  
    115.  i:=0;
    116.  while i<N do begin
    117.   j:=i;
    118.   while (j<N) and (a[j,i]=0) do inc(j);
    119.   if j=N then begin
    120.    Result:=false;
    121.    Exit;
    122.   end;
    123.   if i<>j then begin
    124.    k:=0;
    125.    while k<N do begin
    126.     tmp:=a[i,k]; a[i,k]:=a[j,k]; a[j,k]:=tmp;
    127.     tmp:=b[i,k]; b[i,k]:=b[j,k]; b[j,k]:=tmp;
    128.     inc(k);
    129.    end;
    130.   end;
    131.   j:=i+1;
    132.   while j<N do begin
    133.    if a[j,i]<>0 then begin
    134.     k:=0;
    135.     while k<N do begin
    136.      a[j,k]:=a[j,k] xor a[i,k];
    137.      b[j,k]:=b[j,k] xor b[i,k];
    138.      inc(k);
    139.     end;
    140.    end;
    141.    inc(j);
    142.   end;
    143.   inc(i);
    144.  end;
    145.  
    146.  i:=0;
    147.  while i<N do begin
    148.   j:=i+1;
    149.   while j<N do begin
    150.    if a[N-1-j,N-1-i]<>0 then begin
    151.     k:=0;
    152.     while k<N do begin
    153.      a[N-1-j,N-1-k]:=a[N-1-j,N-1-k] xor a[N-1-i,N-1-k];
    154.      b[N-1-j,N-1-k]:=b[N-1-j,N-1-k] xor b[N-1-i,N-1-k];
    155.      inc(k);
    156.     end;
    157.    end;
    158.    inc(j);
    159.   end;
    160.   inc(i);
    161.  end;
    162.  
    163.  Result:=true;
    164.  
    165. end;
    166.  
    167. BEGIN
    168.  
    169.   GetMemory(A);
    170.   GetMemory(B);
    171.   GetMemory(At);
    172.   GetMemory(U);
    173.  
    174.   Randomize;
    175.   //RandSeed:=11;
    176.   GetRandomMatrix(A);
    177.   GetUnityMatrix(U);
    178.  
    179.   CopyMatrix(B,A);
    180.   if not InvMatrix(B,U) then begin
    181.    writeln('Matrix is singular');
    182.    Exit;
    183.   end;
    184.   CopyMatrix(At,U);
    185.  
    186.   MultMatrix(U,A,At);
    187.   PrintMatrix(U);
    188.   MultMatrix(U,At,A);
    189.   PrintMatrix(U);
    190.  
    191.   FreeMemory(A);
    192.   FreeMemory(B);
    193.   FreeMemory(At);
    194.   FreeMemory(U);
    195. end.
     
  6. Nafanya

    Nafanya Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    581
    Добрый день!
    Хотел узнать Ваше мнение.
    Можно ли рассматривать операцию сложение по модулю два для пары слов (Pn....P2P1P0 XOR Kn.....K2K1K0) или по простому (P XOR K), где Pn n-разрядное слово открытого текста, а Kn- n-разрядный ключ, как управляемый ключем S-блок подстановки?
    Если нет, то интересно как тогда выглядит S-box, управляемый ключем, а не с жёсткой логикой.
     
  7. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    Nafanya,

    S-подстановка (мы говорим о DES-подобных шифрах, да?) обычно фиксирована, хотя ничто не мешает генерировать её матрицу на основе ключа. Единственное «но» — криптостойкость полученного алгоритма. S-boxes товарищи специально рисовали руками для обеспечения эвеланш-эффекта. Будет ли сгенерёная обеспечивать — вопрос.
     
  8. Nafanya

    Nafanya Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    581
    Да..., у DES лавинный эффект просто грандиозный! Изменение 1 бита открытого текста влияет на 29 бит шифротекста! Изменение приблизительно в 1,5 процентах исходного текста создают изменение приблизительно 45 процентов зашифрованного текста. Круто конечно.
    baldr
    А вы встречали s-блок, управляемый ключем? В DES'е такого нет, там ключ раунда вводит отбеливатель после p-блока расширения 32-48 бит.
     
  9. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    Nafanya,

    Как работает DES — я в курсе, спасибо. Основной вклад в лавинное накопление отличий там вносит всё-таки метод Фейстеля (многие называют это сетью, а я против: не всякий орграф — полноценная сеть :derisive:.

    Тут как с LCG/CRC: только тщательно подобранные константы дают желаемый результат (ну или нечто приближённое).