数论—扩展欧几里得

ps:自用,自己看着方便留着的记录,部分定理直接引用详细证明没有写。

扩展欧几里得算法

找出一对整数((x,y))​使得 (ax+by=gcd(a,b)) 假设(a>=b)

代码:版本一
void exgcd(int a,int b,int &d,int &x,int &y){
    if(!b){d=a,x=1,y=0;}
    else {exgcd(b,a%b,d,y,x);y-=(a/b)*x;}
}
代码:版本二
int exgcd(int a,int b,int &x,int &y){
    if(!b){
        x=1,y=0;
        return a;
    }
    int d=exgcd(b,a%b,x,y),t=x;
    x=y,y=t-a/b*y;
    return d;
}
证明:
  • (b=0)时,(x=1,y=0)成立

  • (ax+by=gcd(a,b)=gcd(b,a\,Mod\,b)=bx’+(a\,Mod\,b)y’)

    (ax+by=bx'+(a\,Mod\,b)y'=bx'+(a-lfloor{a/b} floor *b)y')

    (ax+by=ay'+b(x'-lfloor{a/b floor}*y'))

    整理可得

    [egin{cases} x=y'\ y=x'-lfloor a/b floor *y' end{cases} ]

其中(x'\,y')是方程进一步转换后的结果,一直计算到(b=0)时即可得出解,此时回代即可。

(x,\,y)可由(x',y')得出则可以参考贝祖定理。

贝祖定理(裴蜀定理)

在数论中,裴蜀定理是一个关于最大公约数(或最大公约式)的定理,裴蜀定理得名于法国数学家艾蒂安·裴蜀。

裴蜀定理说明了对任何整数 a、b和它们的最大公约数 d ,关于未知数x以及 y 的线性的丢番图方程(称为裴蜀等式)

若a,b是整数,且gcd(a,b)=d,那么对于任意的整数x,y,ax+by都一定是d的倍数,特别地,一定存在整数x,y,使ax+by=d成立。

它的一个重要推论是:a,b互质的充分必要条件是存在整数x,y使ax+by=1.

有代码得出的(x,y)为方程的其中一组解,如果记为(x_0,y_0)后可推导出通解为

[egin{cases} x=x_0+k*b\ y=y_0-k*a\ k∈Z end{cases} ]

而对于(ax+by=t(其中t为gcd(a,b)的倍数))的解则是在(x_0,y_0)的基础上乘上相应的倍数。

原文地址:https://www.cnblogs.com/cly1231/p/14968980.html