zoukankan      html  css  js  c++  java
  • 欧几里得算法(含严谨证明)

    gcd(gong chan dang)(greatest common divisor) 最大公约数,指两个整数所有公共约数中最大的。

    首先先上结论,求最大公约数,我们可以通过递归gcd(a,b)=gcd(b,a%b),gcd(a,0)=a计算,复杂度是logn

    很明显,这个伟大的结论gcd(a,b)=gcd(b,a%b),就是著名的欧几里得公式。

    那么怎么证,其实还挺简单的。我们把证明分为两步骤:

        1、证明gcd(a,b)是b,a%b的一个公约数

        2、证明这个公约数是最大的。

    1、我们设gcd(a,b)=d,再令a=k1*d,b=k2*d.

         我们再设,a=k*b+c(也就是a除以b商k余c),那么c就是余数,也就是a%b.

         讲上面那个式子移项,得到c=a-k*b,然后再把a=k1*d,b=k2*d,这两个式子里的a、b带入式子,得到:

         c=k1*d-k*k2*d,在提取公因数d,得到c=(k1-k*k2)*d.这样就说明,c,也就是a%b有d这个约数,因为开始我们设b也有d这个约数,所以gcd(a,b)是b,a%b的一个公约数。

    2、现在知道了它是一个公约数,那么怎么证它是最大的?(其实感性分析,a%b都变小了,公约数不可能更大呀!)

      但是术学是一门严谨的学科,我们要严谨证明。我们知道,c(a%b)=(k1-k*k2)*d,b=k2*d,我们只需要证明k1-k*k2、k2互质就好了。

          这里可以用到反证法:我们假设k1-k*k2=q*t,k2=p*t,并且t>1(也就是那两个不互质)。

           我们将前面那个式子移项,得到k1=q*t+k*k2,再把这个k1代到最开始的a=k1*d,得到a=(q*t+k*k2)*d,再利用乘法分配律,得到:

       a=q*t*d+k*k2*d,我们这时发现,k2*d不就是最开始的b吗?,将其带入,得到:a=q*t*d+b*d.

         这时,我们再把k2=p*t代入开始的b=k2*d,得到b=p*t*d,再把这个式子代到a=q*t*d+b*d.得到了:a=q*t*d+p*t*d.提取公因数:a=(q+p)*t*d

       现在,再和b=p*t*d比较,发现他们的最大公因数变成了t*d和开始矛盾,所以假设不成立,反证成功!

    好吧,还是贴一下求最大公约数的代码吧

    #include <iostream>
    #include <cstdlib>
    #include <cstring>
    #include <algorithm>
    #define REP(i,k,n)  for(int i=k;i<=n;i++)
    #define in(a) a=read()
    using namespace std;
    inline int read(){
        int x=0,f=1;
        char ch=getchar();
        for(;!isdigit(ch);ch=getchar())
            if(ch=='-')
                f=-1;
        for(;isdigit(ch);ch=getchar())
            x=x*10+ch-'0';
        return x*f;
    }
    inline int gcd(int a,int b){
        if(b==0)  return a;
        return gcd(b,a%b);
    }
    int main(){
        int a,b;
        in(a),in(b);
        cout<<gcd(a,b);
    }
  • 相关阅读:
    数据结构之利用递归解决八皇后问题
    SpringBoot注解大全
    shiro框架中出现的错误There was an unexpected error (type=Unauthorized, status=401).
    shiro权限控制
    shiro的整合“心路历程”
    _T宏的使用
    根据文件的路径 分割文件名 文件后缀
    将选中的图片文件以图片形式 (显示在对话框内)或(直接发送出去)
    对话框内粘贴图片文件会直接发送,改为粘贴图片后直接将图片显示在对话内。
    数据库按日期查询,右侧日期内的数据无法现实问题。
  • 原文地址:https://www.cnblogs.com/jason2003/p/9797750.html
Copyright © 2011-2022 走看看