欧几里德算法

扩展欧几里德算法

先介绍什么叫做欧几里德算法

    有两个数 a b,现在,我们要求 a b 的最大公约数,怎么求?枚举他们的因子?

gcd(a, b) = gcd(b , a%b) ,这样,我们就可以在几乎是 log 的时间复杂度里求解出来 a 和 b 的最大公约数了,这就是欧几里德算法,

  用 C++ 语言描述如下:

int gcd(int a ,int b){
    if(b==0) return a;
    else return gcd(b,a%b);
}

 

为了介绍扩展欧几里得,我们先介绍一下贝祖定理:

即如果a、b是整数,那么一定存在整数x、y使得ax+by=gcd(a,b)。

换句话说,如果ax+by=m有解,那么m一定是gcd(a,b)的若干倍。(可以来判断一个这样的式子有没有解)

所以,扩展欧几里得

        当到达递归边界的时候,b==0,a=gcd(a,b) 这时可以观察出来这个式子的一个解:a*1+b*0=gcd(a,b),x=1,y=0,

注意这时的a和b已经不是最开始的那个a和b了,所以我们如果想要求出解x和y,就要回到最开始的模样。

int exgcd(int a,int b,int &x,int &y)//扩展欧几里得算法
{
    if(b==0)
    {
        x=1;y=0;
        return a;  //到达递归边界开始向上一层返回
    }
    int r=exgcd(b,a%b,x,y);
    int temp=y;    //把x y变成上一层的
    y=x-(a/b)*y;
    x=temp;
    return r;     //得到a b的最大公因数
}

 

posted @ 2020-10-20 21:38  图神经网络  阅读(221)  评论(0编辑  收藏  举报
Live2D