計算最大公因數的歐幾里得算法
最大公因數
最大公因數,也稱最大公約數,指兩個或多個整數共有約數中最大的一個。a,b的最大公約數記為(a,b)。求最大公約數有多種方法,常見的有質因數分解法、輾轉相除法等等。
歐幾里得算法
歐幾里德算法又稱輾轉相除法,是指用於計算兩個正整數a,b的最大公約數。應用領域有數學和計算機兩個方面。計算公式gcd(a,b) = gcd(b,a mod b)。歐幾里得算法在RSA加密算法中有運用。
源碼
1 //當N>M時,第一次循環之后兩數將進行交換 2 int Gcd(int m,int n){ 3 int r; 4 while(n > 0){ 5 r = m % n; 6 m = n; 7 n = r; 8 } 9 return m; 10 }
算法分析
算法通過連續計算余數,知道余數是0為止,最后所得的非0余數就是最大公因數。例如 M=1989 ,N=1590,則余數序列為399,393,6,3,0。因而,Gcd(1989,1590)=3,從余數的序列可知,這是一個快速收斂的算法。要想得出該算法的運行時間,就需要確定余數序列究竟有多長?不妨大膽的猜測log(N)看似是非常理想的答案,但是余數序列遞減的規律並非是按照常數因子所遞減的,事實上,數學家們已經證明了,在兩次迭代以后,余數的值最多是原始值的一半。由此可知,迭代次數之多是2log(N) = O(logN)從而得到算法的時間復雜度。下面,我們從數學家那里問來了證明過程。
時間復雜度證明
定理:
如果 M > N ,則 M mod N < M/2
證明:如果 N<=M/2 ,則余數小於N,故定理在這種情況下成立
如果 N>M/2 ,此時M僅含有一個N,從而余數為M-N<M/2 ,定理成立。
從上面的例子來看,2logN 大約是20,但是實際上,我們只是運行了7次計算,可能有人會說,這個常數2不是最好的界限值。事實上,歐幾里得算法的平均時間復雜度是需要大量的數學分析進行證明的,算法迭代的平均次數是(12ln2lnN)/pi^2+1.47。
有興趣的同學可以研究一下質因數分解等其他算法哦