数论算法学习初步 - 《算法导论第三十一章》 基础数论概念
今天开始学习一下算导上的数论算法,做一点笔记。
一些符号约定:
d|a 表示d整除a, 模n的等价类 [a]n= {a+kn: k属于Z}, 模n的完全剩余系则是这些等价类的集合 Zn ={[a]n:0≤a≤n-1}
,每个等价类都用最小的非负元素来表示则有 Zn={0,1,..,n-1}
公约数和最大公约数
a和b的公约数d的定义: d|a 且 d|b。
重要性质: d是a和b公约数 → d|(a+b)且d|(a-b)。可以推广到a和b的线性组合d | (ax+by),x,y是整数。
gcd(a,b)表示最大公约数。定义gcd(0,0) = 0(可以使得基本性质普遍成立
基本性质,比较简单,略
定理:a和b不全为0,gcd(a,b)是{ax+by: x,y 属于Z}中的最小元素。
证明思路:最小的线性组合用s表示,证明s≥gcd(a,b) 和 gcd(a,b)≥s。
1)gcd(a,b)≥s。 只需证明s是a和b的公约数,q = a/s, a%s = a - qs = a - q(ax+by) = a(1-qx) + b(-qy)。
a%s是a和b的线性组合,s又是线性组合最小的正数,0≤a%s<s → a%s = 0,也就是说s | a。同样可以证明 s | b。
2)s≥gcd(a,b)。s是a和b的线性组合,由公约数的重要性质,gcd(a,b)|s,且s>0 → gcd(a,b)≤s
推论: 1.gcd(a,b)是线性组合,所以a和b的任意公约数d,满足d | gcd(a,b)
2.gcd(an,bn) = n gcd(a,b)。 gcd(an,bn) = min({anx+bny: x,y 属于整数}) = n min({anx+bny: x,y 属于整数}) = n gcd(a,b)
3.对于任意整数n, a和b,如果n|ab且gcd(a,n) = 1,则 n | b。
(这个证明是我自己想哒,可能有不严谨的地方。k = ab/n,gcd(a,n) = ax + ny = 1 ,两边乘上k ,akx + aby = ab/n,kx + by = b/n。左边一定是个整数,得到 b/n是整数,所以n | b。我觉得把a,b,n分解了也可以证明,但是似乎没怎么用上定理
互质数
gcd(a,b) = 1称a和b为互质数。
定理:整数a,b,p, gcd(a,p) = 1 且 gcd(b,p) = 1,那么 gcd(ab,p) = 1。
证明思路:利用之前的结论拆成线性组合做运算 (拆成线性组合对证明太有用辣
ax + py = 1, bx′ + py′ = 1, 两式相乘整理ab(xx′) + p(ybx′ + y′ax + pyy′) = 1。找到ab 和 p的最小正线性组合 = gcd(ab,n) = 1。
两两互质,n1, n2 , ... , nk, 对于任意i ≠ j, 有 gcd(ni,nj) = 1,称n1, n2 , ... , nk两两互质
唯一因子分解定理
定理:任意素数p,和任意整数a,b, p|ab → p|a 或 p|b。 反证,p的约数只有1和p,如果p¦a且p¦ b,那么gcd(a,p) = gcd(b,p) = 1,推出gcd(ab,p) = 1
而p | ab 可推出 gcd(ab,p) = p。
定理:唯一因子分解定理, 合数a的质数分解式唯一。
转自Matrix大神的证明:http://www.matrix67.com/blog/archives/495
为了真正地证明,分解质因数的方法是唯一的,我们将再次用到反证法。假设存在某些数,它们有至少两种分解方法。那么根据上文提到的“非空正整数集里存在最小的元素”,一定有一个最小的数M,它能用至少两种方法表示成质数的乘积:
M = P1 * P2 * … * Pr = Q1 * Q2 * … * Qs
下面我们将看到,这种假设会推出一个多么荒谬的结果来。不妨设P1 <= P2 <= … <= Pr, Q1 <= Q2 <= … <= Qs。显然,P1是不等于Q1的,不然两边同时约掉它,我们就得到一个更小的有两种分解方法的数。不妨设P1 < Q1,那么我们用P1替换掉等式最右边中的Q1,得到一个比M更小的数T = P1 * Q2 * Q3 * … * Qs。令M’ = M – T,我们得到M’的两种表达: M’ = (P1 * P2 * … * Pr) – (P1 * Q2 * … * Qs) = P1 * (P2 * .. * Pr – Q2 * … * Qs) …… (1) M’ = (Q1 * Q2 * … * Qs) – (P1 * Q2 * … * Qs) = (Q1 – P1) * Q2 * … * Qs ……………… (2) 由于T比M小,因此M’是正整数。从(1)式中我们立即看到,P1是M’的一个质因子。注意到M’比M小,因此它的质因数分解方式应该是唯一的,可知P1也应该出现在表达式(2)中。既然P1比所有的Q都要小,因此它不可能恰好是(2)式中的某个Q,于是只可能被包含在因子(Q1-P1)里。但这就意味着,(Q1-P1)/P1除得尽,也就是说Q1/P1-1是一个整数,这样Q1/P1也必须得是整数。我们立即看出,P1必须也是Q1的一个因子,这与Q1是质数矛盾了。这说明,我们最初的假设是错误的。
练习
概述,部分条件已省略
1. a+b % a = a+b - floor((a+b)/a)*a = b
2. 反证, 假设 pk是最大的素数...
3. b = k a, c = q b → c = kq a
4.gcd(k,p) | k, gcd(k,p) ≤ k < p → gcd(k,p) = 1
5. 公约数和最大公约数的推论3
6.这个练习好像可以是证明lucas定理中一个条件。
需证:(a+b)p=ap+bp mod p。
二项式展开就好,条件已经给了:0<k<p, p|C(p,k)。
7. x mod b = x - floor(x/b) b , ( x mod b) mod a = x - floor(x/b) b - floor ( ( x - floor(x/b) b )/ a ) a。 [1]
假设b = k a, 那么 ( x - floor(x/b) b )/ a = x/a - floor(x/b) k , 式[1] = x - floor(x/b) - floor( x/a ) + floor(x/b) = x mod a
9.10.11. (证明。。。
-------------------下面有些的题要写算法-------------------(待解决,不会
8. k > 0, ak= n,称n是一个k次幂。如果k > 0, n > 1是k次幂,称n是非平凡幂。如何在β的多项式时间判断β位整数n是否为平凡幂。
12.设计计算β位整数除以短整数的高效算法,Θ(β2)
13.2进制转10进制。证明:如果长度β的乘除法的运算时间为M(β),那么2进制转10进制Θ(M(β)logβ)。
(似乎是分治,T(n) = T(n/2) + ΘM(β) ≈ Θ(M(β)logβ)。