如何在 Matlab 中执行 GF(2) 的逆运算和 GF(256) 的乘法运算?

How to perform inverse in GF(2) and multiply in GF(256) in Matlab?

我有一个二进制矩阵 A(只有 10),以及伽罗华域 (256) 中的向量 D。向量 C 计算为:

  C = (A^^-1)*D

其中A^^-1表示GF(2)中矩阵A的逆矩阵,*为乘法运算。结果向量 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.

你能帮我实现我的预期结果吗?

好像有

A) 您计算中的理论错误或

B) MATLAB 不支持的东西。

根据 Galois field arithmetic 中的文档(强调我的):

Section Overview. You can perform arithmetic operations on Galois arrays by using familiar MATLAB operators, listed in the table below. Whenever you operate on a pair of Galois arrays, both arrays must be in the same Galois field.

而你的矩阵不是。

我不知道是哪一个,因为我不知道伽罗华域是如何工作的

错误

Error using * (line 14)
Orders must match.

出现是因为 Matlab 不支持应用标准数学运算(+*.*.^\ 等)来不同阶的伽罗华域,GF(2)GF(256)。逆运算 inv(A) 是一个有效的运算,如果您将其作为 by @Ander Biguri 单独执行,它将成功并在 GF(2) 中生成 A 的逆运算。当您尝试将 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) 中并产生预期的结果。