说明:欧几里得算法是用来求两个整数的最大公因数的算法。内容是对于两个整数a和b的最大公因数与b和r(r是a除以b的余数)的最大公因数相等。
设gcd(a,b)代表a和b的最大公因数,则gcd(a,b)=gcd(b,r),其中r表示a除以b的余数。
证明如下:
设c是a和b的最大公因数,即c=gcd(a,b)。则有a=mc,b=nc且m和n互质。
不妨设a=kb+r,r是余数。则r=a-kb=mc-knc=(m-kn)c。
所以gcd(b,r)=gcd(nc,(m-kn)c)=c*gcd(n,m-kn)。
所以,现在只需要证明n与m-kn互质。
使用反证法:假设n和m-kn不互质,则存在公因子d>1使得n=xd,m-kn=yd
此时a=mc=(kn-yd)c=(kxd-yd)c=(kx-y)dc
b=nc=xdc。此时推出dc是a和b的公因数dc>c,这和c是a与b的最大公因数相矛盾,所以假设不成立。
得证。
程序如下:
long gcd(long m,long n)
{
while(n != 0)
{
long rem = m % n;//余数
m = n;
n = rem;
}
return m;
}
这个算法的时间复杂度为O(logN),因为经过两次迭代后,余数小于原始值的一半。(为什么是两次因为,如果m<n,则程序的第一次循环完成m和n互换。)
定理:如果m > n,则m % n < m / 2。
证明:
情况一:n <= m / 2 则此时余数 r < n,所以r< m /2。
情况二:n > m / 2 则此时 m = n + r。即m中最多只含有一个n 所以r = m - n < m / 2。
综上,得证。