数论其实很早就有过接触,而且也在数论上栽过跟头,然而这次又重新看数论却是因为一个名词:RSA。RSA这个缩写出现在身份认证的token上,一分钟随机6位数字出来,几乎每个技术公司都在用。偶然间翻开算法导论的时候,发现竟然有讲RSA的原理的,恰好RSA这一节包含在第31章-数论算法中。在翻看《算法导论》原著第31章的时候发现大部分关于数论的概念并不是那么晦涩难懂,反而看译本的时候却感觉难以理解。译者不但将一个简单易懂的概念翻译的及其晦涩,而且在关键的证明步骤中缺少了重要的逻辑暗示,导致证明过程几乎无法被理解。在看了本章的部分内容之后,在这里尝试用简单的话来阐述这些知识。
数论是一门十分优美的纯数学的学科,但是(和最优化理论相比)在很长的历史中没有应用价值。但是今天,数论却被广泛地应用。因为密码学这个应用学科就是建立在数论的中的质数的一些理论上。这些理论的可取之处在于:我们能够很容易找到大质数;安全性在于:两个大质数的乘积很难因数分解。
【定理31.1】除法定理
对于整数 a 和正整数 n ,存在唯一的整数 q 和 r ,满足 0 ≤ r < n,且 a=qn+r。
其中,q 是 a 除以 n 的商,
q=⌊an⌋
。r是a除以n的余数 r = a mod n。n | a 当且仅当 a mod n = 0。这个定理引出概念:模运算、整除。
我们可以使用除以n得到的余数将整数集做划分。整数除以n得到的余数有n种(0,1,2,…,n-1),因此,可以将整数集合划分成n个等价类。等价类其实就是一个整数集的子集。等价类中的全部元素有一个共同的性质,除以n的余数相同。在同余的意义下,同一个等价类的元素是相等的。这是一个更广义的、更弱化的等于的概念。包含a的模n等价类表示为:
等价类可以使用代表元素简化表达:0表示 [0]n ,代表所有除以n余数是0的整数。代表元素是等价类中的最小非负元素。于是 Zn 的简化表达为 Zn={0,1,2,⋯n−1} 。
【定理31.2】最大公约数和两个数的线性组合
a,b 是任意非零整数,则 gcd(a,b) 是集合 {ax+by:x,y∈Z} 中的最小正元素
这个定理很有趣,两个数的最大公约数却是一个集合里的最小正元素。这里的线性组合的系数是在整数集合上的。
证明
设
s
是
先证明
gcd(a,b)⩽s
,再证明
gcd(a,b)≥s
。
设 q=⌊as⌋
amods=a−qs
=a−q(ax+by)
=a(1−qx)+b(−qy)
从上式看出,
amods
也是
a
和
由于余数小于除数, 0≤amods<s 。因为 s∈{ax+by:x,y∈Z} 并且是集合中的最小正元素,对于同样是正整数并且在同一个集合中的 amods 来说,其值只能是0。
因此
a
是
因为
由 gcd(a,b)|a且gcd(a,b)|b ,得到 gcd(a,b)|ax+by.。根据定义, s是 a,b 的线性组合 s∈{ax+by:x,y∈Z} , gcd(a,b)|s 。
gcd(a,b)
是
s
的因子,则
因由夹逼定理有 gcd(a,b)=s 。
【推论31.3】能够整除做大公约数的数
对于任意整数 a,b ,如果 d|a且d|b ,则 d|gcd(a,b) 。
【推论31.4】成倍放大之后的做大公约数
对于任意整数 a,b ,以及任意非负整数n,有 gcd(an,bn)=ngcd(a,b) 。
【推论31.5】两数之积的因子若与一数互质,则是另一个数的因子
对于任意正整数 a,b,n ,如果 n|ab 且 gcd(a,n)=1 , 则 n|b 。
证明思路: gcd(a,n)=1 左右两边放大b倍。借用推论31.4的结论。
【定理31.6】和两个数互质的数也和两数之积互质
对于任意正整数 a,b,p ,如果 gcd(a,p)1 且 gcd(b,p)=1 , 则 gcd(ab,p)=1 。
证明思路: ab和p 的线性组合是1成立。
【定理31.7】能被质数整除的数必有能整除此质数的因子
对于任意整数
a,b
和任意质数
p
,如果
【定理31.8】唯一分解定理
只有一种方法能将合数a写成下面乘积的形式: