展轉相除求最大公約數

求最大公約數的最經常使用的算法是歐幾里得算法,也稱爲展轉相除法。問題定義爲求i和j的最大公約數gcd(i,j),其中i和j是整數,不妨設i>j。
算法能夠遞歸的表示:
1. 若是j能整除i,那麼gcd(i,j)=j;算法

2. j不能整除i,令r=i%j,那麼gcd(i,j)=gcd(j,r)。spa

C實現

int gcd(int i, int j)
{
    int r = i % j;
    return r == 0 ? j : gcd(j, r);
}

分析

算法的步驟1,顯然成立(最大公約數定義);code

要證實步驟2:blog

設d是i和j的最大公約數,
那麼i=md,j=nd,m和n互質(不然d不是最大公約數)。
由r=i%j能夠獲得i=kj+r,k=⌊m/n⌋,k≥1(咱們前面假設過i>j)。
把i=md,j=nd代入獲得
md=knd+r
那麼
r=(m-kn)d
m-kn和m也是互質的。
因此獲得d是j和r的最大公約數。

時間複雜度分析:
逆着看該算法,最後的餘數是0,倒數第二次餘數是d,倒數第三次是kd,k>1…
因爲組成了一個數列,{0,d,kd,nkd+d,…}
數列的n項加上n+1項,比n+2項要小,因此比斐波納契數列增加的要快。
咱們已知斐波納契數列增加速度是指數,那麼待分析的數列也是指數增加。
設歐幾里得算法須要k次,那麼j=O(2^k),則k=O(lg j)。遞歸

因此歐幾里得算法求最大公約數的時間複雜度是對數量級的,速度很是快。
相關文章
相關標籤/搜索