首页 > 技术文章 > 扩展欧几里得算法

1314cyd 2021-08-23 17:30 原文

扩展欧几里得(求解方程 ax+by=gcd(a,b))  

  1>当 b=0时:ax+by=a 故而 x=1,y=0

  2>当 b≠0时:因为gcd(a,b)=gcd(b,a%b)
          而 bx′+(a%b)y′=gcd(b,a%b)
            bx′+(a−⌊a/b⌋∗b)y′=gcd(b,a%b)
            ay′+b(x′−⌊a/b⌋∗y′)=gcd(b,a%b)=gcd(a,b)
          故而x=y′,y=x′−⌊a/b⌋∗y′

  因此可以采取递归算法 先求出下一层的x′和y′再利用上述公式回代即可

  

#include<bits/stdc++.h>
using namespace std;
int n;
int x, y;
inline int exgcd(int a,int b)
{
    if(b==0)
    {
        x=1,y=0;
        return a;
    }
    else
    {
        int gcd=exgcd(b,a%b);
        int z=x;
        x=y;
        y=z-a/b*y;
        return gcd;
    }
}
int main()
{
    int a,b;
    scanf("%d%d",&a,&b);
    exgcd(a,b);
    printf("%d %d\n",x,y);
    return 0;
}

推荐阅读