• 欧几里得算法


    欧几里得算法

    在«几何原本»中,欧几里得提出了用辗转相除的方法求解两个整数(a,b)的最大公约数的算法:

    gcd(a, b)
        if (0 == b) return a
        else return gcd(b, a mod b)
    

    定理:若整数(a,b)的最大公约数为(gcd(a,b)),那么(gcd(a,b)=gcd(b,a\,mod\,b))
    证明:
    (d)表示(a,b)的公约数,那么(d|a)(d|b)
    推出(d|(a\,mod\,b)=a-kb)
    所以((a,b))((b,a\,mod\,b))两者拥有的公约数集合是一样的
    即得证

    算法复杂度

    欧几里得算法最多只会递归(Theta(log n))次,所以完全不用担心爆栈,证明如下:
    引理:设(a>bgeq 1)并且(gcd(a,b))递归调用了(kgeq 1)次,那么(ageq f_{k+2},bgeq f_{k+1}),其中(f_k)表示第(k)项斐波那契数
    证明:
    这里用归纳法证明,当(k=1)时,(bgeq f_2=1,ageq f_3=2)成立
    (k>1)时,(bgeq f_{k+1},a\,mod\,bgeq f_{k})并且(ageq b+(a\,mod\,b)geq f_{k+1}+f_{k}=f_{k+2})
    即得证
    由于(f_kapprox frac{phi^k}{sqrt{5}}),其中(phi=frac{1+sqrt{5}}{2}),是呈几何倍数增长的,所以欧几里得算法复杂度为(Theta(log n))

    扩展欧几里得算法

    当要求解方程(a∗x+b∗y=gcd(a,b))的整数解的时候,只需要扩展一下欧几里得算法就可以得到整数解((x,y))

    exgcd(a, b, &x, &y)
        if (0 == b)
            x = 1 y = 0
            return a
        else
            d = exgcd(b, a % b, &xx, &yy)
            x = yy y = xx - a / b * yy
            return d
    
  • 相关阅读:
    腾讯本月将出QQ for Linux!
    OpenSolaris 初体验
    OpenSolaris 初体验
    简易背单词
    NetBeans 全球翻译团队Tshirt发放~
    上传图片时预览效果
    使用ATL开发ActiveX控件
    Visual Studio 2010 Visual C++ 确定要重新分发的 DLL
    动态链接导入库与静态链接库
    20110413 15:54 利用事件触发实现ActiveX调用js函数
  • 原文地址:https://www.cnblogs.com/HachikoT/p/13849268.html
Copyright © 2020-2023  润新知