数论基础
数论是研究整数性质的学科,在密码学中广泛应用了数论中一些重要结论,比如素数、离散对数问题等。数论的概念和结论都比较抽象,而且涉及大量的证明,初学时忽略这些细节,而涉及到具体密码算法时掌握更多的细节或许是合理的学习方法。下面将介绍数论中的主要内容,包括整除的整除和同余、素数的基本性质和应用等。
更新历史:
- 2021年07月18日完成初稿
数论的知识是比较抽象的,对于只需要简单的数论背景知识的初学者而言,显然长篇大论般的理论和证明是不利于学习的,因此在这里将数论基础分为了「基础篇」和「扩展篇」,基础篇省去了定理的扩展描述和证明,而扩展篇则增加了数论知识的广度和深度,对于初学者而言可以自学习基础篇了解数论中的几个基本概念即可,等到后面涉及数论知识点后重新翻看基础篇和扩展篇即可。
基础篇
在密码学中,最重要的两大块数论基础知识为整除和同余、素数及其定理,下面将简单介绍关于数论基础知识。
1. 整除和同余
整除是小学阶段的概念,对此不多介绍,只介绍数论中整除的定义与使用的符号。
- 整除:设 a , b , m ∈ Z a, b, m\in Z a,b,m∈Z, ∃ m \exists m ∃m使得 a = m b a = mb a=mb成立,则称非零整数 b b b整除 a a a,记作 b ∣ a b|a b∣a,此时称 b b b是 a a a的因子, a a a是 b b b的倍数。举一些例子,比如 2 ∣ 6 , 3 ∣ 6 2|6, 3|6 2∣6,3∣6等。
除数与被除数
需要熟知一个容易混淆的概念,被除数 ÷ \;\div\; ÷除数 = \;=\; =商…余数,因此整除描述了「除数」整除「被除数」的情况,比如 6 ÷ 3 = 2......0 6\;\div\;3=2......0 6÷3=2......0,描述了 3 3 3整除 6 6 6的情况,在中文中除和除以是不同的概念,一定要区分好。
在上面,假设有 m ∣ a , m ∣ b m|a\;,m|b m∣a,m∣b说明 m m m是 a a a的因子,也是 b b b的因子,因此称 m m m是 a a a和 b b b的公因子,由于 1 1 1是任何整数的因子,故公因子一定存在(至少为 1 1 1),而令人感兴趣的是两个整数的最大公因子(Greatest Common Divisor)是多少。
- 最大公因子:设 a , b , m ∈ Z a, b, m \in Z a,b,m∈Z,而且 m ∣ a , m ∣ b m|a, m|b m∣a,m∣b,若 m m m是整除 a a a和 b b b的最大整数,那么 m m m称为 a a a和 b b b的最大公因子,记作 m = g c d ( a , b ) m = gcd(a, b) m=gcd(a,b)。
互素
利用最大公因子,可以定义一个常用的概念,即互素:称整数 a , b a,b a,b是互素的,当且仅当 g c d ( a , b ) = 1 gcd(a,b)=1 gcd(a,b)=1。
求解最大公因子有非常有效的算法——欧几里得算法(Euclidean Algorithm),不过欧几里得算法利用了余数的概念,因此下面先介绍余数的概念。整除理解起来还比较简单,在带余除法中定义了余数的概念:
- 带余除法: ∀ n ∈ Z + \forall n \in Z^+ ∀n∈Z+和 ∀ a ∈ Z \forall a \in Z ∀a∈Z, ∃ q , r ∈ Z \exists q,r \in Z ∃q,r∈Z且 0 ≤ r < n 0\leq r <n 0≤r<n使得 a = q n + r a=qn+r a=qn+r,其中 q = ⌊ a / n ⌋ q=\lfloor a/n \rfloor q=⌊a/n⌋, ⌊ ⌋ \lfloor \rfloor ⌊⌋为向下取整。
可以看到,其中的 q q q即为商,而 r r r即为余数,按照上面的公式有 r = a − ⌊ a / n ⌋ × n r=a-\lfloor a/n \rfloor \times n r=a−⌊a/n⌋×n,在这里用一个更加简洁的符号表达 r r r,那就是模运算符号 m o d mod mod,记作 r = a m o d n r=a\;mod\;n r=amodn,这里称 n n n是模数,该运算称为模 n n n运算。
回到求解最大公因子,对于任意整数 a a a和 b b b可以通过下面的方式计算 g c d ( a , b ) gcd(a,b) gcd(a,b),不断使用带余除法,直至余数为 0 0 0,此时的除数即为最大公因子,即有下面的过程
a = q 1 b + r 1 ( 0 < r 1 < b ) b = q 2 r 1 + r 2 ( 0 < r 2 < r 1 ) r 1 = q 3 r 2 + r 3 ( 0 < r 3 < r 2 ) . . . r n − 2 = q n r n − 1 + r n ( 0 < r n < r n − 1 ) r n − 1 = q n + 1 r n + 0 ⇒ g c d ( a , b ) = r n a = q_1b + r_1\qquad\;\;(0<r_1<b)\\ b = q_2r_1 + r_2\qquad(0<r_2<r_1)\\ r_1 = q_3r_2 + r_3\qquad(0<r_3<r_2)\\ ...\\ r_{n-2} = q_nr_{n-1} + r_n\quad(0<r_n<r_{n-1})\\ r_{n-1}=q_{n+1}r_n+0\quad \Rightarrow gcd(a,b)=r_n\\ a=q1b+r1(0<r1<b)b=q2r1+r2(0<r2<r1)r1=q3r2+r3(0<r3<r2)...rn−2=qnrn−1+rn(0<rn<rn−1)rn−1=qn+1rn+0⇒gcd(a,b)=rn
欧几里得算法证明并利用了等式: g c d ( a , b ) = g c d ( b , r 1 ) = . . . = g c d ( r n − 1 , r n ) = g c d ( r n , 0 ) = r n gcd(a,b) = gcd(b,r_1)=...=gcd(r_{n-1},r_n)=gcd(r_n,0)=r_n gcd(a,b)=gcd(b,r1)=...=gcd(rn−1,rn)=gcd(rn,0)=rn。下面是欧几里得算法的实现:
# 利用Euclid算法计算最小公因数gcd(a, b)
def Euclid_gcd(a, b):
r1 = max(abs(a), abs(b)) # 令r1等于绝对值大的数
r2 = min(abs(a), abs(b)) # 令r2等于绝对值小的数
if r2 == 0:
return r1
else:
return Euclid_gcd(r2, r1%r2)
尽管整除是一种很好的性质,但不是所有整数都具备,大部分情况而言,对于两个整数相除还是会存在余数。注意到一种情况,两个不同的数 a , b a,b a,b都是除以另一个数 n n n可能获得相同的余数,这种情况称为关于模 n n n是同余的:
- 同余:若 a m o d n = b m o d n a\;mod\;n=b\;mod\;n amodn=bmodn,那么称整数 a a a和 b b b是模 n n n同余的,记作 a ≡ b ( m o d n ) a\equiv b(mod\;n) a≡b(modn)。
同余运算中,最重要的是模数 n n n,比如 6 6 6和 11 11 11模 5 5 5同余,而模 3 3 3就不同余了。因此考虑一般情况,对于模 n n n运算,考察所有整数 Z = { 0 , ± 1 , ± 2 , ± 3 , . . . } Z=\{0, \pm 1, \pm 2, \pm 3, ...\} Z={ 0,±1,±2,±3,...}, ∀ a ∈ Z \forall a\in Z ∀a∈Z,根据定义 a m o d n ∈ { 0 , 1 , 2 , . . . , n − 1 } a\;mod\;n\in \{0, 1, 2,..., n-1\} amodn∈{ 0,1,2,...,n−1},因此对于任何整数只要进行模 n n n运算之后,所有整数都被限制到有限的集合中,那么必然会出现同余的情况,依据此可以定义下面两个概念:
- 剩余类集:模 n n n运算的所有余数的集合,记作 Z n = { 0 , 1 , 2 , . . . , n − 1 } Z_n=\{0, 1, 2,..., n-1\} Zn={ 0,1,2,...,n−1}
- 剩余类:所有模 n n n同余的整数的集合,一般用最小的非负整数作为代表,记作 [ 0 ] , [ 1 ] , [ 2 ] , . . , [ n − 1 ] [0],[1],[2],..,[n-1] [0],[1],[2],..,[n−1]
下面举一个例子:计算 ∀ a ∈ Z , a m o d 3 \forall a\in Z,\;a\;mod\;3 ∀a∈Z,amod3有
. . . , − 9 , − 6 , − 3 , 0 , 3 , 6 , 9 , . . . m o d 3 = 0 . . . , − 8 , − 5 , − 2 , 1 , 4 , 7 , 10 , . . . m o d 3 = 1 . . . , − 7 , − 4 , − 1 , 2 , 5 , 8 , 11 , . . . m o d 3 = 2 ..., -9, -6, -3, 0, 3, 6, 9, ...\;mod\;3=0\\ ..., -8, -5, -2, 1, 4, 7, 10, ...\;mod\;3=1\\ ..., -7, -4, -1, 2, 5, 8, 11, ...\;mod\;3=2\\ ...,−9,−6,−3,0,3,6,9,...mod3=0...,−8,−5,−2,1,4,7,10,...mod3=1...,−7,−4,−1,2,5,8,11,...mod3=2
则 Z 3 = { 0 , 1 , 2 } Z_3=\{0, 1, 2\} Z3={
0,1,2},而剩余类有 3 3 3个,分别是:
[ 0 ] = { . . . , − 9 , − 6 , − 3 , 0 , 3 , 6 , 9 , . . . } [ 1 ] = { . . . , − 8 , − 5 , − 2 , 1 , 4 , 7 , 10 , . . . } [ 2 ] = { . . . , − 7 , − 4 , − 1 , 2 , 5 , 8 , 11 , . . . } [0]=\{..., -9, -6, -3, 0, 3, 6, 9, ...\}\\ [1]=\{..., -8, -5, -2, 1, 4, 7, 10, ...\}\\ [2]=\{..., -7, -4, -1, 2, 5, 8, 11, ...\}\\ [0]={
...,−9,−6,−3,0,3,6,9,...}[1]={
...,−8,−5,−2,1,4,7,10,...}[2]={
...,−7,−4,−1,2,5,8,11,...}
上面讲述了很多同余的概念,之所以关注这些是为了进行剩余类上的模运算:
- 模运算:称二元运算 a m o d n = r a\;mod\;n=r amodn=r是模 n n n运算, r r r为 a a a模 n n n的值,且 0 ≤ r < n 0\leq r <n 0≤r<n
可以证明对于任意两个整数 a a a和 b b b有下面的结论,即:
- [ ( a m o d n ) + ( b m o d n ) ] m o d n = ( a + b ) m o d n [(a\;mod\;n)+(b\;mod\;n)]\;mod\;n=(a+b)\;mod\;n [(amodn)+(bmodn)]modn=(a+b)modn
- [ ( a m o d n ) − ( b m o d n ) ] m o d n = ( a − b ) m o d n [(a\;mod\;n)-(b\;mod\;n)]\;mod\;n=(a-b)\;mod\;n [(amodn)−(bmodn)]modn=(a−b)modn
- [ ( a m o d n ) × ( b m o d n ) ] m o d n = ( a × b ) m o d n [(a\;mod\;n)\times (b\;mod\;n)]\;mod\;n=(a\times b)\;mod\;n [(amodn)×(bmodn)]modn=(a×b)modn
- 加法交换律: ( a + b ) m o d n = ( b + a ) m o d n (a+b)\;mod\;n=(b+a)\;mod\;n (a+b)modn=(b+a)modn
- 乘法交换律: ( a × b ) m o d n = ( b × a ) m o d n (a\times b)\;mod\;n=(b\times a)\;mod\;n (a×b)modn=(b×a)modn
- 加法消去律: a + b = a + c ⇒ b = c ( m o d n ) a+b=a+c\Rightarrow b=c\;(mod\;n) a+b=a+c⇒b=c(modn)
- 乘法消去律( a a a在模 n n n运算中存在乘法逆元时): ∀ a ≠ 0 , a × b = a × c ⇒ b = c ( m o d n ) \forall a\neq 0, a\times b=a\times c\Rightarrow b=c\;(mod\;n) ∀a=0,a×b=a×c⇒b=c(modn)
消去律的成立与否与逆元的存在与否有很大关系,下面是加法逆元和乘法逆元的定义:
- 加法逆元: a , b ∈ Z n a,b\in Z_n a,b∈Zn,若 ( a + b ) m o d n = 0 (a+b)\;mod\;n=0 (a+b)modn=0,则 a a a和 b b b互为加法逆元,记 a a a的加法逆元为 − a -a −a
- 乘法逆元: a , b ∈ Z n a,b\in Z_n a,b∈Zn,若 ( a × b ) m o d n = 1 (a\times b)\;mod\;n=1 (a×b)modn=1,则 a a a和 b b b互为乘法逆元,记 a a a的乘法逆元为 a − 1 a^{-1} a−1
由于加法逆元一定存在,故加法消去律一定成立,而但当且仅当 g c d ( a , n ) = 1 gcd(a,n)=1 gcd(a,n)=1时, a a a才在模 n n n运算中存在乘法逆元,故乘法消去律在该条件下才成立。
2. 素数及其定理
素数是数论的核心概念,比如著名的哥德巴赫猜想等就与素数有关。素数的定义很简单,与之对应的还有合数的概念:
- 素数:正因子只有 1 1 1和它本身的正整数称为素数,而且规定 1 1 1不是素数,常记作 p p p
- 合数:合数是指正整数中不是素数的数,其除 1 1 1和它本身之外,还有其他因子
因此, 2 2 2是最小的素数,除 2 2 2以外,素数都为奇数,最小的合数为 4 4 4。合数有一个非常重要的性质,称为算术基本定理:
- 算术基本定理:任何合数都可以唯一分解为若干个素数的乘积。
即对于任何整数 a > 1 a>1 a>1可以唯一分解为 a = p 1 a 1 p 2 a 2 . . . p n a n a=p_1^{a_1} p_2^{a_2}... p_n^{a_n} a=p1a1p2a2...pnan, ∀ i ∈ { 1 , 2 , . . . , n } \forall i\in \{1, 2, ..., n\} ∀i∈{ 1,2,...,n}有 p i p_i pi是素数( p 1 < p 2 < . . . < p n p_1<p_2<...<p_n p1<p2<...<pn), a i a_i ai是正整数。
关于素数,有两个常用的定理——费马小定理和欧拉定理,这两个定理在密码学中应用十分广泛。
- 费马小定理:若 p p p是素数,则对任何与 p p p互素的正整数 a a a有,则有 a p − 1 ≡ 1 ( m o d p ) a^{p-1}\equiv 1(mod\;p) ap−1≡1(modp)。
该定理还有另外一种形式:若 p p p是素数,且 a ∈ Z + a\in Z^+ a∈Z+,那么 a p ≡ a ( m o d p ) a^p\equiv a(mod\;p) ap≡a(modp)。因此可以总结费马小定理为:若 p p p是素数,则 ∀ a ∈ Z + \forall a\in Z^+ ∀a∈Z+有 a p ≡ a ( m o d p ) a^p\equiv a(mod\;p) ap≡a(modp),进一步地,若 a a a与 p p p互素,则有 a p − 1 ≡ 1 ( m o d p ) a^{p-1}\equiv 1(mod\;p) ap−1≡1(modp)。
- 欧拉定理:对于任意互素的正整数 a a a和 n n n有: a ϕ ( n ) ≡ 1 ( m o d n ) a^{\phi(n)}\equiv 1(mod\;n) aϕ(n)≡1(modn)
其中 ϕ ( n ) \phi(n) ϕ(n)称为欧拉函数,是指小于等于 n n n的与 n n n互素的正整数个数,常采用下面几个公式计算 ϕ ( n ) \phi(n) ϕ(n):
- 若 n n n是素数,则 ϕ ( n ) = n − 1 \phi(n)=n-1 ϕ(n)=n−1
- 若 n = p q n=pq n=pq,其中 p p p和 q q q均为素数,那么 ϕ ( n ) = ϕ ( p ) ϕ ( q ) \phi(n)=\phi(p)\phi(q) ϕ(n)=ϕ(p)ϕ(q),进一步地若 p p p和 q q q互素( g c d ( p , q ) = 1 gcd(p,q)=1 gcd(p,q)=1),那么 ϕ ( n ) = ϕ ( p ) ϕ ( q ) \phi(n)=\phi(p)\phi(q) ϕ(n)=ϕ(p)ϕ(q)也成立
- 若 n = p t n=p^t n=pt,其中p是素数,那么 ϕ ( n ) = p t − p t − 1 \phi(n)=p^t-p^{t-1} ϕ(n)=pt−pt−1
总结一下,对于费马定理和欧拉定理,如果计算 a x ≡ b ( m o d n ) a^x\equiv b(mod\;n) ax≡b(modn)中的一些参数,那么如果 n n n是素数,那么考虑费马定理,若 n n n不是素数则考虑欧拉定理。
最后,介绍一下离散对数问题(Discrete logarithm),离散对数问题是包括Diffie-Hellman密钥交换算法和数字签名算法(DSA)在内的许多公钥算法的基础。在介绍离散对数问题之前,还需要介绍一下本原根的概念,它是离散对数的基础。
- 本原根:使得 a m ≡ 1 ( m o d n ) a^m\equiv 1(mod\;n) am≡1(modn)的最小正整数 m m m称为 a a a的阶,若 m = ϕ ( n ) m=\phi(n) m=ϕ(n)则 a a a称为 n n n的本原根
本原根的定义是抽象的,实际上,若考虑 X X X为小于等于 n n n且与 n n n互素的正整数集合,即 X = { x 1 , x 2 , . . . , x ϕ ( n ) } X=\{x_1, x_2, ..., x_{\phi(n)}\} X={ x1,x2,...,xϕ(n)},其中 ∀ i ∈ { 1 , 2 , . . . , ϕ ( n ) } \forall i\in\{1, 2, ..., \phi(n)\} ∀i∈{ 1,2,...,ϕ(n)}有 g c d ( x i , n ) = 1 gcd(x_i, n)=1 gcd(xi,n)=1, a a a是 n n n的本原根当且仅当集合 { ( a 1 m o d n ) , ( a 2 m o d n ) , . . . , ( a ϕ ( n ) m o d n ) } = X \{(a^1\;mod\;n), (a^2\;mod\;n),...,(a^{\phi(n)}\;mod\;n)\}=X { (a1modn),(a2modn),...,(aϕ(n)modn)}=X。
根据定义,对于一个素数 p p p(本原根定义中不要求素数)而言,由于 ϕ ( p ) = p − 1 \phi(p)=p-1 ϕ(p)=p−1,且上述定义的集合 X = { 1 , 2 , . . . , p − 1 } X=\{1,2,...,p-1\} X={ 1,2,...,p−1},故设 a a a为本原根,则 a a a满足:
{ ( a 1 m o d p ) , ( a 2 m o d p ) , . . . , ( a ϕ ( p ) m o d p ) } = { ( a 1 m o d p ) , ( a 2 m o d p ) , . . . , ( a p − 1 m o d p ) } = { 1 , 2 , . . . , p − 1 } \{(a^1\;mod\;p),(a^2\;mod\;p),...,(a^{\phi (p)}\;mod\;p)\} \\ = \{(a^1\;mod\;p),(a^2\;mod\;p),...,(a^{p-1}\;mod\;p)\} \\ = \{1,2,...,p-1\}\qquad\qquad\qquad\qquad\qquad\qquad { (a1modp),(a2modp),...,(aϕ(p)modp)}={ (a1modp),(a2modp),...,(ap−1modp)}={ 1,2,...,p−1}
因此对于任何整数 b b b有 b m o d p ∈ { 1 , 2 , . . . , p − 1 } b\;mod\;p\in \{1,2,...,p-1\} bmodp∈{ 1,2,...,p−1},故一定存在 i ∈ { 1 , 2 , . . . , p − 1 } i\in \{1,2,...,p-1\} i∈{ 1,2,...,p−1}使得 a i ≡ b ( m o d p ) a^i\equiv b(mod\;p) ai≡b(modp),此时 i i i就被称为以 a a a为底模 p p p运算的 b b b的离散对数,记作 i = d l o g a , p b i=dlog_{a,p}b i=dloga,pb:
- 离散对数:若 a i ≡ b ( m o d p ) a^i\equiv b(mod\;p) ai≡b(modp),此时 i i i就被称为以 a a a为底模 p p p运算的 b b b的离散对数,记作 i = d l o g a , p b i=dlog_{a,p}b i=dloga,pb
离散对数是基于本原根的概念,只有存在本原根时才存在唯一的以 a a a为底模 m m m的离散对数,而模数 m m m一般选为素数,因为素数存在本原根。最后介绍一下离散对数难题:
- 离散对数难题:对于方程 y = g x m o d p y=g^x\;mod\;p y=gxmodp,已知 g , x , p g,x,p g,x,p可以很容易计算 y y y,而已知 y , g , p y,g,p y,g,p很难计算 x x x,是指数级别复杂度的,因此计算离散对数是计算困难的。
扩展篇
相比于基础篇,扩展篇增加了很多内容,尤其是定理的证明,不过对于初学者而言,不需要对此有很深刻的理解,初学时跳过即可。
1. 整数的整除和同余
数论中主要研究整数的性质,特别是两个整数之间的关系,其中整除和同余是经常被讨论的。
1.1 整除和余数
在小学里,我们学过这样一个公式:被除数 ÷ \;\div\; ÷除数 = \;=\; =商…余数。整除的含义即为余数为0 ,而当余数不为0时,此时就需要用余数表示不能整除的部分,下面就从整除出发,介绍整数的整除和余数的基本概念。
1.1.1 带余除法
尽管整除理解起来很简单,但还是需要给出整除的形式化定义:
- 整除:设 a , b , m ∈ Z a, b, m\in Z a,b,m∈Z, ∃ m \exists m ∃m使得 a = m b a = mb a=mb成立,则称非零整数 b b b整除 a a a,记作 b ∣ a b|a b∣a,此时称 b b b是 a a a的因子, a a a是 b b b的倍数。
特殊地,任何不等于 0 0 0的整数都整除 0 0 0,即 ∀ a ≠ 0 , a ∣ 0 \forall a \neq 0, a|0 ∀a=0,a∣0,而且 1 1 1整除任何整数,即 ∀ a ∈ Z , 1 ∣ a \forall a \in Z, 1|a ∀a∈Z,1∣a。
不过大多数时候都可能除不尽,即余数不为 0 0 0,那么就会有余数(remainder)的概念。在数论中,带余除法描述了这一情形,下面是带余除法的形式化定义:
- 带余除法: ∀ n ∈ Z + \forall n \in Z^+ ∀n∈Z+和 ∀ a ∈ Z \forall a \in Z ∀a∈Z, ∃ q , r ∈ Z \exists q,r \in Z ∃q,r∈Z且 0 ≤ r < n 0\leq r <n 0≤r<n使得 a = q n + r a=qn+r a=qn+r,其中商 q = ⌊ a / n ⌋ q=\lfloor a/n \rfloor q=⌊a/n⌋, ⌊ ⌋ \lfloor \rfloor ⌊⌋为向下取整,而余数 r = a − ⌊ a / n ⌋ × n r=a-\lfloor a/n \rfloor \times n r=a−⌊a/n⌋×n。
下面是带余除法的图示表示,可以看到 a a a和 q q q是同号的,因为需要保证余数是非负整数。

1.1.2 最大公因子
在整除定义中提到了因子的概念, m ∣ a m|a m∣a说明 m m m是 a a a的因子,若 m ∣ a m|a m∣a且 m ∣ b m|b m∣b说明 m m m是 a , b a,b a,b的因子,称为 a a a和 b b b的公因子,由于 1 1 1是任何整数的因子,故公因子一定存在(至少为 1 1 1),而关注最多的的是最大的公因子:
- 最大公因子(Greatest Common Divisor):设 a , b , m ∈ Z a, b, m \in Z a,b,m∈Z,而且 m ∣ a , m ∣ b m|a, m|b m∣a,m∣b,若 m m m是整除 a a a和 b b b的最大整数,那么 m m m称为 a a a和 b b b的最大公因子,记作 m = g c d ( a , b ) m = gcd(a, b)

本文介绍了数论的基础知识,包括整除与同余的概念、素数及其相关定理,并探讨了离散对数问题。适合初学者快速入门。
最低0.47元/天 解锁文章
1201

被折叠的 条评论
为什么被折叠?



