关于数论,想到的就是密码系统和大素数。大素数的易求和因子分解的高难度是密码系统安全性的数学基础。输入一个大的整数,用位操作次数来衡量数论算法的时间性能。
1)初等数论概念
关于整数集合Z={…,-2,-1,0,1,2,…}和自然数集合N={0,1,2,…}的初等数论概念。
第一:整数性和约数
一个整数能被另一个整数整除,记号为d|a(d整除a),意味着对某个整数k,有a=kd。如果d|a且d≥0,则说d是a的约数。
对每个整数a来说,1和a是其平凡约数,而a的非平凡约数称为a的因子。
第二:素数和合数
对于某个整数a>1,如果它仅有平凡约数1和a,则称a为素数或质数,素数有无穷多个。
不是素数的整数a>1称为合数。当然整数0和所有负整数既不是素数也不是合数。
第三:余数和模
对任意整数a和任意正整数n,存在唯一的整数q和r,满足0≤r<n,并且a=qn+r;其中q就是除法的商,r就是除法的余数。r=a mod n。
第四:公约数和最大公约数
如果d是a的约数并且也是b的约数,则d是a和b的公约数。两个不同时为0的整数a和b的最大公约数表示为gcd(a,b)。对任意整数x和y,有:
d|a并且d|b蕴含着d|(ax+by)
如果a和b是都不为0的任意整数,则gcd(a,b)是a与b的线性组合集合{ax+by:x,y∈Z}中的最小正元素。
对任意整数a和b,如果d|a并且d|b,则d|gcd(a,b)。
对所有整数a和b以及任意非负整数n,gcd(an,bn)=ngcd(a,b)。
对所有正整数n,a和b,如果n|ab并且gcd(a,n)=1,则n|b。
第五:互质数
如果两个整数a和b仅有公因数1,即如果gcd(a,b)=1,则a和b称为互质数。
对任意整数a,b和p,如果gcd(a,p)=1且gcd(b,p)=1,则gcd(ab,p)=1。
第六:唯一因子分解
这是素数整除性的一个重要基础。
对所有素数p和所有整数a,b,如果p|ab,则p|a或p|b或者都成立。由此可得唯一质因子分解定理。
合数a仅能以一种方式,写成如下的乘积形式:
其中pi为素数,p1
2<…
r,且ei为正整数。
如数6000可以唯一分解为24*3*53
2)最大公约数
计算两个整数的最大公约数是数论的基础算法,运用欧几里得算法可有效计算,其运行时间和斐波那契数存在联系。
一般情况下,最大公约数的求解,可以通过素数因子分解来完成。假设正整数a和b的最大公约数gcd(a,b):
如果r项不足则使用零指数,使素数结合p1,p2,…,pr对于a和b是相同的,容易得出:
然而素数分解因子的算法是在多项式时间内无法完成的。因此需要通过欧几里得算法来有效求解。
欧几理得求解最大公约数的算法,基于GCD的一个递归原理:对任意非负整数a和任意正整数b,有
gcd(a,b)=gcd(b,amod b)
通过递归程序来实现欧几理得的算法(约公元前300年的几何原本中描述的):
Func_Euclid(a,b){
if b=0
then return a
else return Func_Euclid(b,a mod b)
}
欧几里得算法的运行时间和斐波那契数有关联。
如果a>b≥1并且Func_Euclid(a,b)执行了k≥1次递归调用,则a≥Fk+2,b≥Fk+1。
对任意整数k≥1,如果a>b≥1并且b<Fk+1,则Func_Euclid(a,b)递归调用次数少于k次。
推广欧几理得算法,求解下列方程式的x和y:
d=gcd(a,b)=ax+by
先看函数:
Func_Extend_Euclid(a,b){
if b=0
then return ( a,1,0)
(d’,x’,y’)= Func_Extend_Euclid(b,a mod b)
(d,x,y)=(d’,y’,x’-(a/b)y’)
return (d,x,y)
}
其中y= x’-(a/b)y’是扩展算法的关键,递归到最底层时,x=1,y=0,是基础解。
欧几理得算法及其推广形式中很重要的是a mod b的模运算。