【问题标题】:How to perform inverse in GF(2) and multiply in GF(256) in Matlab?如何在 Matlab 中的 GF(2) 中执行逆运算并在 GF(256) 中进行乘法?
【发布时间】:2015-11-04 16:57:42
【问题描述】:

我有一个二进制矩阵A(只有10),以及一个向量D 在伽罗瓦域(256)。向量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.

您能帮我达到预期的效果吗?

【问题讨论】:

  • 注意:这与逆无关,仅与乘法有关。如果您将代码更改为invA=inv(A); C=invA*D,错误将出现在最后一行。
  • @AnderBiguri 无论如何,错误都在最后一行。 OP 帖子中的错误应为问题中的代码using *。 .* 和 * 的使用不影响最终结果或产生错误。

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


【解决方案1】:

错误

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

出现是因为 Matlab 不支持将标准数学运算(+*.*.^\ 等)应用于不同阶的伽罗瓦域,GF(2) 和 @987654329 @。逆运算,inv(A) 是一个有效的操作,如果你以 shown 由 @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) 中并产生预期的结果。

【讨论】:

  • 感谢 IKavanagh,很抱歉我迟到了回复。这是一个很好的答案。
【解决方案2】:

好像有一个

A) 你的计算中存在理论上的错误或

B) MATLAB 不支持的东西。

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

部分概述。您可以在 Galois 上执行算术运算 使用下表列出的熟悉的 MATLAB 运算符创建数组。 当你对一对伽罗瓦数组进行操作时,两个数组都必须是 在同一个伽罗瓦域中。

而你的矩阵不是。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-17
    • 2021-02-21
    • 1970-01-01
    • 2021-06-13
    相关资源
    最近更新 更多