如何将乘法值保持在有限域范围内?我正在实现GF(8)乘法

时间:2019-01-28 07:20:15

标签: verilog reed-solomon galois-field finite-field

我正在实现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运算不正确结果。

我想念什么?

1 个答案:

答案 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))。