zoukankan      html  css  js  c++  java
  • 详解扩展欧几里得算法(扩展GCD)

    浅谈扩展欧几里得(扩展GCD)算法

    本篇随笔讲解信息学奥林匹克竞赛中数论部分的扩展欧几里得算法。为了更好的阅读本篇随笔,读者最好拥有不低于初中二年级(这是经过慎重考虑所评定的等级)的数学素养。并且已经学会了学习这个算法的前置知识:欧几里得算法。

    对于对欧几里得算法还有知识模糊的读者,请不要担心,这里为你准备了前导知识讲解,请移步至本蒟蒻的另两篇博客:

    浅谈GCD

    求最大公约数的方式

    裴蜀定理

    裴蜀定理的概念及证明

    因为翻译版本的不同,这个定理可能还会被叫做贝祖定理、(Bacute{e}zout)定理等。

    裴蜀定理是这样被描述的:

    [forall a,bin Z\,\,,\,\,exists (x,y)in Z ]

    满足:

    [ax+by=gcd(a,b) ]

    文字描述是这样的:对于任意的整数(a,b),都存在一对整数(x,y),使得(ax+by=gcd(a,b))成立。

    证明:

    来看欧几里得算法求解过程的这个函数:

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

    可以看出,这是一个递归求解的函数。在函数递归到最后的时候,存在(b=0),不管(a)是什么,这时显然有一对整数(x=1,y=0)来使得:

    [a imes 1+0 imes 0=gcd(a,0) ]

    (ps:0和任何数的最大公约数都等于原数,可以从最大公约数和约数的定义得知)

    那么,我们通过这个递归的实现过程来进行回溯的模拟。当(b>0),则程序还可以继续往下走:(gcd(b,a\%b)=gcd(a,b))。这时假设存在一对整数(x,y),使得其一定会满足(b imes x+(a\%b) imes y=gcd(b,a\%b)), 因为(a\%b=a-blfloor a/b floor),所以有以下的推导:

    [b imes x+(a\%b) imes y=gcd(b,a\%b)=bx+(a-blfloor a/b floor)y=ay-b(x-lfloor a/b floor y) ]

    这个时候令(x^{'}=y,y^{'}=x-lfloor a/b floor y),再结合一开始的原式子,就得出:

    [ax^{'}+by^{'}=gcd(a,b) ]

    因为欧几里得算法的实现是递归的,而我们已经推出其中一个递归过程的实现,那么其他的递归过程就可以借助数学归纳法,一层层地向上推,必然会得出最终结论。

    证毕。

    裴蜀定理的应用

    裴蜀定理:

    [ax+by=gcd(a,b) ]

    那么可以推出:如果一个数(m)满足:(ax+by=m),那么这个(m)一定是(gcd(a,b))的倍数。

    那么对于一个经典方程(ax+by=1),利用裴蜀定理,我们有:(gcd(a,b)=1),即(a,b)一定互质。


    扩展欧几里得算法

    在介绍扩展欧几里得算法之前,我想首先介绍它的应用:

    1、求解不定方程

    2、求解模的逆元

    3、求解线性同余方程

    为什么它能应用到这几个方面呢?回到裴蜀定理:

    [ax+by=m ]

    对于这个不定方程,如果存在一组合法的解((x,y)),那么一定会有(gcd(a,b)|m),即(m)(gcd(a,b))的倍数。那么现在我不仅想知道到底有没有解,而是想知道在有解的情况下,这个解到底是多少。

    这就是求解不定方程的过程。这个解决的算法就叫做扩展欧几里得算法

    可以发现,我们求解不定方程其实就是要求解一组合法的((x,y)),那么根据裴蜀定理的证明(基于欧几里得算法,采用递归的数学归纳),可以发现(x,y)的互相推导的关系。

    这种采取递归来求解(x,y)的方法就叫做扩展欧几里得算法。

    扩展欧几里得算法的实现:

    先放板子:

    int exgcd(int a,int b,int &x,int &y)
    {
        if(b==0)
        {
            x=1,y=0;
            return a;
        }
        int d=exgcd(b,a%b,x,y);
        int k=x;
        x=y;
        y=k-a/b*y;
        return d;
    }
    

    扩展欧几里得算法的实现基于裴蜀定理的证明。实质上相当于在做欧几里得算法(普通GCD)的时候对不定方程(ax+by=m)(x,y)也做了更改。所以经过扩展欧几里得算法处理过的(x,y)就已经是一组合法的可行解了。

    这里需要注意一个细节,因为扩展GCD需要对(x,y)本身进行修改,所以需要在传参数的时候加取址符,这样能保证被修改。

  • 相关阅读:
    解决方法 svn checkout 更改用户名密码/断网续传
    解决方法 cannot be resolved as a type
    解决方法 Syntax error on token "enum", invalid Expression
    使用笔记 Sublime text 持更
    解决方法 cvs或svn上下载的新项目无build path
    解决方法 卸载jdk以及重新安装jdk
    配置笔记 eclipse, jdk, tomcat, maven, mysql, alt+/
    ubantu配置java环境变量
    写给自己的!
    数据设计模式
  • 原文地址:https://www.cnblogs.com/fusiwei/p/11775503.html
Copyright © 2011-2022 走看看