• 关于欧几里德算法(gcd)的证明


    求a,b的最大公约数我们经常用欧几里得算法解决,也称辗转相除法,

    代码很简短,

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

    但其中的道理却很深刻,完全理解不简单,以前都只是记一下代码,今天研究了很久,才差不多理解了其中的原因

    从代码可以看出,gcd(a,b)=gcd(b,a%b),关键就在于证明这个等式

    证明如下,

    设c=gcd(a,b),则a=kc,b=nc(n,c为正整数),

    设r=a%b,可得r=a-mb(m为a/b向下取整),

    将a,b代入,得r=kc-mnc=(k-mn)c,

    可证(k-mn)与n互质,过程如下

    反证法,若(k-mn)与n不互质,则存在正整数d(d>1)使得k-mn=xd,n=yd,

    则k=mn+xd=myd+xd=(my+x)d,

    那么a=kc=(my+x)dc,b=nc=ydc,在这里gcd(a,b)变成了dc,而d>1则dc<>c,不成立

    所以k-mn与n互为质数

    接下来令t=k-mn,那么r=tc,可以发现b=nc且n与t互质,那么gcd(b,r)会等于c

    从而得出gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd(b,a%b)的结论

    Hint

    那么为什么不能是gcd(a,b)=gcd(a,r)呢?这个问题其实不难,因为a=kc,无法证明k与k-mn互质

    按照上面的步骤,k-mn=xd,k=yd(d>1),只能得出k=mn+xd=yd,这个式子并没有什么卵用

    可以自己举几个例子试试,

    End

  • 相关阅读:
    无旋转Treap简介
    bzoj 4318 OSU!
    bzoj 1419 Red is good
    bzoj 4008 亚瑟王
    bzoj 1014 火星人prefix
    更多的莫队
    bzoj 3489 A simple rmq problem
    洛谷 2056 采花
    NOIP 2017 游(划水)记
    UVa 11997 K Smallest Sums
  • 原文地址:https://www.cnblogs.com/void-f/p/7695064.html
Copyright © 2020-2023  润新知