如何在 Matlab 中执行 GF(2) 的逆运算和 GF(256) 的乘法运算?
How to perform inverse in GF(2) and multiply in GF(256) in Matlab?
我有一个二进制矩阵 A
(只有 1
和 0
),以及伽罗华域 (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)
中并产生预期的结果。
我有一个二进制矩阵 A
(只有 1
和 0
),以及伽罗华域 (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)
是一个有效的运算,如果您将其作为 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)
中并产生预期的结果。