求最大公約數gcd算法

求兩個正整數a,b最大公約數方法較常用的是歐幾里得提出的輾轉相除法
假設a=b*k+r …….(1),則gcd(a,b)=gcd(b,r)…….(2);
證明:
設c=gcd(a,b),則a=c*n, b=c*m
根據上式(1)
r=a-b*k=c*n-c*m*k=(n-m*k)*c
此時需要證明c=gcd(b,r),由於b=c*m,r=c*(n-m*k),所以只需要證明m與n-m*k互爲質數即可。
假設 m=k’x, 則 n-m*k=k’*y 則 n=m*k+k’*y=k’*x*k+k’*y=k’(x*k+y),
則 a=c*n=c*k’*(x*k+y), b=c*m=c*k’*x 因此gcd(a,b)=c*k’>c 與gcd(a,b)=c矛盾,所以m與n-m*k互爲質數
結論:gcd(a,b)=gcd(b,r)

代碼:

int gcd(int a,int b){
    int r=a%b;
    return r==0 ? b : gcd(b,r);
}

時間複雜度爲O(log N),以下爲分析:
兩次迭代後,問題的規模會變爲初始的一半
假設初始序列爲n0,m0(n0>m0),每次迭代的序列分別爲n1,n2,n3….. m1,m2,m3……
2k次迭代後則滿足n2k

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章