你也可以手绘二维码(二)纠错码字算法:数论基础及伽罗瓦域GF(2^8)
摘要:本文讲解二维码纠错码字生成使用到的数学数论基础知识,伽罗瓦域(Galois Field)GF(2^8),这是手绘二维码填格子理论基础,不想深究可以直接跳过。同时数论基础也是 Hash 算法,RSA 算法等密码学的入门基础。
二维码生成算法最为核心的就是编码规则和纠错码字的生成。本篇专门讲解纠错涉及到的伽罗瓦域(Galois Field)。本文内容大部分是阅读《密码编码学与网络安全》后参考相关 PPT 编写,如有遗漏或不严谨地方请参考专业书籍。
数论基础
整除,因数,素数
设 a , b(b≠0) 是两个整数,如果存在另外一个整数 c 使得 a=b·c , 则称 b 整除 a, 记为 b|a, 且称 b 为 a 的因子。如果 p (p>1) 的因子只有 ±1,±p,称整数 p 是素数。
模
如果 a 和 n(n≠0) 是两个整数,则定义 a mod n 是 a 除以 n 所得的余数。正整数 n 称为模数。因此对于任意整数 a 可以写出:
a = qn + r (0<=r<n);q= ⌊a/n⌋
a = ⌊a/n⌋ * n + ( a mod n)
例子: a = 49,n = 8, 则 q = 49 mod 8 = floor(49/8) = 6 , r = 49 mod 8 = 1
,49 = 6 * 8 + 1 .
最大公因数
最大公因数,也称最大公约数、最大公因子,指两个或多个整数共有因子中最大的一个。记为 gcd(a,b)。如果 gcd(a,b) = 1 , 则说 a,b 互素,记为 a⊥b。
Euclid 定理:对任意非负整数 a 和正整数 b,有 gcd(a, b)=gcd(b, a-b)=gcd(b, a mod b)=gcd(a, b mod a), 这也是常见的辗转相除法的理论基础。
示例:
gcd(18,12)
= gcd(12,18-12) = gcd(12,6) = gcd(6,0) = 6
= gcd(12,18 mod 12) = gcd(12,6) = gcd(6,0) = 6
同余
如果 (a mod n)=(b mod n),则称两整数 a 和 b 模 n 同余,记为 a ≡ b mod n。模 n 的剩余类集合定义比 n 小的非负整数集合 Z(n)={0,1,2...,(n-1)},更准确来说集合中每一个整数都代表一个剩余类。我们将模 n 的剩余类表示为 [0],[1],...[n-1], 其中 [r] = {a:a 是一个整数,a ≡ n mod r}.
mod 在此处的含义表示 a 和 b 对于给定的模数有等价关系,和说(a- b)是 n 的整数倍一样。
例子:49 mod 8 = 17 mod 8 = 1 , 则 49 ≡ 17 mod 8, 等价于 8 | (49 - 17 ) = 8 | 32 显然是成立的。
模运算
模运算的结果都限制在模的剩余类里面,运算封闭这是非常重要的一个性质。
- 交换律
- (w+x) mod n=(x+w) mod n
- (w×x) mod n=(x×w) mod n
- 结合律
- [(w+x)+y] mod n=[w+(x+y)] mod n
- [(w×x)×y] mod n=[w×(x×y)] mod n
- 分配律
- [w×(x+y)] mod n=[w×x+w×y] mod n
- 单位元
- (0+w) mod n=w mod n
- (1×w) mod n=w mod n
- 加法逆元
- 对 w∈Zn 存在 z∈Zn,使得 w+z≡0 mod n,记 z=-w。
- 加法可约律
- 如果 (a+b) ≡ (a+c) mod n,则 b≡c mod n
- 乘法可约律
- 如果 (a×b) ≡ (a×c) mod n 且 a 有乘法逆元,那么对 (a×b) ≡ (a×c) mod n 两边同乘以 -a,即得 b ≡ c mod n
下面的示例是计算 Z(4)={0,1,2,3}的模加法和模乘法
加法模运算
(a mod 4) + (b mod 4) = (a+b) mod 4
+|0 | 1 | 2 | 3
---|---|---|---|---
0|0 | 1 | 2 | 3
1|1 | 2 | 3 | 0
2|2 | 3 | 0 | 1
3|3 | 0 | 1 | 2
加法:对每一 x,都有一 y,使得 x+y ≡ 0 mod 4。如对 3,有 1,使得 3+1 ≡ 0 mod 4,称 y 为 x 的负数,也称为加法逆元。
乘法模运算
(a mod 4) * (b mod 4) = (a*b) mod 4
| * | 0 | 1 | 2 | 3 |
|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 |
| 1 | 0 | 1 | 2 | 3 |
| 2 | 0 | 2 | 0 | 2 |
| 3 | 0 | 3 | 2 | 1 |
乘法:对 x,若有 y,使得 x*y ≡ 1 mod 4,如 3×3 ≡ 1 mod 4,则称 y 为 x 的倒数,也称为乘法逆元。
并非每一 x 都有乘法逆元。
定理:设 a∈Zn,gcd(a, n) = 1,则 a 在 Zn 中有乘法逆元。
上表中只有 a = 1,a = 3 满足 gcd(a,4) = 1, 从高亮结果可以看到定理的正确性。严格证明略。
扩展的欧几里德算法
对于给定的整数 a 和 b ,扩展的欧几里德算法不仅能计算出最大公约数 gcd(a,b),还可以算出另外两个整数 x 和 y 满足方程 a*x + by = d = gcd(a,b)。对于给定的 (a,b) 如何计算 (x,y,d), 过程如下:(截图《自密码编码学与网络安全 原理与实践 第 6 版》 , 斯托林斯著)

算法流程图如下:默认 a > b,否则根据性质可以调整过来

最常用的方法就是使用一个表格计算:
gcd(1759,550)= gcd(550,1759 mod 550) =gcd(550,109) = gcd(109,5) = 1
| Q(整数部分) | X1 | X2 | X3 | Y1 | Y2 | Y3 |
|---|---|---|---|---|---|---|
| --- | 1 | 0 | 1759 | 0 | 1 | 550 |
| 1759/550=3 | 0 | 1 | 550 | 1-3*0=1 | 0-3*1=-3 | 109 |
| 550/109=5 | 1 | -3 | 109 | 0-5*1=-5 | 1-5*(-3)=16 | 5 |
| 109/5=21 | -5 | 16 | 5 | 1-21*(-5)=106 | -3-21*16=-339 | 4 |
| 5/4=1 | 106 | -339 | 4 | -5-1*106= -111 | 16-1*(-339)=355 | 1 |
直到 Y3 = 1 , 此时 有 d = Y3 = 1,x = Y1 = -111,y = Y2 = 355. 验算如下: 1759 * (-111) + 550 * (355) = -195249 + 195250 = 1 .
域,群,环
具体就不展开了,感兴趣可以参考相关专业书籍,截图一张说明他们满足公理的关系

伽罗瓦域定义
在数学中,有限域(英语:Finite field)或伽罗瓦域(英语:Galois field,为纪念埃瓦里斯特·伽罗瓦命名)是包含有限个元素的域。与其他域一样,有限域是进行加减乘除运算都有定义并且满足特定规则的集合。有限域最常见的例子是当 p 为素数时,整数对 p 取模。有限域的元素个数称为它的序。
每个有限域的阶必为素数的幂,即有限域的阶可表示为 pⁿ(p 是素数,n 是正整数),记为 GF(pⁿ)。当 n = 1,GF(p) 就是 mod p,因为一个数 模 p 后,结果在 [0, p-1] 之间,有限域包含 p 个元素。
下期将会讨论具体的 GF(pⁿ) 编码实现过程,敬请期待!
感兴趣交流可以留言,共同探讨学习,限于作者水平有限,理解不到位,有错误的地方望不吝赐教,感谢!
你也可以关注公众号:ProgramLife042,公众号名称:风之程序人生。查看更多最新内容。
你也可以手绘二维码(二)纠错码字算法:数论基础及伽罗瓦域GF(2^8)的更多相关文章
- PHP批量生成底部带编号二维码(二维码生成+文字生成图片+图片拼接合并)
PHP批量生成带底部编号二维码(二维码生成+文字生成图片+图片拼接合并) 需求: 输入编号如 : cb05-0000001 至 cb05-0000500 批量生成 以编号为名称的下图二维码,然后压缩 ...
- Swift开发小技巧--扫描二维码,二维码的描边与锁定,设置扫描范围,二维码的生成(高清,无码,你懂得!)
二维码的扫描,二维码的锁定与描边,二维码的扫描范围,二维码的生成(高清,无码,你懂得!),识别相册中的二维码 扫描二维码用到的三个重要对象的关系,如图: 1.懒加载各种类 // MARK: - 懒加载 ...
- thinkphp5框架生成二维码(二)
上篇已经讲过了SDK之类的,这个不再重复,有不知道的童鞋们,请去看上篇文章吧. 这里我用的方法比较老旧,大家有更好的方法,可以进行改良,还有linux服务器,记得给文件权限,否则生成的文件会失败的.大 ...
- 把链接生成二维码 二维码中间带有logo
在工程中引入三个文件jquery.qrcode.js.qrcode.js.utf.js.其中utf.js文件是防止链接中的参数出现中文乱码现象 jquery.qrcode.js文件 function ...
- ios-深度解析二维码的生成与使用
利用一个小demo来对二维码进行学习,总共四个界面(主界面,生成二维码界面,识别二维码界面,扫描二维码界面) 一.二维码的介绍 1.什么是二维码? 二维条码/二维码是用某种特定的 ...
- (转)ZXing解析二维码
1 ZXing解析二维码 上一篇文件已经说过如何用ZXing进行生成二维码和带图片的二维码,下面说下如何解析二维码 二维码的解析和生成类似,也可以参考google的一个操作类 BufferedImag ...
- (转)ZXing生成二维码和带logo的二维码,模仿微信生成二维码效果
场景:移动支付需要对二维码的生成与部署有所了解,掌握目前主流的二维码生成技术. 1 ZXing 生成二维码 首先说下,QRCode是日本人开发的,ZXing是google开发,barcode4j也是老 ...
- 链接生成二维码-PHP
原文:http://www.upwqy.com/details/20.html 链接生成二维码 首先下载phpqrcode phpqrcode.zip 我这里使用的是TP5,把下载好的类库 放入到ex ...
- Android高级控件(三)—— 使用Google ZXing实现二维码的扫描和生成相关功能体系
Android高级控件(三)-- 使用Google ZXing实现二维码的扫描和生成相关功能体系 摘要 现在的二维码可谓是烂大街了,到处都是二维码,什么都是二维码,扫一扫似乎已经流行到习以为常了,今天 ...
随机推荐
- [BJOI2019] 排兵布阵
题目 这个\(dp\)出在普及都算水题吧 直接背包,\(O(nms)\)跑不满,非常稳 #include<cstdio> #include<vector> #include&l ...
- 洛谷 P1073 最优贸易
题目描述 CC C 国有 n n n 个大城市和 m mm 条道路,每条道路连接这 nnn 个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这 mmm 条道路中有一部分为单向通行的道路 ...
- [国家集训队]小Z的袜子
嘟嘟嘟 一眼就知道是莫队. 还不带修改,美滋滋. 按莫队的方法排序,然后用小学数学算一下概率,分子分母单独维护. #include<cstdio> #include<iostream ...
- 鴻雁 Anser cygnoides
鴻雁 Anser cygnoides,其中 Anser 是屬名.雁屬的模式種是 Anser anser 灰雁,在中國也有分佈,但不如鴻雁和中國人關係密切.中國人所說的「大雁」一般指鴻雁,偶爾指灰雁或是 ...
- jquery mobile mobiscroll 日期插件使 用mobiscroll
官网网站: http://www.mobiscroll.com/ http://code.google.com/p/mobiscroll/ 1.精简版Demo: 查看Demo » 下载Demo » 2 ...
- PAT乙级1020
1020 月饼 (25 分) 月饼是中国人在中秋佳节时吃的一种传统食品,不同地区有许多不同风味的月饼.现给定所有种类月饼的库存量.总售价.以及市场的最大需求量,请你计算可以获得的最大收益是多少. ...
- Mysql数据库 day1
Mysql数据库属于关系型数据库(mysql.oracle.sql server),非关系型数据库有DB2.Redis MySQL执行原理,逻辑分层.更改数据库处理引擎 作者:Stanley 罗昊 [ ...
- dataTable配置项说明
Datatables是一款jquery表格插件.它是一个高度灵活的工具,可以将任何HTML表格添加高级的交互功能. 官网地址:https://datatables.net/ 中文说明地址:http:/ ...
- redis 基本数据类型-字符串(String)
不瘦原来对redis也是有个大概的了解(就你知道的多), 但是最近和大神聊天的过程中才明白自己知道的简直就是鸡毛蒜皮(让你得瑟),所以不瘦打算从头在捋一遍,顺便把过程也记录下来,如果能给大家在学习re ...
- Verilog 位拼接运算符的优先级
最近研究FIFO的时候,在开源工程中看到这样一段代码 ; always @(posedge rd_clk) {'b0}}; else {'b0}}; else if(re) rp_bin <= ...