前言
一个表盘只有0-59的数字.
超出59的数字会被60取余, 即61/60=1.
在数学上, 我们已经习惯了在无线域上随意地加减乘除而不考虑边界.
假如世界不是由无限构成, 而只有3位比特, 0-7这8个数字组成, 又如何保持计算规律的自洽呢?
我们可以仿照表盘的设计, 超出域的部分取余,让数字回到域内. 但除法却无法计算, 因为有限域的8个数字里没有小数.
伽罗华域拟出了一个全新的有限域规则, 在那个域中, 加减乘除规则被修改, 但却让计算结果永远落在有限域中.
伽罗华域因为是有限域, 所以要说明它的边界在哪里.
我们用GF(n^w)来符号化.
其中, GF代表伽罗华域, n代表进制数, w代表位数.
我们以GF(2^3)为例. 它的边界是000~111.
伽罗华域中
本原多项式是帮助域外数字坍缩到域内的多项式. 具体操作是与它取余, 即M mod P.
本原多项式是计算得出的, GF(2^3)的本原表达式是 x 3 + x + 1 x^3+x+1 x3+x+1, 即1011.
一个GF的本原多项式可以有很多, 毕竟域内的计算规则都改变了. 如何得到有限域的本原多项式在这里不解释.
总之, 有了本原多项式, 域内的计算结果就会永远落在域内这几个数字上.
总之, 记住有限域的计算规则, 不要惯性思维地还按照常规的加减乘除计算.
我将一串二进制数字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个符号保存纠错码:
神奇的是这套纠错码可以在数据出错时自我修复.
我们符号化前面的数字, 另34173547=M, 求余的商=h.
根据前面的计算, 可知 M = h ∗ U M = h * U M=h∗U.
又根据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 3∗21+4∗21+1∗21+7∗21+3∗21+2∗21+5∗21+5∗21=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
其余省略…
如此会得到四个四元一次方程, 很容易得到结果.
至于为什么只能纠错两位, 需要了解汉明码相关知识.