Math 伽罗瓦域中的加法和乘法

Math 伽罗瓦域中的加法和乘法,math,qr-code,reed-solomon,galois-field,Math,Qr Code,Reed Solomon,Galois Field,我试图在一个非常有限的嵌入式平台上生成二维码。除了生成纠错码字之外,中的所有内容似乎都相当简单。我已经研究了一系列现有的实现,它们都试图实现一系列直接在我脑海中出现的多项式数学,特别是关于伽罗瓦域。在数学复杂性和内存需求方面,我能看到的最直接的方式是在规范中列出的电路概念: 根据他们的描述,我很有信心我可以实现这一点,除了标记为GF(256)加法和GF(256)乘法的部分 他们提供以下帮助: QR码的多项式算法应使用按位模2算法和按字节计算 模100011101算术运算。这是一个2^8的伽罗瓦

我试图在一个非常有限的嵌入式平台上生成二维码。除了生成纠错码字之外,中的所有内容似乎都相当简单。我已经研究了一系列现有的实现,它们都试图实现一系列直接在我脑海中出现的多项式数学,特别是关于伽罗瓦域。在数学复杂性和内存需求方面,我能看到的最直接的方式是在规范中列出的电路概念:

根据他们的描述,我很有信心我可以实现这一点,除了标记为GF(256)加法和GF(256)乘法的部分

他们提供以下帮助:

QR码的多项式算法应使用按位模2算法和按字节计算 模100011101算术运算。这是一个2^8的伽罗瓦域 100011101表示场的素模 多项式x^8+x^4+x^3+x^2+1

这对我来说简直是希腊语


所以我的问题是:在这种伽罗瓦域算术中,最简单的加法和乘法方法是什么?假设两个输入数字都是8位宽,我的输出也需要8位宽。有几个实现预先计算,或者在两个查找表中硬编码以帮助实现这一点,但我不确定这些是如何计算的,或者在这种情况下我将如何使用它们。我不希望对这两个表使用512字节的内存,但这实际上取决于替代方案。我真的只需要帮助我理解如何在这个电路中做一个乘法和加法运算。

实际上只需要一个表。这就是GP(256)乘法。请注意,所有算术运算都是无进位的,这意味着没有进位传播

不带进位的加法和减法等价于异或运算

因此在GF(256)中,
a+b
a-b
都等价于
a或b

GF(256)乘法也是少进位的,并且可以用与少进位加法/减法类似的方式使用少进位乘法来实现。这可以通过硬件支持(例如)高效地完成

然而,最困难的部分是降低模
100011101
。在普通整数除法中,可以使用一系列比较/减法步骤来完成。在GF(256)中,您使用一系列比较/异或步骤以几乎相同的方式进行操作

事实上,如果只是预先计算所有256 x 256的乘法并将它们放入65536个条目的查找表中,速度会更快,这已经够糟糕的了

以下pdf的第3页对GF256算法有很好的参考:

(我正在跟进第一个答案中指向zxing的指针,因为我是作者。)

关于加法的答案完全正确;这就是为什么在这个领域工作在计算机上很方便

是的,乘法有效,适用于GF256。a*b实际上与exp(log(a)+log(b)相同。因为GF256只有256个元素,所以只有255个“x”的唯一幂,log也是如此。因此,很容易将它们放入查找表中。表格将在256处“环绕”,因此您会看到“%size”。“/size”在一句话中更难解释——因为实际上是1-255“环绕”,而不是0-255。所以这不仅仅是一个简单的模量

最后一部分可能是如何将模化为不可约多项式。不可约多项式是x^8加上一些低次项,对吧——称它为I(x)=x^8+R(x)。根据定义,多项式在域中与0全等;I(x)==0。所以x^8==-R(x)。方便地说,加法和减法是相同的,因此x^8==-R(x)==R(x)

我们唯一需要减少高次多项式的时间是在构造指数表时。你只需要一直乘以x(这是一个左移),直到它变得太大——得到一个x^8项。但是x^8与R(x)相同。所以你去掉x^8,加上R(x)。R(x)只有x^7的幂,所以它仍然在一个字节中,都在GF(256)中。你知道如何在这个字段中添加


帮助?

减少xor的加法非常好。当我使用65k查找表时,它是不可能的,它实际上非常类似于移位-加法二进制乘法算法。除了用XOR替换所有加法。100011101什么时候开始工作?此外,为什么当每个字节只有8个时会有9位呢?当你做模运算时会有9位。额外的位是隐式的。(虽然已经有一段时间了,所以我不知道该如何解释)我会看看我是否能在zxing源代码中找到我的示例代码:他们使用这个公式进行乘法:int logSum=logTable[a]+logTable[b];返回expTable[(logSum%size)+logSum/size];这是否足够?它需要两个表,但这可能是可以接受的。所以,如果我读得正确,简单地使用带有换行符和加法的字节是不够的?Div和mod是相当昂贵的操作,所以只有添加才是最好的。如果需要的话,我可以实现封装254->255->1->2的字节加法+1实际上,我在获取电路概念的参考实现时遇到了问题,甚至使用zxing代码进行GF加法和乘法。也许我会在zxing论坛上发布详细信息。如果您知道字段大小是256,那么
/
%
操作实际上只是
>8和
&0xFF
。我想你可以再优化一下。但是,在QR码解码过程中,Reed-Solomon纠错过程是一个非常小的部分。如果这是你的瓶颈,我会很惊讶。