Как выполнить обратное в 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, перечисленные в таблице ниже. Всякий раз, когда вы работаете с парой массивов Галуа, оба массива должны находиться в одном поле Галуа.
А твои матрицы нет.
Я не могу знать, какой это, поскольку я понятия не имею, как работают поля Галуа