扩展欧几里得

DLSQS-lkjh / 2023-07-30 / 原文

欧几里得:

1 void gcd(int a, int b) {
2     return gcd(b, a % b);
3 }

扩展欧几里得:

根据裴蜀定理可以求出ax+by=c的直线上的所有整数解。

裴署定理:设a,b是不全为零的整数,则存在整数x,y, 使得ax+by=gcd(a,b) .

存在x和y使得ax+by=gcd(a,b)成立,而根据辗转相除法,方程最终态为a=gcd(a,b),b=0,此时x=1,y=0,将此解迭代回去即可求出x与y的最初解。

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

返回值为a与b的最大公约数