Part 1 数论和密码学#
如果 a 和 b 是整数 且 a ≠ 0, 那么如果存在一个整数 c, 使得 b = ac, 则称 a 整除 b, 记为 a ∣ b
- 当 a 整除 b 时,我们称 a 是 b 的 因数 或 除数,并且称 b 是 a 的 倍数
- 如果 a ∣ b,那么 ab 是一个整数
- 如果 a 不整除 b,我们记作 a ∤ b
判断 3∣7 和 3∣12 是否成立.
例题解答#
- 3∤7 因为 37 不是整数
- 3∣12 因为 312 是整数
- 线性组合性 如果 a∣b 且 a∣c,那么 a∣(b+c).
- 如果 a∣b ,那么对于所有的整数 c,a∣bc.
- 传递性 如果 a∣b 并且 b∣c ,那么 a∣c.
- 大小关系 如果 a∣b ,b=0 ,那么 ∣a∣≤∣b∣.
若 a,b,c 是整数,且 a=0 ,且 a∣b 和 a∣c ,则对任意整数 m 和 n ,a∣(mb+nc) .
证明:如果 c∣(a−b),c∣(a′−b′) ,那么 c∣(aa′−bb′)
除法算法#
当一个整数被一个正整数除时,会得到一个商和一个余数.这通常被称为“除法算法”(Division Algorithm),但实际上它是一个定理.
如果 a 是一个整数,b 是一个正整数,那么存在唯一的整数 q 和 r,使得 0≤r<b,并且 a=bq+r.
对于得数,我们有这样的定义:
{qr=a div b=a mod b
由于相关的定理证明太过于复杂以及难懂,这里略过了.
同余关系#
如果 a 和 b 是整数,且 m 是正整数,那么当 m 整除 a-b 时,称 a 与 b 在模 m 下同余.
a≡b(modm)
判断 17 是否在模 6 意义下与 5 同余,24 和 14 是否在模 6 意义下同余.
太简单了,略去
设 m 为正整数.当且仅当存在一个整数 k 使得 a=b+km ,整数 a 和 b 在模 m 下同余
自反性 任何正整数都和它自身同余 a≡a(modm)
对称性 a≡b(modm)⇒b≡a(modm)
传递性 a≡b(modm),b≡c(modm)⇒a≡c(modm)
同余式的加和乘#
设 m 为正整数.如果 a≡b(modm) 且 c≡d(modm) 则 a+c≡b+d(modm) ,ac≡bd(modm) 且 ak≡bk(modm).其中 k 是非负整数.
这条定理主要强调了同余关系的加法和乘法具有可叠加性.从这个角度想的话这个定理就很自然,所以证明就先略过了.
同余式的代数运算#
计算 mod m 函数的和与积#
定理 设 m 为正整数,a 和 b 为整数.那么
{(a+b)(modm)abmodm=((amodm)+(bmodm))modm=((amodm)(bmodm))modm
如此便可以将一个数字拆分成它的因数和一部分进行模运算再相加或相乘
二进制模幂算法#
这个算法实际上是借助了上面这个定理进行的.因为任意数的二进制展开是存在且唯一的,所以利用快速幂以及模运算的乘法可拆性就可以将幂次的二进制展开每一位对应的模幂计算出来相乘再取模.
举个例子更加直观一点
2644mod645
首先,将幂次进行二进制展开
(644)10=(1010000100)2
之后对每一个二进制位对应的数字进行计算
这里的power初始值为 2,这么写是为了最后每一行的 a 为 1 时乘以上一行对应的 power 方便
| i | ai | power | x |
|---|
| 0 | 0 | 4 | 1 |
| 1 | 0 | 16 | 1 |
| 2 | 1 | 256 | 16 |
| 3 | 0 | 391 | 16 |
| 4 | 0 | 16 | 16 |
| 5 | 0 | 256 | 16 |
| 6 | 0 | 391 | 16 |
| 7 | 1 | 16 | 451 |
| 8 | 0 | 256 | 451 |
| 9 | 1 | 391 | 1 |
递推关系类似:
if(a[i]) {
x[i] = x[i-1] * power[i-1];
}
else x[i] = x[i-1];
power[i] = pow(power[i-1],2);
c
最后的结果就是表格右下角的 x 的值
模 m 算术运算#
给定 Zm 是一个包含从 0 到 m-1 的非负整数的集合,即 {0,1,...,m−1}
计算 7+119 和 7∗119
利用定义可简单计算.略
-
封闭性 如果 a 和 b 属于 Zm ,那么 a+mb 和 a∗mb 属于 Zm
-
结合律 如果 a, b 和 c 属于 Zm
-
交换律 如果 a 和 b 属于 Zm ,那么 a+mb=b+ma 以及 a∗mb=b∗ma
-
单位元 0 和 1 分别是模加法和模乘法的单位元
- 如果 a 属于 Zm ,那么 a+m0=a 以及 a∗m1=a
-
加法逆元 如果 a=0 属于 Zm ,那么 m - a 是 a 的 模 m 加法逆元.0 是它自身的模 m 加法逆元.
- a+m(m−a)=0 & 0+m0=0
-
分配律 如果 a, b 和 c 属于 Zm 那么
- a∗m(b+mc)=(a∗mb)+m(a∗mc) 以及 (a+mb)∗mc=(a∗mc)+m(b∗mc)
乘法逆元在模 m 的运算中并不总是存在 例如,2 在模 6 的情况下没有乘法逆元,因为没有整数 x 使得 2∗x≡1(mod6)
质数与最大公约数#
设 p 是大于 1 的正整数,如果 p 的正因子只有 1 和 p ,那么称 p 是质数.否则,称 p 是和数.
整数 7 是质数,因为他的正因数只有 1 和 7;但 9 是合数,因为它可以被 3 整除
算术基本定理#
每一个大于 1 的正整数都可以唯一的表示为一个素数,或者表示为两个或更多素数的和层级,其中素因数以非递减序排列.
- 641=641
- 100=2∗2∗5∗5=22∗52
- 999=3∗3∗3∗37=33∗37
- 1024=2∗2∗2∗2∗2∗2∗2∗2∗2∗2=210
试除法#
如果 a 是合数,则 a 必有小于等于 a 的素因子
a=b∗c,其中 1<b<a,1<c<a .显然,b 和 c 中必有一个小于等于 a .否则, b∗c>a,矛盾.
判断 157 和 161 是否是素数.
157,161 都小于 13, 小于 13 的素数有 2 3 4 5 11
分别相除查看是不是整除即可,答案略
剩余例子略,比较简单带过了.
埃拉托斯特尼筛法 The Sieve of Erastosthenes#
每一个大于 1 的正整数都可以唯一地表示为一个素数,或者表示为两个或更多素数的成绩,其中素因数以非递减序排列.
另一种更加形式语言的表述#
设 a>1,则 a=p1r1p2r2p3r3...pkrk,其中 pi 是互不相通的素数, ri 是正整数,而且在不及顺序的情况下,该表示是唯一的.
这个表达式称作 整数 a 的素因子分解
7007=72∗11∗13
设 a=p1r1p2r2p3r3...pkrk,其中 pi 是互不相通的素数,ri 是正整数,则正整数 d 为 a 的因子的充份必要条件是 d=p1s1p2s2...pksk,其中 0≤si≤ri,i=1,2,...,k
例子 1#
21560 有多少个正因子?
解答 1#
21560=23∗5∗72∗11,因此 21560 的正因子的个数为 4∗2∗3∗2=48.
例子 2#
10! 的二进制表示中从最低为暑期有多少个连续的 0?
解答 2#
10!=28∗34∗52∗7
故 10! 的二进制表示中从最低位数起有 8 个连续的 0
无穷素数#
存在无限多个素数.
假设素数的数量是有限的: pi,i=1,2,...,n
令 q=p1p2...pn+1.
对于 q (或者说任意一个数),它是素数或者能用算数基本定理表示.
但是没有任何一个 p 能够整除 q,而 q 又不是素数,矛盾
因此素数有无限个.
素数的函数表示#
梅森素数 定义#
形如 2p−1,其中 p 是素数,被称为梅森素数
部分非梅森素数 特点#
当 p 是合数时,2p−1 一定是合数
相关证明可以将 p 拆开然后进行一个非常常见的因式分解,因为比较简单所以这里先略过了.
素数定理#
不超过 x 的素数个数与 lnxx 的比率随着 x 的增大而趋近于 1.
由该定理得知,随机选择一个小于 n 的正整数是素数的概率大约是 nlnnn=lnn1
生成素数#
一般地说,没有一个具有整数稀疏的多项式 f(n) 使得其对所有正整数 n 都为素数.
关于素数的猜想#
哥德巴赫猜想,孪生素数猜想等
最大公约数 GCD#
定义 1#
-
设 a 和 b 为整数,且不全为零.嫩狗同时整除 a 和 b 的最大整数 d 称为 a 和 b 的最大公约数,记作 gcd(a,b)
-
如果两个整数 a 和 b 的最大公约数为 1,则称 a 和 b 是互素的
-
整数 ai,i=1,2,...,n 是两两互素的,如果当 1≤i<j≤n 时有 gcd(ai,aj)=1
-
gcd(24,36) = 12
-
17 与 22 互素
用素因子分解式找最大公约数#
假设 a 和 b 的素因数分解式
{ab=p1a1p2a2...pnan=p1b1p2b2...pnbn
其中每个质数都是非负整数,且两个素因数分解式中出现的所有素数都包含在两者中,那么:
gcd(a,b)=p1min(a1,b1)p2min(a2,b2)...pnmin(an,bn)
这个公式右边的整数可以同时整除 a 和 b,并且没有比它更大的整数能够同时整除 a 和 b.但是这个算法并不高效
最小公倍数 LCM#
正整数 a 和 b 的最小公倍数是同时被 a 和 b 整除的最小正整数,记作 lcm(a,b)
最小公倍数也可以通过素因数分解来计算
lcm(a,b)=p1max(a1,b1)p2max(a2,b2)...pnmax(an,bn)
这个数字可以被 a 和 b 同时整除,并且没有更小的数字可以同时被 a 和 b 整除
a, b 为正整数,那么 ab = gcd(a,b) * lcm(a,b)
欧几里得算法 Euclidean Algorithm#
算法过程#
procedure gcd(a,b: positive integers)
x:=a y:=b
while y != 0
r:= x mod y
x:= y
y:= r
return x{gcd(a,b) is x}
txt
假设 a 和 b 是正整数 且 a ≥ b. 设 r0=a,r1=b.通过连续应用除法算法啊,我们得到如下结果:
|
r0r1rn−2rn−1=r1q1+r2,=r2q2+r3,⋮=rn−1qn−1+rn,=rnqn.0≤r2<r1,0≤r3<r2,0≤rn<rn−1,
|
$$
\begin{aligned}
2415 &= 945 \cdot 2 + 525 \\
945 &= 525 \cdot 1 + 420 \\
525 &= 420 \cdot 1 + 105 \\
420 &= 105 \cdot 4 + 0.
\end{aligned}
$$
|
最终,余数为零会出现在序列中: a=r0>r1>r2>...≥0.这个序列中最多不能包含超过 a 项
根据引理 1 可证.
最大公约数表示成一个线性组合#
如果 a 和 b 是任意整数,且不全为 0,那么 gcd(a,b) 是集合 {ax+by:x,y∈Z} 中的最小正整数元素.
设 s 是 a 和 b 的最小线性组合.
设 q 是 a 除以 s 的商.那么 amods=a−qs=−q(ax+by)=a(1−qx)+b(−qy)
因此,a mod s 是 a 和 b 的线性组合.
由于 s 是所有线性组合中的最小整数,并且 a ≤ a mod s < s,
a mod s 不能是正数,因此 a mod s = 0.
这意味着 s 是 a 的因子,同样 s 也是 b 的因子.因此 s 是 a 和 b 的公约数,gcd(a,b) ≥ s.
由于 gcd(a,b) 同时整除 a 和 b,且 s 是 a 和 b 的线性组合,我们有 gcd(a,b) | s. 但是 gcd(a,b) | s 并且 s > 0 意味着 gcd(a,b) ≤ s.
对于整数 a 和 b,如果 d | a 并且 d | b,那么 d | gcd(a,b).
贝祖定理 Bézout’s Theorem#
如果 a 和 b 是正整数,那么存在整数 s 和 t 使得 gcd(a,b) = sa + tb. 这里的整数 s 和 t 被称为贝祖系数.
根据贝祖定理,整数 a 和 b 的最大公约数可以表示为 sa + tb,其中 s 和 t 是整数. 这是 a 和 b 的一个线性组合,其系数为整数.
- gcd(6,14) = (-2) * 6 + 1 * 14
例子 - 求贝祖系数#
将 gcd(252,198) = 18 表示为 252 和 198 的线性组合.
首先使用欧几里得算法证明 gcd(252,198) = 18
-
252 = 1 * 198 + 54
-
198 = 3 * 54 + 36
-
54 = 1 * 36 + 18
-
36 = 2 * 18
这个方法展示了“两步法”,先使用欧几里得算法找到最大公约数,然后通
过回代的方式将最大公约数表示为原始两个整数的线性组合.
扩展欧几里得算法#
还有一种称为扩展欧几里得算法的“单步法”,可以在进行欧几里得算法的同时贝祖系数,将最大公约数直接表示为线性组合.
算法过程#
简单地说,这个算法的过程就是在使用原数字对进行欧几里得算法结束后又代入了两个自己假设的数组,这个数组开头被设计为 0 和 1,接着将这两个系数数组像原先的数字一样进行欧几里得算法,最后算出来的就是一个贝祖系数对.
首先,进行一个完整的欧几里得算法:
r0r1rn−2rn−1=r1q1+r2,=r2q2+r3,⋮=rn−1qn−1+rn,=rnqn.0≤r2<r1,0≤r3<r2,0≤rn<rn−1,
之后定义两个数列 s 和 t.它们有以下的属性:
s0si=1,s1=0,=si−2−si−1qi,t0ti=0,t1=1,=ti−2−ti−1qi.
asi+bti=ri(i=1,2,...,n)
则因为 asn+btn=rn=gcd(a,b)
所以 s 和 t 就是 a 和 b 的贝祖系数.
将 gcd(100,35) 表示为 100 和 35 的线性组合.
由 r0=100,r1=35 可进行欧几里得算法:
-
100 = 35 * 2 + 30
-
35 = 30 * 1 + 5
-
30 = 5 * 6
接着构建 s 和 t 数列,有如下过程:
s0s2=1,s1=0,=s0−s1q2,t0t2=0,t1=1,=t0−t1q2.s3=s1−s2q3,t3=t1−t2q3.
计算有 s3=−1,t3=3
则
gcd(100,35)=100∗s3+35∗t3=100∗(−1)+35∗3
将同余式两边同时除去整数#
将有效同余式的两边同时除以一个整数,并不总是能得到一个有效的同余式。
但如果这个整数与模数互素,则可以得到一个有效的同余式:
设 m 为正整数,a, b 和 c 为整数. 如果 ac≡bc(modm) 并且 gcd(c,m) = 1,那么 a≡b(modm)
因为
ac≡bc(modm)
那么
m∣ac−bc=c(a−b)
又由于 gcd(c,m) = 1, 所以 m | a - b.
因此:
a≡b(modm)
定理得证.
算术基本定理的唯一性证明#
- 如果 a,b,c 为正整数,gcd(a,b)=1 且 a∣bc,则 a∣c.
- 如果素数 p∣a1a2⋯an,则对于某个 i,有 p∣ai.
证明思路(反证法)#
假设存在两种不同的素因数分解。
n=p1p2⋯ps=q1q2⋯qt
其中 pi and qj 均为素数且非降序排列。
消去公共因子后,利用引理 2 可导出矛盾(左边素数整除右边,但右边是不含左边素数的乘积),从而得证唯一性。
线性同余方程 (Linear Congruences)#
形如 ax≡b(modm) 的同余式,其中 m 为正整数,a,b 是整数,x 是变量,称为线性同余式。
逆元 (Inverse)#
如果整数 aˉ 满足 aˉa≡1(modm),称 aˉ 为 a 的模 m 的逆元。
定理:如果 a 和 m 互素(gcd(a,m)=1)且 m>1,那么 a 在模 m 下有逆元,且该逆元在模 m 下是唯一的。
求解逆元#
利用扩展欧几里得算法求出贝祖系数 s,t 使得 sa+tm=1。
则 sa+tm≡1(modm)⇒sa≡1(modm)。
因此,s 即为 a 的逆元。
例子:求 101 在模 4620 下的逆元。
- 使用欧几里得算法确认 gcd(101,4620)=1。
- 回代求贝祖系数,得到 1=−35⋅4620+1601⋅101。
- 逆元为 1601。
用逆元求解线性同余式#
求解 ax≡b(modm)。
- 求出 a 的逆元 aˉ。
- 方程两边同时乘以 aˉ:
aˉax≡aˉb(modm)⇒x≡aˉb(modm)
中国剩余定理 (Chinese Remainder Theorem)#
问题背景#
“有物不知其数,三分之余二,五分之余三,七分之余二,此物几何?”
即求解方程组:
⎩⎨⎧xxx≡2(mod3)≡3(mod5)≡2(mod7)
设 m1,m2,…,mn 是两两互素的大于 1 的正整数,则对任意整数 a1,a2,…,an,同余方程组:
xxx≡a1(modm1)≡a2(modm2)⋮≡an(modmn)
在模 m=m1m2⋯mn 下有唯一解。
构造解法#
- 令 m=m1m2⋯mn。
- 令 Mk=m/mk。
- 求 yk,使得 Mkyk≡1(modmk)(即 yk 是 Mk 模 mk 的逆元)。
- 通解为:
x=∑k=1nakMkyk(modm)
求解孙子算经问题:
- m=3×5×7=105
- M1=35,M2=21,M3=15
- 逆元:y1=2,y2=1,y3=1
- x=2⋅35⋅2+3⋅21⋅1+2⋅15⋅1=140+63+30=233
- 233≡23(mod105)。最小正整数解为 23。
反向替换法 (Back Substitution)#
另一种求解方法。将第一个同余式写成 x=m1t+a1,代入第二个同余式求解 t,依此类推。
数论重要定理#
威尔逊定理 (Wilson’s Theorem)#
p 是素数当且仅当 (p−1)!≡−1(modp)。
欧拉定理与欧拉函数#
欧拉函数 ϕ(n):小于 n 且与 n 互素的正整数的个数。
- 若 p 是素数,ϕ(p)=p−1。
- 若 n=pq 且 p,q 互素,ϕ(n)=(p−1)(q−1)。
欧拉定理:如果 gcd(a,n)=1,则 aϕ(n)≡1(modn)。
推论:用于简化幂运算。
若 gcd(a,n)=1,则 ax≡axmodϕ(n)(modn)。
费马小定理 (Fermat’s Little Theorem)#
如果 p 是素数且 p∤a,则:
ap−1≡1(modp)
或者对于任意整数 a:
ap≡a(modp)
应用:计算大次幂的模。例如 7222mod11。
伪素数与原根#
伪素数 (Pseudoprimes)#
如果 n 是合数,但满足 bn−1≡1(modn),则称 n 为以 b 为基数的伪素数。
卡米切尔数 (Carmichael Numbers):一个合数 n,如果对所有满足 gcd(b,n)=1 的正整数 b 都满足 bn−1≡1(modn),则称 n 为卡米切尔数(如 561)。
原根 (Primitive Roots)#
模素数 p 的原根是 Zp 中的整数 r,使得 Zp 中的每一个非零元素都是 r 的某个幂次。
即 r1,r2,…,rp−1modp 生成了 1 到 p−1 的所有整数。
离散对数 (Discrete Logarithms)#
设 g 是模 p 的原根。如果 gx≡a(modp),则称 x 为以 g 为底 a 模 p 的离散对数。
记作 logga=x。
注意:计算离散对数在计算上是非常困难的(Discrete Logarithm Problem),这是许多密码学算法的基础。
同余式的应用#
哈希函数 (Hashing Functions)#
常用函数:h(k)=kmodm。
- 冲突解决:线性探测 h(k,i)=(h(k)+i)modm。
伪随机数 (Pseudorandom Numbers)#
线性同余法:
xn+1=(axn+c)modm
需要选择合适的模数 m、乘数 a、增量 c 和种子 x0。
校验位 (Check Digits)#
- UPC (通用产品代码):12位,利用模 10 同余检测错误。
3x1+x2+3x3+⋯+x12≡0(mod10)
- ISBN-10:利用模 11 同余。
∑i=110ixi≡0(mod11)
(其中 X 代表 10)。
密码学 (Cryptography)#
古典密码#
- 凯撒密码 (Caesar Cipher):移位 k=3。
加密:f(p)=(p+3)mod26。
- 移位密码 (Shift Cipher):任意 k。
加密:f(p)=(p+k)mod26。
解密:f−1(p)=(p−k)mod26。
- 仿射密码 (Affine Cipher):
加密:f(p)=(ap+b)mod26,其中 gcd(a,26)=1。
- 分组密码 (Block Cipher):
将字符分组,通过置换映射到另一组字符。例如换位密码。
密码系统 (Cryptosystems)#
五元组 (P,C,K,E,D):明文、密文、密钥空间、加密函数集、解密函数集。
公钥密码学 (Public Key Cryptography)#
- 私钥密码:双方共享同一个密钥(对称)。
- 公钥密码:每个人有一对密钥(公钥加密,私钥解密)。解决了密钥分发问题。
RSA 密码系统#
最常用的公钥密码系统,基于大整数分解的困难性。
算法过程#
-
密钥生成:
- 选择两个大素数 p,q。
- 计算 n=pq 和 ϕ(n)=(p−1)(q−1)。
- 选择整数 e,使得 gcd(e,ϕ(n))=1。
- 计算 d,使得 de≡1(modϕ(n))(即 d 是 e 的逆元)。
- 公钥:(n,e)。私钥:d。
-
加密:
将明文 M 转换为整数(分组),计算密文 C:
C=Memodn
-
解密:
利用私钥 d 恢复明文 M:
M=Cdmodn
正确性#
基于 Med≡M(modn)(欧拉定理推论)。
加密协议#
迪菲-赫尔曼密钥交换 (Diffie-Hellman Key Exchange)#
允许双方在不安全信道上协商共享密钥。基于离散对数难题。
- 公开参数:大素数 p 和原根 g。
- Alice 选私钥 a,发送 A=gamodp。
- Bob 选私钥 b,发送 B=gbmodp。
- 双方计算共享密钥:K=Bamodp=(gb)a=gabmodp=Abmodp。
数字签名 (Digital Signatures)#
用于验证消息来源和完整性。
- 发送方用私钥对消息(或其哈希)进行“解密”操作:S=Mdmodn。
- 接收方用发送方的公钥进行“加密”操作验证:M′=Semodn。若 M′=M,则签名有效。
同态加密 (Homomorphic Encryption)#
允许在密文上直接进行计算。RSA 具有乘法同态特性:
E(m1)⋅E(m2)≡m1e⋅m2e≡(m1m2)e≡E(m1m2)(modn)
零知识证明 (Zero Knowledge Proof)#
证明者向验证者证明某个命题为真,而不泄露任何额外信息。
- 属性:完备性、可靠性、零知识。
- 例子:Schnorr 协议(证明知道离散对数而不泄露该数值)。
处理大整数#
余数系统 (Residue Number System, RNS)#
利用中国剩余定理,将大整数表示为一组较小模数的余数元组。
- x=(x1,x2,…,xk),其中 xi=xmodPi,Pi 两两互质。
- 优点:加法和乘法可以并行地在每个分量上独立进行,大大提高了计算大整数运算的效率。
- x+y↔(x1+y1,…,xk+yk)
- x⋅y↔(x1⋅y1,…,xk⋅yk)