Как выполнить обратное в GF(2) и умножить в GF(256) в Matlab?

У меня есть двоичная матрица A (только 1 а также 0) и вектор D в поле Галуа (256). Вектор C рассчитывается как:

  C = (A^^-1)*D

где A^^-1 обозначает обратную матрицу матрицы A в GF(2), * это умножение операции. Вектор результата C должен быть в GF(256), Я пытался сделать это в Matlab.

A= [ 1     0     0     1     1     0     0     0     0     0     0     0     0     0;
     1     1     0     0     0     1     0     0     0     0     0     0     0     0;
     1     1     1     0     0     0     1     0     0     0     0     0     0     0;
     0     1     1     1     0     0     0     1     0     0     0     0     0     0;
     0     0     1     1     0     0     0     0     1     0     0     0     0     0;
     1     1     0     1     1     0     0     1     0     1     0     0     0     0;
     1     0     1     1     0     1     0     0     1     0     1     0     0     0;
     1     1     1     0     0     0     1     1     1     0     0     1     0     0;
     0     1     1     1     1     1     1     0     0     0     0     0     1     0;
     0     0     0     0     1     1     1     1     1     0     0     0     0     1;
     0     1     1     1     1     0     1     1     1     0     1     1     1     0;
     0     0     0     1     0     0     0     1     0     0     0     0     0     0;
     0     0     1     0     0     0     0     1     0     0     0     0     0     0;
     1     1     1     1     0     0     0     0     0     0     0     0     0     0]

D=[0;0;0;0;0;0;0;0;0;0;103;198;105;115]
A=gf(A,1);
D=gf(D,8); %%2^8=256
C=inv(A)*D
%% The corrected result must be
%%C=[103;187;125;210;181;220;161;20;175;175;187;187;220;115]

Тем не менее, для приведенного выше кода, я не могу достичь, как мой ожидаемый результат

C=[103;187;125;210;181;220;161;20;175;175;187;187;220;115]

Выдает ошибку как

Error using  *  (line 14)
Orders must match.

Не могли бы вы помочь мне достичь ожидаемого результата?

2 ответа

Решение

Ошибка

Ошибка при использовании * (строка 14)
Заказы должны совпадать.

возникает потому, что Matlab не поддерживает применение стандартных математических операций (+, *, .*, .^, \ и т. д.) к полям Галуа разного порядка, GF(2) а также GF(256), Обратная операция, inv(A) является допустимой операцией, и если вы выполните ее самостоятельно, как показано @ Ander Biguri, она Ander Biguri успешно и сгенерирует обратное значение A в GF(2), Ваш расчет нарушается, когда вы пытаетесь умножить inv(A) а также D поскольку порядки этих полей Галуа не совпадают.

В этом примере нет необходимости явно определять A как поле Галуа порядка 2, GF(2) как умножение в GF(256) происходит в GF(2), То есть 1 + 1 = 0,

Таким образом, если мы изменим код, который создает поле Галуа для A в

A = gf(A, 8);

мы можем затем выполнить

C = inv(A)*D

который производит

C = GF(2^8) array. Primitive polynomial = D^8+D^4+D^3+D^2+1 (285 decimal)

Array elements = 

         103
         187
         125
         210
         181
         220
         161
          20
         175
         175
         187
         187
         220
         115

C Таким образом, в GF(256) и дает ожидаемый результат.

Кажется, есть либо

А) теоретическая ошибка в ваших вычислениях или

Б) то, что MATLAB не поддерживает.

Согласно документации в полевой арифметике Галуа (выделено мое):

Обзор раздела. Вы можете выполнять арифметические операции над массивами Галуа, используя знакомые операторы MATLAB, перечисленные в таблице ниже. Всякий раз, когда вы работаете с парой массивов Галуа, оба массива должны находиться в одном поле Галуа.

А твои матрицы нет.

Я не могу знать, какой это, поскольку я понятия не имею, как работают поля Галуа

Другие вопросы по тегам