算法导论之有关数论的算法
關(guān)于數(shù)論,想到的就是密碼系統(tǒng)和大素?cái)?shù)。大素?cái)?shù)的易求和因子分解的高難度是密碼系統(tǒng)安全性的數(shù)學(xué)基礎(chǔ)。輸入一個大的整數(shù),用位操作次數(shù)來衡量數(shù)論算法的時(shí)間性能。
1)初等數(shù)論概念
關(guān)于整數(shù)集合Z={…,-2,-1,0,1,2,…}和自然數(shù)集合N={0,1,2,…}的初等數(shù)論概念。
第一:整數(shù)性和約數(shù)
一個整數(shù)能被另一個整數(shù)整除,記號為d|a(d整除a),意味著對某個整數(shù)k,有a=kd。如果d|a且d≥0,則說d是a的約數(shù)。
對每個整數(shù)a來說,1和a是其平凡約數(shù),而a的非平凡約數(shù)稱為a的因子。
第二:素?cái)?shù)和合數(shù)
對于某個整數(shù)a>1,如果它僅有平凡約數(shù)1和a,則稱a為素?cái)?shù)或質(zhì)數(shù),素?cái)?shù)有無窮多個。
不是素?cái)?shù)的整數(shù)a>1稱為合數(shù)。當(dāng)然整數(shù)0和所有負(fù)整數(shù)既不是素?cái)?shù)也不是合數(shù)。
第三:余數(shù)和模
對任意整數(shù)a和任意正整數(shù)n,存在唯一的整數(shù)q和r,滿足0≤r<n,并且a=qn+r;其中q就是除法的商,r就是除法的余數(shù)。r=a mod n。
第四:公約數(shù)和最大公約數(shù)
如果d是a的約數(shù)并且也是b的約數(shù),則d是a和b的公約數(shù)。兩個不同時(shí)為0的整數(shù)a和b的最大公約數(shù)表示為gcd(a,b)。對任意整數(shù)x和y,有:
d|a并且d|b蘊(yùn)含著d|(ax+by)
如果a和b是都不為0的任意整數(shù),則gcd(a,b)是a與b的線性組合集合{ax+by:x,y∈Z}中的最小正元素。
對任意整數(shù)a和b,如果d|a并且d|b,則d|gcd(a,b)。
對所有整數(shù)a和b以及任意非負(fù)整數(shù)n,gcd(an,bn)=ngcd(a,b)。
對所有正整數(shù)n,a和b,如果n|ab并且gcd(a,n)=1,則n|b。
第五:互質(zhì)數(shù)
如果兩個整數(shù)a和b僅有公因數(shù)1,即如果gcd(a,b)=1,則a和b稱為互質(zhì)數(shù)。
對任意整數(shù)a,b和p,如果gcd(a,p)=1且gcd(b,p)=1,則gcd(ab,p)=1。
第六:唯一因子分解
這是素?cái)?shù)整除性的一個重要基礎(chǔ)。
對所有素?cái)?shù)p和所有整數(shù)a,b,如果p|ab,則p|a或p|b或者都成立。由此可得唯一質(zhì)因子分解定理。
合數(shù)a僅能以一種方式,寫成如下的乘積形式:
其中pi為素?cái)?shù),p1<p2<…<pr,且ei為正整數(shù)。
如數(shù)6000可以唯一分解為24*3*53
2)最大公約數(shù)
計(jì)算兩個整數(shù)的最大公約數(shù)是數(shù)論的基礎(chǔ)算法,運(yùn)用歐幾里得算法可有效計(jì)算,其運(yùn)行時(shí)間和斐波那契數(shù)存在聯(lián)系。
一般情況下,最大公約數(shù)的求解,可以通過素?cái)?shù)因子分解來完成。假設(shè)正整數(shù)a和b的最大公約數(shù)gcd(a,b):
如果r項(xiàng)不足則使用零指數(shù),使素?cái)?shù)結(jié)合p1,p2,…,pr對于a和b是相同的,容易得出:
然而素?cái)?shù)分解因子的算法是在多項(xiàng)式時(shí)間內(nèi)無法完成的。因此需要通過歐幾里得算法來有效求解。
歐幾理得求解最大公約數(shù)的算法,基于GCD的一個遞歸原理:對任意非負(fù)整數(shù)a和任意正整數(shù)b,有
gcd(a,b)=gcd(b,amod b)
通過遞歸程序來實(shí)現(xiàn)歐幾理得的算法(約公元前300年的幾何原本中描述的):
Func_Euclid(a,b){
??? if b=0
??????? then return a
??? else return Func_Euclid(b,a mod b)
}
歐幾里得算法的運(yùn)行時(shí)間和斐波那契數(shù)有關(guān)聯(lián)。
如果a>b≥1并且Func_Euclid(a,b)執(zhí)行了k≥1次遞歸調(diào)用,則a≥Fk+2,b≥Fk+1。
對任意整數(shù)k≥1,如果a>b≥1并且b<Fk+1,則Func_Euclid(a,b)遞歸調(diào)用次數(shù)少于k次。
推廣歐幾理得算法,求解下列方程式的x和y:
d=gcd(a,b)=ax+by
先看函數(shù):
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’是擴(kuò)展算法的關(guān)鍵,遞歸到最底層時(shí),x=1,y=0,是基礎(chǔ)解。
歐幾理得算法及其推廣形式中很重要的是a mod b的模運(yùn)算。
總結(jié)
以上是生活随笔為你收集整理的算法导论之有关数论的算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java实现算法导论中Miller-Ra
- 下一篇: Java实现算法导论中Pollard的r