辗转相除法的详细介绍在这里:http://zh.wikipedia.org/wiki/%E8%BC%BE%E8%BD%89%E7%9B%B8%E9%99%A4%E6%B3%95#.E8.B4.9D.E7.A5.96.E7.AD.89.E5.BC.8F
简单来说,就是两个数a跟b的最大公约数gcd(a,b) = gcd(b, a%b),当b=0时,gcd(a,b) = a。
举例来说:
gcd(18,30) = gcd(30, 18) = gcd(18, 12) = gcd(12, 6) = gcd(6, 0) = 6
那么,这个式子永远都是对的吗?我来简单证明一下:
1.首先,必然存在两种情况a>b和a<b,我们先考虑a<b的情况。此时,a%b=a,所以gcd(a,b) = gcd(b,a),这意味着我们只需要考虑a>b的情况。
2.由于该算法分两部分,我们需要单独证明其的正确性:
I.a,b均不为0时:
设a,b的x为a和b的任意一个公约数,则有:
a=a'x
b=b'x
则c=a%b=a-nb(其中n<a/b)=a'x-nb'x=x(a'-nb'),因为n<a/b=a'x/b'x=a'/b',所以n<a'/b'
我们有这个等式c=a%b=a-nb=a'x-nb'x=x(a'-nb'),其中a'为整数,nb'均为整数,且nb'<a,则a'-nb'为大于0的整数。所以:
x也是a%b的约数,也就是说,结论一:a跟b的任意一个公约数均为b跟a%b的公约数。
再设y为b和a%b的任意一个公约数,则用:
b=b'y
c=a%b=c'y
a=nb+c=nb'y+c'y=y(nb'+c'),又因为n,b',c'均为正整数,则可以得出,y为a的约数,且:
结论二:b跟a%b的任意一个公约数均为a跟b的公约数
综合结论一跟结论二: a,b跟b,a%b的公约数集合是一样的,则Z=gcd(a,b)为a,b公约数集合中最大的一个数,则Z肯定在b,a%b的公约数集合中,而且是最大的一个,所以Z=gcd(a,b) = gcd(b, a%b)
II.当b为0时(采用a[x],b[x]及a[x+1],b[x+1]表示父一代a,b及子一代a,b的关系):
当b[x]=0,则可说明a[x-1]%b[x-1]=0,说明a[x-1]是b[x-1]=a[x]的整数倍。显而易见,最后的a=a[x]为a[x-1],b[x-1]的最大公约数。
综上两部分证明,可以得知,辗转相除法求最大公约数是正确的