Java 为什么这个矩阵乘法函数会产生不正确的输出?
我当前的实现如下所示,根据这里的评论,从中提取并修改为使用异或而不是添加。假设所有输入矩阵为4x4(并且,对于本实施的目标,可接受)Java 为什么这个矩阵乘法函数会产生不正确的输出?,java,matrix-multiplication,Java,Matrix Multiplication,我当前的实现如下所示,根据这里的评论,从中提取并修改为使用异或而不是添加。假设所有输入矩阵为4x4(并且,对于本实施的目标,可接受) /** * Produces the product of two matrices, treating the first parameter as the "left" matrix. */ public static int[][] multiplyMatrices(int[][] a, int[][] b) { int[][] resultMatr
/**
* Produces the product of two matrices, treating the first parameter as the "left" matrix.
*/
public static int[][] multiplyMatrices(int[][] a, int[][] b)
{
int[][] resultMatrix = new int[4][4];
for (int i = 0; i < 4; i++)
{
for(int j = 0; j < 4; j++)
{
for(int k = 0; k < 4; k++)
{
resultMatrix[i][j] = resultMatrix[i][j] ^ multiplyPolynomials(a[i][k], b[k][j]);
}
}
}
return resultMatrix;
}
运行multilymatrices
后,resultMatrix
作为reduceMatrix
的参数传递,定义如下,第二个参数为0x011b。(tobistring
只是Integer.toBinaryString
的快捷方式)
有了这些输入,输出矩阵(十六进制,约化模0x011b)为:
但是,手动完成还原会产生不同的结果:
06 af 55 7c
b7 e0 4b ca
a7 35 2e a1
66 3d 06 5c
因此,很明显,编写的程序工作不正常。但是,以下第二个输入矩阵(使用相同的第一个矩阵)返回正确的结果:
30 ca 96 24
32 92 09 23
3f ca 43 63
7d 5a f8 96
上述输入的预期(和收到的)结果如下:
74 b2 97 d8
68 ea b9 51
fb 39 0a 60
a7 a9 00 1b
显然,
多矩阵
的输出并不是所有情况下的预期结果。所使用的矩阵乘法算法似乎对链接问题的海报起到了作用,我之前已经验证了multiplypolynomals
的效果与预期相符。多重矩阵输出不准确的最可能原因是什么?为什么有些输入会产生正确的输出?您必须明确解释这些函数的作用,特别是multiplypolymals
和modulereduce
。您的multiplypolymals
函数似乎是普通整数乘法的一个冗长的重新实现。如果在GF(256)中这应该是乘法,那么它看起来就不对了。添加了解释每个方法用途的注释。我对GF(256)中系数mod 2的乘法的理解是,它是通过一系列左移位和XOR运算完成的,而且,当使用系数mod 2时,XOR等价于加法。+
不是您想要的特殊加法。这是普通的整数加法,不是系数为mod 2的压缩多项式加法。不幸的是,在多重多项式
和多重多项式
中用=a^b替换+=对某些输入有效,但对其他输入无效。这似乎是朝着正确的方向迈出的一步,但还没有完全实现。你必须明确地解释这些函数应该做什么,特别是multiplypolymals
和modulereduce
。您的multiplypolymals
函数似乎是普通整数乘法的一个冗长的重新实现。如果在GF(256)中这应该是乘法,那么它看起来就不对了。添加了解释每个方法用途的注释。我对GF(256)中系数mod 2的乘法的理解是,它是通过一系列左移位和XOR运算完成的,而且,当使用系数mod 2时,XOR等价于加法。+
不是您想要的特殊加法。这是普通的整数加法,不是系数为mod 2的压缩多项式加法。不幸的是,在多重多项式
和多重多项式
中用=a^b替换+=对某些输入有效,但对其他输入无效。这似乎是在正确的轨道上迈出的一步,但还没有完全实现。
10 26 03 15
23 41 33 04
51 32 14 43
12 12 12 12
06 af 55 7c
b7 e0 4b ca
a7 35 2e a1
66 3d 06 5c
30 ca 96 24
32 92 09 23
3f ca 43 63
7d 5a f8 96
74 b2 97 d8
68 ea b9 51
fb 39 0a 60
a7 a9 00 1b