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


在数学上, 我们已经习惯了在无线域上随意地加减乘除而不考虑边界.
假如世界不是由无限构成, 而只有3位比特, 0-7这8个数字组成, 又如何保持计算规律的自洽呢?
我们可以仿照表盘的设计, 超出域的部分取余.以加法为例,假如计算5+5,得到10,而10超出了设定的0-7域,故计算10/8=2,让数字回到域内. 但除法却无法计算, 例如5/2=2.5,5和2都是域内数字,而2.5却不伦不类。想要域内计算封闭,就只有改变既有的计算规则了。

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

伽罗华域(有限域)

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

伽罗华域中,计算规则被这样修改:

  1. 加减法被删除, 取而代之的是异或⨁\bigoplus⨁运算.
  2. 乘除法被模二乘除法代替.
  3. 超出有限域的数字(M), 需要被本原多项式P取余. 符号表示为M mod P.
    这三条可保证伽罗华域内的计算结果永远落在域内。

本原多项式

简单来说,本原多项式是可以帮助域外数字回到域内的多项式. 具体操作是与它取余, 即M mod P.
本原多项式是计算得出的, GF(2^3)的其中一个本原表达式是x3+x+1x^3+x+1x3+x+1, 即1011.
一个GF的本原多项式可以有很多, 这里涉及近世代数和数论知识,故按下不表。
总之, 有了本原多项式的帮助, 域内的计算结果就会永远落在域内这几个数字上.

综上,我列举一些例子以直观感受伽罗瓦域的运算规则。
仍以GF(2^3)举例:
加减法→异或运算:十进制5+5=5+5=5+5=二进制101⨁101=000=0101\bigoplus101=000=0101⨁101=000=0
乘法→模二乘法:M=5∗5=101∗101=11001=25,M=5*5=101*101=11001=25,M=5∗5=101∗101=11001=25,超出范围,利用规则3。取本原多项式P=x3+x+1P=x^3+x+1P=x3+x+1,即二进制的101110111011,计算MmodP=11001mod1011=11余100=3余4M mod P=11001 mod 1011=11余100=3余4MmodP=11001mod1011=11余100=3余4,故5*5=4。注意,这里的mod取余数是模二除法的取余,千万不要用四则运算的算法。
除法→模二除法:例子略,乘法里已经给出了一个取余的例子,不取余取模二除法的结果就对了。

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的办法.

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

为了简便计算,我们不用16比特,而是由GF(2^3)3比特表示.
000 代表字符 0
001 代表字符 1

111 代表字符 7
GF(2^3)的本原多项式P仍取1011.

如果我想在二维码中保存4个符号: 3417, 并用另外4个符号保存纠错码,那么:

  1. 令固定数U=(x−20)(x−21)(x−22)(x−23)U=(x-2^0)(x-2^1)(x-2^2)(x-2^3)U=(x−20)(x−21)(x−22)(x−23), 将其用四则运算展开得到一个多项式,其中x的系数要用GF(2^3)的规则限制,例如常数项为M=1×2×4×8M=1×2×4×8M=1×2×4×8,然后计算MmodP=5M mod P=5MmodP=5.如此这般,U展开后的结果为x4+4x3+7x2+7x+5x^4+4x^3+7x^2+7x+5x4+4x3+7x2+7x+5,即14775.
  2. 3417后面以4个0填充, 并做34170000 mod U, 注意所有的四则运算规则都背题换成GF(2^3)的规则. 这个计算非常复杂, 如果掌握了查表法会特别简单. 我举例34170mod14775这一步,可知为了对齐首位3和1,需要上3,再次强调模二乘法3×14775=372243×14775=372243×14775=37224,3与14775中每一个数字做伽罗瓦域模二乘法。接下来34170-37224,减法替换为异或⨁\bigoplus⨁,得03354。
    一定要记住,所有的四则运算替换为伽罗华域规则。
  3. 计算完毕后,余数是一个4位数字3255。可见每一位数字都在GF(2^3)中.
  4. 将余数接在3417末尾, 组成34173255, 这个数字就是最后的传输码, 它与U的余数为0.
    这里就很像CRC了, 除了我们为多项式系数的运算引入了伽罗华域. 其他与CRC一模一样.
    (实际上CRC相当于引入的是GF(2^1))

神奇的是这套纠错码可以在数据出错时自我修复.
我们符号化前面的数字, 另34173547=M, 求余的商=h.
根据前面的计算, 可知M=h∗UM = h * UM=h∗U.
又根据U的形式, 可知如果x=20,21,22,23x=2^0, 2^1, 2^2, 2^3x=20,21,22,23, U=0, 所以M=0.
M的多项式形式是3x7+4x6+1x5+7x4+3x3+5x2+4x1+7x03x^7+4x^6+1x^5+7x^4+3x^3+5x^2+4x^1+7x^03x7+4x6+1x5+7x4+3x3+5x2+4x1+7x0
带入4个x解, 可得4个值(加减法同样使用伽罗华域规则):
3+4+1+7+3+2+5+5=03+4+1+7+3+2+5+5=03+4+1+7+3+2+5+5=0
3∗21+4∗21+1∗21+7∗21+3∗21+2∗21+5∗21+5∗21=03*2^1+4*2^1+1*2^1+7*2^1+3*2^1+2*2^1+5*2^1+5*2^1=03∗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′=36573547M'=36573547M′=36573547, 它在x6x^6x6和x5x^5x5分别多了2和4.
上述四个公式的结果由于M的错误会变成非零值, 多出的值会显现在非零结果上, 也就是多的值异或运算就是非零值.
设两个出错的位置在e1e_1e1​和e2e_2e2​, 分别多了s1s_1s1​和s2s_2s2​.
以第一个公式为例:
3+6+5+7+3+5+4+7=2=s1∗(20)e1+s2∗(20)e23+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相关推荐

  1. 哈罗单车二维码被破坏怎么骑?

    共享单车的理念是共享,但总有素质低下的人想独占.我们经常会遇到如图一二的情况,一般看到这种,我们可能就转身走了.但如果想一想,为什么那些搞破坏的人能骑呢?肯定是有方法的! 其实很简单: 1.打开&qu ...

  2. 国税总局发票助手二维码生成的CRC计算

    最近为了在我们的应用里生成发票信息的二维码,根据国税总局的二维码文档(见文后),唯一麻烦的地方就是需要计算一个CRC16的值.中间主要碰到了两个问题,一是文档中没有描述中文编码方式,经过试验,我们发现 ...

  3. 二维码解码程序的两大难点问题

    二维码解码程序的两大难点问题 第一是如何对摄像头捕捉的PNG格式的图像数据进行解析,以及识别黑白模块的问题 第二是RS编码的纠错算法过程. 对PNG格式的解析,需要参考PNG格式的规范.识别黑白块要参 ...

  4. 基于Excel的QR二维码生成工具——原理及算法详解(之一)

    老虎二维码(下载链接在这里)是一个基于Excel的二维码生成工具,完全使用Excel表单公式结合VBA实现,没有调用任何外部库,实现了支持中文英文混合字符以及常用微信二维码编码的自动生成,在工作表单元 ...

  5. 2021SC@SDUSC-Zxing(十二):二维码的解析(Decode)及纠错有关算法介绍

    2021SC@SDUSC 文章目录 一.Decode目录分析 二.解析流程 三.图解解码过程 四.有关算法介绍 一.伽罗华域(Galois Field)上的四则运算 数学知识 伽罗瓦域 二.Reed- ...

  6. 移动互联网的入口-二维码(二维码生成原理及流程)

    目录 1 引入 2 历史 2.1 一维码 2.2 二维码 3 分类 3.1 线性堆叠式二维码 3.2 矩阵式二维码 3.3 邮政码 4 QR code二维码结构 5 QR code二维码生成流程及原理 ...

  7. 伽罗华域下的伪随机序列图像编码(一)

    最近看了一篇TPAMI文章Determining Both Surface Position and Orientation in Structured-Light-Based Sensing ,是用 ...

  8. 二维码里德所罗门算法

    这是一个相当古老的项目了. 前序 之前一直想写一个有关二维码生成器的教程,由于各种各样的原因,当然主要原因是懒,一直没有下手.最近感觉还是要做点什么,不然有种要烂尾的冲动. 我之所以要写这个教程,主要 ...

  9. 你也可以手绘二维码(二)纠错码字算法:数论基础及伽罗瓦域GF(2^8)

    摘要:本文讲解二维码纠错码字生成使用到的数学数论基础知识,伽罗瓦域(Galois Field)GF(2^8),这是手绘二维码填格子理论基础,不想深究可以直接跳过.同时数论基础也是 Hash 算法,RS ...

  10. 用户扫描二维码进入公众号后自动发送指定消息_公众号裂变,社群裂变,个人号裂变,运营操作指南...

    1. 公众号裂变(主要针对服务号,订阅号裂变后面讲) 原理:用户扫码关注公众号,公众号里自动弹出让用户转发的海报话术和为每个用户生成专属独立的裂变海报,用户只有转发海报让其他人扫码关注公众号,达到一定 ...

最新文章

  1. 如何设计一个复杂的业务系统?从对领域设计、云原生、微服务、中台的理解开始...
  2. Linux内核模块编程系列1-极简内核模块编写
  3. Tableau10.0学习随记-分组问题
  4. 关于apache和tomcat集群,线程是否占用实验
  5. win2008 php mysql zend phpmyadmin_Windows2008 最新版Apache2.PHP5.MySQL6.PHPMyadmin.ZendOptimizer安装图解...
  6. 自由动力论坛一枝花,全靠汇道童鞋来当家
  7. [VBS]转换二进制数据为字符串常用办法
  8. UltraISO制作linux启动盘(包含写入不完整解决方法)
  9. Android 获得view的宽和高
  10. bzoj 2865 字符串识别——后缀数组
  11. Springboot的工作机制:2 @SpringBootApplication背后的秘密
  12. C语言bit位取反,c语言位操作bit位置0置1
  13. HDFS的命令行操作
  14. DOS+DNS放大攻击工具编写
  15. 串口通信简介——发展历史与基本概念
  16. 目前人工智能技术,主要有应用于哪些领域?
  17. 数显之家快讯:【SHIO世硕心语】2021,新的一年写给自己的5句话!
  18. 在windows中使用bat脚本获取linux服务器文件
  19. 8月英语——知耻而后勇
  20. java 独木桥_独木桥 - pandaB - 博客园

热门文章

  1. win10系统重装步骤详解
  2. 【第二周】吴恩达团队AI for Medical Diagnosis课程笔记
  3. 技术分享| RTC通讯中常用的音频格式
  4. java 拍照后加上日期水印_有什么软件能批量给照片添加拍照日期的水印?
  5. VIVO打击刷量,我们如何应对?
  6. Azure:云平台概述
  7. 笔记本键盘进水失灵,禁用方法
  8. EAM 资产管理系统选型思路
  9. HTML制作简单课程表
  10. C语言书籍阅读-读书笔记--《C专家编程》