首先看下辗转相除法的递归及非递归代码实现:
//递归实现
int gcd(int a,int b) {
return b?gcd(b,a%b):a;
}
//非递归实现
int gcd(int a,int b)
{
int t;
while(b)
{
t = a;
a = b;
b = t%b;
}
return a;
}
其实从递归代码不难看出只要证明gcd(a,b) = gcd(b,a%b)取余即可。
我们知道有这样一个等式:a = b*q+r,那么r = a-b*q = d(m-n*q),所以显然a,b的最大公约数d也是r的因数,所以b,r 必有一个约数d,那么为什么d一定是b,r的最大公约数呢?
回过头来看a = b*q+r,我们可以采用反证法,假设存在D>d为b,r的公约数,那么显然a,b的最大公约数就变为D了,与a,b的最大公约数为d矛盾,所以b,r的最大公约数也为d.这样正如上面所示通过递归就很容易实现相应算法了。
下面我们再来看下辗转相除法的时间复杂度。
网上查了下时间复杂度为log2(n),不过证明好像挺麻烦的,对于我这种数学渣渣,,,更是如此。。。
下面证明转载自:http://blog.sina.com.cn/s/blog_647d97b10100lf7k.html
注:如有侵权联系我删除
如果有大神有更容易理解的证明,欢迎提出交流。