歐幾里得算法——計算最大公因數(shù)

計算最大公因數(shù)的歐幾里得算法

最大公因數(shù)

最大公因數(shù),也稱最大公約數(shù),指兩個或多個整數(shù)共有約數(shù)中最大的一個。a,b的最大公約數(shù)記為(a,b)。求最大公約數(shù)有多種方法,常見的有質(zhì)因數(shù)分解法、輾轉(zhuǎn)相除法等等。

歐幾里得算法

歐幾里德算法又稱輾轉(zhuǎn)相除法,是指用于計算兩個正整數(shù)a,b的最大公約數(shù)。應(yīng)用領(lǐng)域有數(shù)學(xué)和計算機兩個方面。計算公式gcd(a,b) = gcd(b,a mod b)。歐幾里得算法在RSA加密算法中有運用。

源碼


//當(dāng)N>M時,第一次循環(huán)之后兩數(shù)將進行交換

int Gcd(int m,int n){

? ? int r;

? ? while(n > 0){

? ? ? ? r = m % n;

? ? ? ? m = n;

? ? ? ? n = r;

? ? }

? ? return m;

}


算法分析

算法通過連續(xù)計算余數(shù),知道余數(shù)是0為止,最后所得的非0余數(shù)就是最大公因數(shù)。例如 M=1989 ,N=1590,則余數(shù)序列為399,393,6,3,0。因而,Gcd(1989,1590)=3,從余數(shù)的序列可知,這是一個快速收斂的算法。要想得出該算法的運行時間,就需要確定余數(shù)序列究竟有多長?不妨大膽的猜測log(N)看似是非常理想的答案,但是余數(shù)序列遞減的規(guī)律并非是按照常數(shù)因子所遞減的,事實上,數(shù)學(xué)家們已經(jīng)證明了,在兩次迭代以后,余數(shù)的值最多是原始值的一半。由此可知,迭代次數(shù)之多是2log(N) = O(logN)從而得到算法的時間復(fù)雜度。下面,我們從數(shù)學(xué)家那里問來了證明過程。

時間復(fù)雜度證明

定理:

如果 M > N ,則 M mod N < M/2

證明:如果 N<=M/2 ,則余數(shù)小于N,故定理在這種情況下成立

如果 N>M/2 ,此時M僅含有一個N,從而余數(shù)為M-N

從上面的例子來看,2logN 大約是20,但是實際上,我們只是運行了7次計算,可能有人會說,這個常數(shù)2不是最好的界限值。事實上,歐幾里得算法的平均時間復(fù)雜度是需要大量的數(shù)學(xué)分析進行證明的,算法迭代的平均次數(shù)是(12ln2lnN)/pi^2+1.47。

有興趣的同學(xué)可以研究一下質(zhì)因數(shù)分解等其他算法哦

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容