算法之我见 [数论之旅] 扩展欧几里德
对于整数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; }
边完善自己边认识自己