我正在实现GF(8)乘法。基本多项式为x ^ 3 + x + 1。 我知道一些基础知识:如果乘法溢出,我可以将其与原始多项式进行异或运算,并将其带入有限域的范围。
但是,当溢出发生一位以上时,就会发生故障。例如: 正确的结果:二进制结果12(1001)中的alpha ^ 3(011)* alpha ^ 2(100)。乘积溢出,因此使用原始多项式进行XOR运算得出正确的值,即alpha ^ 5(111)。 不正确的结果:二进制结果21(10101)中的alpha ^ 5(111)* alpha ^ 3(011)。此处结果溢出两位,并且对原始多项式进行XOR运算不正确结果。
我想念什么?
答案 0 :(得分:0)
GF乘法是多项式乘法,因此没有进位。因此111 * 011 = 1001,而1001模1011为010。但是,请考虑情况100 * 100 =10000。在这种情况下,您需要执行两个“除法”步骤(类似于使用低级二进制数学计算CRC,而是使用XOR减去)。
10
-------
1011 | 10000
1011
----
110
000
---
110
所以100 * 100 mod 1011 = 110。
您可以创建一个反日志表和一个日志表。对于基于x ^ 3 + x + 1的GF(8)= GF(2 ^ 3)字段,所有7个非零数字都是1x + 0(十六进制2)的幂:
0 1 2 3 4 5 6 antilog table
001 010 100 011 110 111 101
001 010 011 100 101 110 111 log table
0 1 3 2 6 4 5
使用表,a * b = alog((log(a)+ log(b))%7)。 100 * 100 = alog((log(100)+ log(100))%7)= alog((2 + 2)&7 = alog(4)= 110. 110 * 111 = alog((log(110)+ log (111))%7)= alog((4 + 5)%7)= alog(2)= 100。
您可以通过将Antilog表加倍来消除对%7的需要,日志表将保持不变:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 antilog table
001 010 100 011 110 111 101 001 010 100 011 110 111 101
a * b = alog(log(a)+ log(b))。同样适用于除法:a / b = alog(7 + log(a)-log(b))。