對於擴展歐幾里得算法的小總結

對於不定方程\(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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章