計算最大公因數的歐幾里得算法

計算最大公因數的歐幾里得算法

最大公因數
最大公因數,也稱最大公約數,指兩個或多個整數共有約數中最大的一個。a,b的最大公約數記爲(a,b)。求最大公約數有多種方法,常見的有質因數分解法、展轉相除法等等。算法

歐幾里得算法
歐幾里德算法又稱展轉相除法,是指用於計算兩個正整數a,b的最大公約數。應用領域有數學和計算機兩個方面。計算公式gcd(a,b) = gcd(b,a mod b)。歐幾里得算法在RSA加密算法中有運用。加密

源碼code

//當N>M時,第一次循環以後兩數將進行交換
int Gcd(int m,int n){
    int r;
    while(n > 0){
        r = m % n;
        m = n;
        n = r;
    }
    return m;
}

算法分析
算法經過連續計算餘數,知道餘數是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。數學

有興趣的同窗能夠研究一下質因數分解等其餘算法哦循環

相關文章
相關標籤/搜索