欧几里得算法(辗转相除法)

说明:欧几里得算法是用来求两个整数的最大公因数的算法。内容是对于两个整数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

定理:如果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。

       综上,得证。


你可能感兴趣的:(算法导论,欧几里得算法和证明)