算法之我见 [数论之旅] 扩展欧几里德

对于整数a,b。如何得到其线性丢番图方程{ax+by=gcd(a,b)}的解呢,我们可以用扩展欧几里德的方法来做。

ax+by=gcd(a,b)

    =gcd(b,a%b)

b和a%b的线性丢番图方程是

bx'+a%b y'=gcd(b,a%b)

联立起来,a%b用a-a/b*b换,得到

x'=y;

y'=x-a/b*y;

根据这个式子递归直到第二参数为0就是扩展欧几里德了,其返回值是a,b的最大公约数。

代码如下:

#include <iostream>
using namespace std;

int ex_gcd(int a,int b,int &x,int &y){//得到关于a,b的线性丢番图方程的一组解
    if(b==0){
        x=1;
        y=0;
        return a;
    } 
    int xx,yy; 
    int q=ex_gcd(b,a%b,xx,yy); 
    y=xx-a/b*yy;
    x=yy;
    return q;
}

int main(){
    int x,y;
    ex_gcd(9,2,x,y);
    cout<<x<<":"<<y;
    return 0;
} 

 

posted @ 2017-08-30 23:41  哇咔咔咔  阅读(123)  评论(0编辑  收藏  举报