有关数论的算法
数论算法研究的是一些大整数,所以需要考虑输入规模和基本算数的运算代价。对于数论算法来说,衡量其所要求的位操作的次数是比较适宜的。在这种模型中,进行两个b位(二进制位)的数乘法,需要进行O(b2)次位操作,在实际操作中,O(b2)算法通常是最好的,我们将用这个界作为分析的基础。
1. 初等数论的概念
a. 整除性和约数
一个正整数a总可以被其平凡约数1和a整除,其非平凡约数称为因子。比如,20的平凡约数是1和20,非平凡约数是2,4,5,10。
b. 素数和合数
对于任意一个整数 a>1, 如果只有1和a两个平凡约数,则称为素数(或者质数)。如果a>1且不是素数,则它是合数。1既不是素数也不是合数,称为基数。
c. 除法定理,余数和同模
【除法定理】对于任意整数a和任意正整数n,存在整数q和r,满足 0≤r<n,并且 a =q*n+r.
其中 q=floor(a/n)称为除法的商,值r = a mod n称为除法的余数。
根据除法所得的n个余数(0~n-1),可以将整数分成n个等价类。
d. 公约数与最大公约数
如果 d|a 并且 d|b, 则称d是a和b的公约数。
d|a 且 d|b, 则 d|(a+b), d|(a-b)
更一般的,d|a 且 d|b, 则 d|(ax + by)
两个不同时为0的整数a和b,记gcd(a,b)为其最大公约数, 如果a,b都不为0,则 gcd(a,b)是在[1, min(|a|,|b|)]内的一个数。
如果定义gcd(0,0)=0,则最大公约数具有以下性质:
gcd(a,b)=gcd(b,a)
gcd(a,b)=gcd(-a,b)
gcd(a,b)=gcd(|a|,|b|)
gcd(a,0)=|a|
gcd(a,ka)=|a|
【定理】a,b是不都为0的整数,则gcd(a,b)是线性组合{ax+by}中的最小正元素。
【推1】d|a且d|b, 则d|gcd(a,b)
【推2】gcd(an, bn) = n gcd(a,b)
【推3】d|ab, gcd(d,a) = 1, 则 d|b
e. 互质数
若a!=b, gcd(a,b)=1则称为a与b为互质数
【定理】对任意整数a,b,p,如果gcd(a,p)=1且gcd(b,p)=1, 则gcd(ab,p)=1
f. 唯一因子分解
【定理】p为素数,p|ab,则p|a或者p|d
【唯一因子分解定理】合数a仅能以一种方式写成如下形式
a=p1e1p2e2p3e3… 其中pi是素数,ei是正整数。
2. 最大公约数
根据gcd(a,b)=gcd(|a|,|b|),最大公约数问题可以只在0和正整数范围内讨论。
欧几里得算法是计算两个整数最大公约数的一个有效算法,该算法基于以下定理。
a. GCD递归定理
【定理】对于任意整数a>=0 和任意整数b>0, gcd(a,b)=gcd(b, a mod b)
b. 欧几里得算法
欧几里得算法是上面定理的一个递归过程,其输入a和b均为非负整数。
EUCLID(a, b)
If (b == 0)
returna;
else
return EUCLID(b, a mod b)
c. 欧几里得算法的运行时间
【引理】如果a>b>=1,并且欧几里得算法执行了k>=1次递归调用,则 a >= Fk+2,b >= Fk+1
【定理】对任意整数k>=1, 如果a>b>=1, 且 b<=Fk+1, 则EUCLIK(a,b)的调用次数小于k次
如果a,b是两个连续的斐波那契数,则运行时间达到上述定理的上界。
【Q】所有斐波那契额数都互质?
d. 扩展欧几里得算法
前面提到gcd(a,b)是线性组合ax+by中最小的正元素,可以将欧几里得算法做一扩展,在得到gcd(a,b)的同时,也得到x,y的值。
EX-EUCLID(a, b)
If (b == 0)
return(a,1,0); // a = a*1 +b*0
else
(d1,x1,y1) = EX-EUCLID(b, a%b);
(d,x,y) = (d1,y1, x1 – a/b * y1);
return (d,x,y)
一个运算过程的例子如下:
a b x y 2 0 1 0 10 2 0 1 12 10 1 -1 22 12 -1 2 78 22 2 -7 100 78 -7 9 |
最后的结果是gcd(100,78) = 2 = 100*(-7) + 78*9
【ex_auclid算法可用来求模倒数】
3. 模运算
4. 求解模线性方程
5. 中国余数定理
6. 元素的幂
7. RSA公钥加密系统
8. 素数的测试
9. 整数的因子分解