算法导论-第31章-数论算法
本章将处理大整数。“大输入”通常指包含“大整数”的输入,而不是包含“很多整数“的输入。因此,我们利用输入所需的位数来度量输入的大小,而不仅仅是输入中整数的数目。
给定 k k k 个整数输入 a 1 , a 2 , ⋯ , a n a_1,a_2,\cdots,a_n a1,a2,⋯,an,如果算法可以在关于 log a 1 , log a 2 , ⋯ , log a n \log a_1,\log a_2, \cdots, \log a_n loga1,loga2,⋯,logan 的多项式时间内完成,即算法在关于二进制编码后的输入长度的多项式时间内完成,则称该算法为多项式时间算法。 (不是很懂🤣)
31.1 基础数论概念
整数集 Z = { ⋯ , − 2 , − 1 , 0 , 1 , 2 , ⋯ } Z=\{\cdots, -2, -1, 0, 1, 2, \cdots\} Z={⋯,−2,−1,0,1,2,⋯}。
自然数集 N = { 0 , 1 , 2 , ⋯ } N=\{0, 1, 2, \cdots\} N={0,1,2,⋯}。
整除性与约数
**符号 d ∣ a d|a d∣a (读作” d d d 整除 a a a“)的含义是,存在某个整数 k k k,使得 ∗ ∗ a = k d **a = kd ∗∗a=kd。
任何整数均可整除0。
如果 d ∣ a d|a d∣a 且 d ≥ 0 d \ge 0 d≥0,则称 d d d 是 a a a 的约数。
不失一般性,规定约数为非负数,非零整数 a a a 的约数至少为1,且不大于 ∣ a ∣ |a| ∣a∣。例如,24的约数是1,2,3,4,6,8,12,24。
任何正整数 a a a 均可被平凡数1和其自身 a a a 整除。整数 a a a 的非平凡约数称为 a a a 的因子。例如,20的因子是2, 4, 5, 10。
素数与合数
如果一个整数 a > 1 a \gt 1 a>1 且只能被平凡约数1和它自身所整除,则这个数是素数。
前20个素数排列如下:2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71.
如果一个整数 a > 1 a \gt 1 a>1 且不是素数,则这个数是合数。
0, 1和所有负整数都既不是素数也不是合数。
除法定理、余数和模
除法定理:对于任何整数 a a a 和任何正整数 n n n,存在唯一整数 q q q 和 r r r,满足 0 ≤ r < n 0 \le r \lt 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⌋ 为除法的商,值 r = a m o d n r = a\ mod\ n r=a mod n 为除法的余数。 n ∣ a n|a n∣a 当且仅当 a m o d n = 0 a\ mod\ n = 0 a mod n=0。
模 n n n 的等价类: [ a ] n = { a + k n ∣ k ∈ Z } [a]_n=\{a+kn|k \in Z\} [a]n={a+kn∣k∈Z}
- a ∈ [ b ] n a\in [b]_n a∈[b]n,则 a ≡ b ( m o d n ) a \equiv b(mod\ n) a≡b(mod n)。
公约数与最大公约数
a , b a,b a,b 不全为零的两个整数,则最大公约数 g c d ( a , b ) gcd(a,b) gcd(a,b) 是 { a x + b y ∣ x , y ∈ Z } \{ax+by|x,y \in Z\} {ax+by∣x,y∈Z} 中最小的正整数。
- 对所有整数 a a a 和 b b b,如果 d ∣ a d|a d∣a, d ∣ b d|b d∣b,则 d ∣ g c d ( a , b ) d|gcd(a,b) d∣gcd(a,b)。
- 对所有整数 a a a 和 b b b,和非负整数 n n n,有 g c d ( a n , b n ) = n g c d ( a , b ) gcd(an, bn)= ngcd(a,b) gcd(an,bn)=ngcd(a,b)。
- 对所有正整数 n n n、 a a a 和 b b b,如果 n ∣ a b n|ab n∣ab 且 g c d ( a , n ) = 1 gcd(a,n)=1 gcd(a,n)=1,则 n ∣ b n|b n∣b。
互素数和素数唯一性分解定理
如果 g c d ( a , b ) = 1 gcd(a, b)=1 gcd(a,b)=1,称 a a a 和 b b b 为互素数。
∀ a , b , p ∈ Z \forall a,b,p \in Z ∀a,b,p∈Z,如果 g c d ( a , p ) = 1 gcd(a, p)= 1 gcd(a,p)=1 和 g c d ( b , p ) = 1 gcd(b, p) = 1 gcd(b,p)=1,则 g c d ( a b , p ) = 1 gcd(ab, p) = 1 gcd(ab,p)=1。
唯一分解定理:一个合数能被唯一写成形式 a = p 1 e 1 p 2 e 2 ⋯ p r e r a = p_{1}^{e_1}p_{2}^{e_2} \cdots p_{r}^{e_r} a=p1e1p2e2⋯prer,这里 p i p_i pi 是素数, p 1 < p 2 < ⋯ < p r p_1 \lt p_2 \lt \cdots \lt p_r p1<p2<⋯<pr, e i e_i ei 是正整数。例如, 6000 = 2 4 × 3 × 5 3 6000=2^4 \times 3 \times 5^3 6000=24×3×53
31.2 最大公约数
一种直观解GCD
a = p 1 e 1 p 2 e 2 ⋯ p r e r a = p_{1}^{e_1}p_{2}^{e_2} \cdots p_{r}^{e_r} a=p1e1p2e2⋯prer 和 b = p 1 f 1 p 2 f 2 ⋯ p r f r b = p_{1}^{f_1}p_{2}^{f_2} \cdots p_{r}^{f_r} b=p1f1p2f2⋯prfr ⇒ \Rightarrow ⇒ g c d ( a , b ) = p 1 m i n { e 1 , f 1 } p 2 m i n { e 2 , f 2 } ⋯ p r m i n { e r , f r } gcd(a,b) = p_{1}^{min\{e_1,f_1\}} p_{2}^{min\{e_2,f_2\}} \cdots p_{r}^{min\{e_r,f_r\}} gcd(a,b)=p1min{e1,f1}p2min{e2,f2}⋯prmin{er,fr}。
注:这种解法需要整数的素因子分解,而素因子分解是一个很难的问题(NP-hard)。
Euclid‘s Algorithm
EUCLID(a, b)
if b == 0
return a
else
return EUCLID(b, a mod b)
以 g c d ( 30 , 21 ) gcd(30, 21) gcd(30,21) 为例,EUCLID(30, 21) = EUCLID(21, 9) = EUCLID(9, 3) = EUCLID(3, 0) = 3
Euclid‘s Algorithm的递归调用次数为 O ( log b ) \Omicron(\log b) O(logb)。
Extended-Euclid‘s Algorithm
31.3 求解线性模方程
求 x x x 满足下面的模方程 a x ≡ b ( m o d n ) ax \equiv b (mod \ n) ax≡b(mod n),其中 a > 0 , n > 0 a \gt 0,n \gt 0 a>0,n>0。
当且仅当 g c d ( a , n ) ∣ b gcd(a, n) | b gcd(a,n)∣b 时,方程 a x ≡ b ( m o d n ) ax \equiv b (mod \ n) ax≡b(mod n) 有解。
例题,判断 4 x ≡ 2 ( m o d 6 ) 4x \equiv 2(mod \ 6) 4x≡2(mod 6) 和 4 x ≡ 3 ( m o d 6 ) 4x \equiv 3 (mod \ 6) 4x≡3(mod 6) 有无解。
- 因为 g c d ( 4 , 6 ) ∣ 2 gcd(4, 6) | 2 gcd(4,6)∣2,所以 4 x ≡ 2 ( m o d 6 ) 4x \equiv 2(mod \ 6) 4x≡2(mod 6) 有解。
- 因为 g c d ( 4 , 6 ) 不整除 3 gcd(4, 6)不整除3 gcd(4,6)不整除3,所以 4 x ≡ 3 ( m o d 6 ) 4x \equiv 3(mod \ 6) 4x≡3(mod 6) 无解。
设 d = g c d ( a , n ) d = gcd(a, n) d=gcd(a,n) 且 d = a x ′ + n y ′ d = ax'+ny' d=ax′+ny′,对某个整数 x ′ x' x′ 和 y ′ y' y′。如果 d ∣ b d|b d∣b,则有特解 x 0 = x ′ ( b / d ) m o d n x_0 = x'(b/d) mod \ n x0=x′(b/d)mod n。
设 x 0 x_0 x0 为 a x ≡ b ( m o d n ) ax \equiv b(mod \ n) ax≡b(mod n) 的一个解,则有 d d d 个不同的解: x i = x 0 + i ( n / d ) , i = 0 , 1 , 2 , ⋯ , d − 1 x_i = x_0 + i(n/d),i = 0 ,1, 2, \cdots,d-1 xi=x0+i(n/d),i=0,1,2,⋯,d−1。
方程 a x ≡ b ( m o d n ) ax \equiv b (mod \ n) ax≡b(mod n) 要么对模 n n n 有 g c d ( a , n ) gcd(a, n) gcd(a,n) 个不同的解,要么无解。
例题,求 14 x ≡ 30 ( m o d 100 ) 14x \equiv 30(mod \ 100) 14x≡30(mod 100)。
解:调用 E x t e n d e d E u c l i d ( 14 , 100 ) = ( d , x ′ , y ′ ) = ( 2 , − 7 , 1 ) ExtendedEuclid(14,100)=(d,x',y')=(2,-7,1) ExtendedEuclid(14,100)=(d,x′,y′)=(2,−7,1)
∵2|30
∴特解 x 0 = − 7 × 30 / 2 ( m o d 100 ) = 95 x_0=-7×30/2(mod 100)=95 x0=−7×30/2(mod100)=95
调用求全部解算法:二个解95,45
x 0 = 95 + 0 × 100 / 2 = 95 x_0=95+0×100/2=95 x0=95+0×100/2=95
x 1 = 95 + 1 × 100 / 2 = 145 = 45 ( m o d 100 ) x_1=95+1×100/2=145=45(mod 100) x1=95+1×100/2=145=45(mod100)
31.4 中国剩余定理
模逆: a a − 1 ≡ 1 ( m o d n ) aa^{-1} \equiv 1(mod \ n) aa−1≡1(mod n)。
定义
m
i
=
n
/
n
i
m_i = n / n_i
mi=n/ni,于是可得
m
i
=
n
1
n
2
⋯
n
i
−
1
n
i
+
1
⋯
n
k
m_i = n_1n_2\cdots n_{i-1}n_{i+1} \cdots n_k
mi=n1n2⋯ni−1ni+1⋯nk。接着定义
c
i
=
m
i
(
m
i
−
1
m
o
d
n
i
)
c_i=m_i(m_i^{-1} mod \ n_i)
ci=mi(mi−1mod ni)。
a
≡
(
a
1
c
1
+
a
2
c
2
+
⋯
+
a
k
c
k
)
(
m
o
d
n
)
a \equiv(a_1c_1+a_2c_2+\cdots+a_kc_k)(mod \ n)
a≡(a1c1+a2c2+⋯+akck)(mod n)
例题,已知
a
≡
2
(
m
o
d
5
)
,
a
≡
3
(
m
o
d
13
)
a \equiv 2(mod \ 5),a \equiv 3(mod \ 13)
a≡2(mod 5),a≡3(mod 13)。
解:
a
1
=
2
,
a
2
=
3
a_1 = 2, a_2 = 3
a1=2,a2=3
n 1 = 5 , n 2 = 13 n_1 = 5, n_2 = 13 n1=5,n2=13
m 1 = n 2 = 13 , m 2 = n 1 = 5 m_1 = n_2 = 13, m_2 = n_1 = 5 m1=n2=13,m2=n1=5
m 1 m 1 − 1 = 1 ( m o d 5 ) , m 1 − 1 = 2 m_1m_1^{-1} = 1(mod \ 5), m_1^{-1}= 2 m1m1−1=1(mod 5),m1−1=2
m 2 m 2 − 1 = 1 ( m o d 13 ) , m 2 − 1 = 8 m_2m_2^{-1} = 1(mod \ 13), m_2^{-1} = 8 m2m2−1=1(mod 13),m2−1=8
c 1 = 13 ( 2 m o d 5 ) = 26 c_1 = 13(2 \ mod \ 5) = 26 c1=13(2 mod 5)=26
c 2 = 5 ( 8 m o d 13 ) = 40 c_2 = 5(8 \ mod \ 13) = 40 c2=5(8 mod 13)=40
a ≡ 2 ⋅ 26 + 3 ⋅ 40 ( m o d 65 ) ≡ ( 52 + 120 ) ( m o d 65 ) ≡ 42 ( m o d 65 ) a \equiv 2 \cdot 26+3 \cdot 40(mod \ 65) \\ \equiv (52 + 120)(mod \ 65) \\ \equiv 42(mod \ 65) a≡2⋅26+3⋅40(mod 65)≡(52+120)(mod 65)≡42(mod 65)
例题,已知 x ≡ 4 ( m o d 5 ) x \equiv 4(mod \ 5) x≡4(mod 5) 和 x ≡ 5 ( m o d 11 ) x \equiv 5(mod \ 11) x≡5(mod 11)。
解:
a
1
=
4
,
a
2
=
5
a_1 = 4, a_2 = 5
a1=4,a2=5
n 1 = 5 , n 2 = 11 n_1 = 5, n_2 = 11 n1=5,n2=11
m 1 = n 2 = 11 m_1 = n_2 = 11 m1=n2=11
m 2 = n 1 = 5 m_2 = n_1 = 5 m2=n1=5
c 1 = m 1 ( m 1 − 1 m o d n 1 ) = 11 ( 1 1 − 1 m o d 5 ) , 其中 11 ⋅ 1 1 − 1 = 1 ( m o d 5 ) , 得 1 1 − 1 = 1 = 11 ( 1 m o d 5 ) = 11 c_1 = m_1(m_1^{-1} \ mod \ n_1) \\ =11(11^{-1} \ mod \ 5),其中 11 \cdot 11^{-1}=1(mod \ 5),得 11^{-1}=1 \\ =11(1 \ mod \ 5)\\ =11 c1=m1(m1−1 mod n1)=11(11−1 mod 5),其中11⋅11−1=1(mod 5),得11−1=1=11(1 mod 5)=11
c 2 = m 2 ( m 2 − 1 m o d n 2 ) = 5 ( 5 − 1 m o d 11 ) , 其中 5 ⋅ 5 − 1 = 1 ( m o d 11 ) , 得 5 − 1 = 9 = 5 ( 9 m o d 11 ) = 45 c_2 = m_2(m_2^{-1} \ mod \ n_2) \\ =5(5^{-1} \ mod \ 11),其中 5 \cdot 5^{-1}=1(mod \ 11),得 5^{-1}=9 \\ =5(9 \ mod \ 11)\\ =45 c2=m2(m2−1 mod n2)=5(5−1 mod 11),其中5⋅5−1=1(mod 11),得5−1=9=5(9 mod 11)=45
a = ( a 1 c 1 + a 2 c 2 ) ( m o d n ) , 其中 n = n 1 n 2 = 5 × 11 = 55 = ( 4 × 11 + 5 × 45 ) ( m o d 55 ) = 269 m o d 55 = 49 a = (a_1c_1+a_2c_2)(mod \ n),其中 n=n_1n_2=5 \times 11=55 \\ =(4 \times 11 + 5 \times 45) (mod \ 55) \\ =269 \ mod \ 55 \\ =49 a=(a1c1+a2c2)(mod n),其中n=n1n2=5×11=55=(4×11+5×45)(mod 55)=269 mod 55=49
关键在于求模逆。其他套公式。
31.5 RSA
构造过程:
- 随机选择两个大素数 p p p 和 q q q, p < > q p<>q p<>q;
- 计算 n = p q n=pq n=pq;
- 选择小的奇整数 e e e,使得 e e e 与 ( p − 1 ) ( q − 1 ) (p-1)(q-1) (p−1)(q−1) 互素;
- 计算 e e e 模 ( p − 1 ) ( q − 1 ) (p-1)(q-1) (p−1)(q−1) 的逆 d d d,即 e d = 1 ( m o d ( p − 1 ) ( q − 1 ) ) ed=1(mod (p-1)(q-1)) ed=1(mod(p−1)(q−1));
- 公布 e , n e,n e,n为RSA的公钥;
- 保存 d , p , q d,p,q d,p,q 为RSA的私钥。
加解密过程:
- 加密: P ( M ) = M e m o d n P(M)=M^e \ mod \ n P(M)=Me mod n; (=C)
- 解密: S ( C ) = C d m o d n S(C)=C^d \ mod \ n S(C)=Cd mod n;
RSA(Rivest-Shamir-Adleman)是一种非对称加密算法,其正确性基础基于数论中两个关键性质:质因数分解困难性和模幂运算的可逆性。
-
质因数分解困难性:RSA的安全性依赖于大整数的质因数分解问题的困难性。给定一个大的合数,将其分解为质数的乘积是一个计算上非常困难的问题,特别是当质数很大时。RSA利用了这一困难性,通过使用大素数进行加密和解密,使得破解者难以找到私钥(包含了质因数)。
-
模幂运算的可逆性:RSA算法中使用了模幂运算,即对一个数进行指数幂运算后再取模的操作。模幂运算具有可逆性,即给定模数、底数和指数,可以通过模幂运算计算出唯一的结果。在RSA中,公钥加密和私钥解密过程都涉及到模幂运算,确保了正确的加密和解密操作。
31.6 素数判定
简单素数测试算法
伪素数测试算法
31.7 MR算法的改进措施和算法复杂性
- 措施1:随机选择若干个基,以减少计算量
- 措施2:在计算 a n − 1 m o d n a^{n-1} \ mod \ n an−1 mod n 过程中,加入合数证人(Witness)的查找
设 n n n 为 β − b i t \beta-bit β−bit 整数,算法需要 O ( s β ) \Omicron(s\beta) O(sβ) 算数运算, O ( β 3 ) \Omicron(\beta^3) O(β3) 位运算。