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

时间:2015-11-04 16:57:43

标签: matlab signal-processing communication linear-algebra galois-field

我有一个二进制矩阵A(仅10),以及伽罗瓦域中的向量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 个答案:

答案 0 :(得分:6)

错误

  

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

之所以出现是因为Matlab不支持将标准数学运算(+*.*.^\等)应用于Galois Fields不同的订单,GF(2)GF(256)。反向操作inv(A)是一个有效的操作,如果你自己shown执行它{@ 3}},它将成功并在{A中生成反转GF(2) 1}}。当您尝试将inv(A)D相乘时,您的计算会失败,因为这些伽罗瓦字段的顺序不匹配。

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

如果我们因此修改为A创建Galois字段的代码

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
因此,{p> C位于GF(256)并产生预期结果。

答案 1 :(得分:3)

似乎有

A)计算中的理论错误或

B)MATLAB不支持的东西。

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

  

部分概述。您可以对Galois执行算术运算   数组使用熟悉的MATLAB运算符,如下表所示。   无论何时操作一对Galois阵列,两个阵列都必须   在同一个Galois领域。

你的矩阵不是。

我不知道是哪一个,因为我不知道Galois字段是如何工作的