我必须编写一个表格来查找 GF(24) 中的乘法逆元。我已经写出了乘法口诀表,我不希望再这样做了。这是我作为示例编写的表格。我希望没人再写这个。我觉得自己很愚蠢。
GF(24)的乘法表
// Multiplication table over Galois Field 2^4
byte mulTable[][] = {
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf},
{0, 2, 4, 6, 8, 0xa, 0xc, 0xe, 3, 1, 7, 5, 0xb, 9, 0xf, 0xd},
{0, 3, 6, 5, 0xc, 0xf, 0xa, 9, 0xb, 8, 0xd, 0xe, 7, 4, 1, 2},
{0, 4, 8, 0xc, 3, 7, 0xb, 0xf, 6, 2, 0xe, 0xa, 5, 1, 0xd, 9},
{0, 5, 0xa, 0xf, 7, 2, 0xd, 8, 0xe, 0xb, 4, 1, 9, 0xc, 3, 6},
{0, 6, 0xc, 0xa, 0xb, 0xd, 7, 1, 5, 3, 9, 0xf, 0xe, 8, 2, 4},
{0, 7, 0xe, 9, 0xf, 8, 1, 6, 0xd, 0xa, 3, 4, 2, 5, 0xc, 0xb},
{0, 8, 3, 0xb, 6, 0xe, 5, 0xd, 0xc, 4, 0xf, 7, 0xa, 2, 9, 1},
{0, 9, 1, 8, 2, 0xb, 3, 0xa, 4, 0xd, 5, 0xc, 6, 0xf, 7, 0xe},
{0, 0xa, 7, 0xd, 0xe, 4, 9, 3, 0xf, 5, 8, 2, 1, 0xb, 0xc, 6},
{0, 0xb, 5, 0xe, 0xa, 1, 0xf, 4, 7, 0xc, 2, 9, 0xd, 6, 8, 3},
{0, 0xc, 0xb, 7, 5, 9, 0xe, 2, 0xa, 6, 1, 0xd, 0xf, 3, 4, 8},
{0, 0xd, 9, 4, 1, 0xc, 8, 5, 2, 0xf, 0xb, 6, 3, 0x3, 0xa, 7},
{0, 0xe, 0xf, 1, 0xd, 3, 2, 0xc, 9, 7, 6, 8, 4, 0xa, 0xb, 5},
{0, 0xf, 0xd, 2, 9, 6, 4, 0xb, 1, 0xe, 0xc, 3, 8, 7, 5, 0xa}
};
我不想再为逆矩阵做同样的事情!
有谁知道适合复制和粘贴的表(最好是 Java 或 C 16x16 数组)?我搜索了 github,试图找到一个已经写好的版本,但没有任何乐趣。
动机/理性
我并不严格要求必须进行表查找,但我不想添加一百行代码只是为了动态生成字段(这只是一个估计,但我怀疑我是否可以用更少的时间完成它)。
最佳答案
乘法表表示二元运算“*”:x * y = z 当且仅当 mulTable[x][y] == z
元素 x 的逆元素是另一个元素 y,使得 x * y = 1,相当于 mulTable[x][y] == 1。有时逆元素不存在。对于这个二元运算,0 的逆元不存在。在此背景下,以下代码仅使用您提供的乘法表来计算逆矩阵。
public static byte[] computeInverseTable() {
byte [] inverseTable = new byte[16];
inverseTable[0] = 0; // the inverse of 0 doesn't exist.
for (int x = 1; x<16; x++) {
for (int y = 1; y<16; y++) {
if (mulTable[x][y] == 1) {
inverseTable[x] = (byte) y;
break;
}
}
}
return inverseTable;
}
关于java - Java 或 C 数组中的乘法逆表 GF(2^4),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26707068/