对于扩展欧几里得算法的小总结

对于不定方程\(ax+by=c\)有正数解的充分必要条件是\(c|gcd(a,b)\),证明请看裴蜀定理
那么显然的,我们只要能解出方程\(ax+by=gcd(a,b)\)然后把解\(\times \frac{c}{gcd(a,b)}\)即可
如何解这个新的方程呢?我们知道\(gcd(a,b)\),并且它等于\(gcd(b,a\%b)\),也就是说,方程
\(bx+(a\%b)y=gcd(b,a\%b)\)和它同解,那么我们就对问题进行了转化,并且可以发现到最后方程将变为
\(gcd(a,b)x+0*y=gcd(a,b)\),显然有解。
那么怎么根据解往回推呢?
\(a\%b\)$ =a $ \(- \lceil \frac{a}{b}\rceil\times b\),将这个代入,可以得到\(ax+by=ay+b(x-\lceil \frac{a}{b}\rceil*y)\)
然后就可以层层递推了。


#include<stdio.h>
long long x,y;
long long exgcd(long long a,long long b,long long *x,long long *y){
    if(b==0){
        *x=1;
        *y=0;
        return a;
    }
    long long temm=exgcd(b,a%b,x,y);
    long long tem=*x;
    *x=*y;
    *y=tem-(a/b)*(*y);
    return temm;
}
long long a,b;
int main(){
    scanf("%lld%lld",&a,&b);
    printf("%lld",exgcd(a,b,&x,&y));
    printf(" = %d*(%d) + %d*(%d)",a,x,b,y);
    return 0;
}

posted @ 2023-11-04 17:54  Simex  阅读(3)  评论(0编辑  收藏  举报