伽罗华域, 二维码和CRC

前言
一个表盘只有0-59的数字.
超出59的数字会被60取余, 即61/60=1.


在数学上, 我们已经习惯了在无线域上随意地加减乘除而不考虑边界.
假如世界不是由无限构成, 而只有3位比特, 0-7这8个数字组成, 又如何保持计算规律的自洽呢?
我们可以仿照表盘的设计, 超出域的部分取余,让数字回到域内. 但除法却无法计算, 因为有限域的8个数字里没有小数.

伽罗华域拟出了一个全新的有限域规则, 在那个域中, 加减乘除规则被修改, 但却让计算结果永远落在有限域中.

伽罗华域

伽罗华域因为是有限域, 所以要说明它的边界在哪里.
我们用GF(n^w)来符号化.
其中, GF代表伽罗华域, n代表进制数, w代表位数.

我们以GF(2^3)为例. 它的边界是000~111.
伽罗华域中

  1. 加减法被删除, 取而代之的是异或运算.
  2. 乘除法被模二乘除法代替.
  3. 超出有限域的数字(M), 需要被本原多项式P取余. 符号表示为M mod P.

本原多项式

本原多项式是帮助域外数字坍缩到域内的多项式. 具体操作是与它取余, 即M mod P.
本原多项式是计算得出的, GF(2^3)的本原表达式是 x 3 + x + 1 x^3+x+1 x3+x+1, 即1011.
一个GF的本原多项式可以有很多, 毕竟域内的计算规则都改变了. 如何得到有限域的本原多项式在这里不解释.
总之, 有了本原多项式, 域内的计算结果就会永远落在域内这几个数字上.

举例(图画不好, 不举了)

总之, 记住有限域的计算规则, 不要惯性思维地还按照常规的加减乘除计算.

CRC校验

我将一串二进制数字10011发送给其他人, 如何验证这个数字传输正确呢?
答案是纠错码.
我在发送10011时会在其末尾再添加一位数, 以表示我传输的数字中1出现的次数是奇数or偶数, 奇1偶0. 因为1出现了3次, 所以在末尾添加1, 连起来就是100111. 如果某一位传输时错误了, 奇偶性就会出错. 这叫做奇偶校验法.但如果一次性错了两位, 这个办法就失效了.

CRC校验也是基于纠错码的, 但更复杂.
CRC有很多版本. 选择一个版本, 会得到一个除数P和次数n. 在原数据10011后面添加n个0, 然后与P做模二除法, 会得到n位的余数(不够则余数前面补0).
将余数加入10011的后面, 这组数字再与P做模二除法, 就会被整除.
CRC版本越大, 其安全性越高, 否则就会像奇偶校验一样不稳定.但n也会越大, 传输数据会变长.

二维码

二维码张贴在外, 扫描时很容易因为污损, 光线强弱, 导致部分信息扫描错误. 本质上是信息传输错误的问题, 所以二维码也需要类似于CRC的办法.

二维码是伽罗华域的极好应用. 一个字符由两个字节表示, 二维码上信息长度固定, 很符合有限域的设定.

为了简便计算, 我们让单个字符由GF(2^3)表示, 一共4字符信息.
000 代表字符 0
001 代表字符 1

111 代表字符 7
如果我想在二维码中保存4个符号: 3417, 并以另外4个符号保存纠错码:

  1. 另固定数 U = ( x − 2 0 ) ( x − 2 1 ) ( x − 2 2 ) ( x − 2 3 ) U=(x-2^0)(x-2^1)(x-2^2)(x-2^3) U=(x20)(x21)(x22)(x23), 将其展开得到一个多项式(这里的系数加减法也使用伽罗华域规则).这里的2只是为了计算简单, 实际上取其他值不影响最高次幂, 也就不影响余数位数.
  2. 3417后面以4个0填充, 并做34170000 mod U, 这里是模二除法取余. 对应多项式的系数是GF(2^3)内的有限域数字, 所以加减法要用异或计算, 乘除要用模二计算, 记得域外取余.
  3. 余数是一个4位数字3255, 每一位数字都在GF(2^3)中. 这个计算非常复杂, 如果掌握了查表法会特别简单.
  4. 将余数接在3417末尾, 组成34173255, 这个数字就是最后的传输码, 它与U的余数为0.
    这里就很像CRC了, 除了我们为了多项式系数的运算引入了伽罗华域. 其他与CRC一模一样.
    (实际上CRC相当于引入的是GF(2^1))

神奇的是这套纠错码可以在数据出错时自我修复.
我们符号化前面的数字, 另34173547=M, 求余的商=h.
根据前面的计算, 可知 M = h ∗ U M = h * U M=hU.
又根据U的形式, 可知如果 x = 2 0 , 2 1 , 2 2 , 2 3 x=2^0, 2^1, 2^2, 2^3 x=20,21,22,23, U=0, 所以M=0.
M的多项式形式是 3 x 7 + 4 x 6 + 1 x 5 + 7 x 4 + 3 x 3 + 5 x 2 + 4 x 1 + 7 x 0 3x^7+4x^6+1x^5+7x^4+3x^3+5x^2+4x^1+7x^0 3x7+4x6+1x5+7x4+3x3+5x2+4x1+7x0
带入4个x解, 可得4个值(加减法同样使用伽罗华域规则):
3 + 4 + 1 + 7 + 3 + 2 + 5 + 5 = 0 3+4+1+7+3+2+5+5=0 3+4+1+7+3+2+5+5=0
3 ∗ 2 1 + 4 ∗ 2 1 + 1 ∗ 2 1 + 7 ∗ 2 1 + 3 ∗ 2 1 + 2 ∗ 2 1 + 5 ∗ 2 1 + 5 ∗ 2 1 = 0 3*2^1+4*2^1+1*2^1+7*2^1+3*2^1+2*2^1+5*2^1+5*2^1=0 321+421+121+721+321+221+521+521=0
. . . . = 0 .... =0 ....=0
. . . . = 0 .... =0 ....=0
如果数据正确, 四个值都是0.
否则就是有错误.

假如M误变成了 M ′ = 36573547 M'=36573547 M=36573547, 它在 x 6 x^6 x6 x 5 x^5 x5分别多了2和4.
上述四个公式的结果由于M的错误会变成非零值, 多出的值会显现在非零结果上, 也就是多的值异或运算就是非零值.
设两个出错的位置在 e 1 e_1 e1 e 2 e_2 e2, 分别多了 s 1 s_1 s1 s 2 s_2 s2.
以第一个公式为例:
3 + 6 + 5 + 7 + 3 + 5 + 4 + 7 = 2 = s 1 ∗ ( 2 0 ) e 1 + s 2 ∗ ( 2 0 ) e 2 3+6+5+7+3+5+4+7=2=s_1*(2^0)^{e_1}+s_2*(2^0)^{e_2} 3+6+5+7+3+5+4+7=2=s1(20)e1+s2(20)e2
其余省略…
如此会得到四个四元一次方程, 很容易得到结果.

至于为什么只能纠错两位, 需要了解汉明码相关知识.

你可能感兴趣的:(伽罗华域, 二维码和CRC)