如何在GF(2)中执行逆运算并在Matlab中乘以GF(256)?

use*_*460 1 matlab signal-processing communication linear-algebra galois-field

我有一个二进制矩阵 A(仅10),以及D伽罗瓦域中的矢量(256).矢量C计算如下:

  C = (A^^-1)*D
Run Code Online (Sandbox Code Playgroud)

其中A^^-1表示矩阵的逆矩阵AGF(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]
Run Code Online (Sandbox Code Playgroud)

但是,对于上面的代码,我无法实现我的预期结果

C=[103;187;125;210;181;220;161;20;175;175;187;187;220;115]
Run Code Online (Sandbox Code Playgroud)

它会产生错误

Error using  *  (line 14)
Orders must match.
Run Code Online (Sandbox Code Playgroud)

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

IKa*_*agh 6

错误

使用*时出错(第14行)
订单必须匹配.

出现是因为Matlab的不支持应用标准的数学运算(+,*,.*,.^,\,等),以不同的顺序的伽罗瓦域,GF(2)GF(256).逆操作inv(A)是一个有效的操作,如果你自己执行它,如@ Ander Biguri 所示,它将成功并生成in 的倒数.当你试图乘以时,你的计算会失败,因为这些伽罗瓦域的次序不匹配.AGF(2)inv(A)D

在这个例子中,没有必要明确地定义A为2阶的伽罗瓦域,GF(2)因为乘法GF(256)发生在GF(2).那是1 + 1 = 0.

如果我们这样修改,对于创建伽罗华域代码A

A = gf(A, 8);
Run Code Online (Sandbox Code Playgroud)

然后我们可以表演

C = inv(A)*D
Run Code Online (Sandbox Code Playgroud)

哪个产生

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
Run Code Online (Sandbox Code Playgroud)

C因此,GF(256)并产生预期的结果.