前面一篇文章中我说了有一种叫做辗转相除的算法,今天做哦题目的时候又看到了一种新的算法(毕竟萌新)。
回归正题,今天我介绍的是扩展欧几里得算法,他能在求出两个整数a,b的最大公约数的同时,求出满足方程(a*x+b*y=gcd(a,b))的一组解(x,y);
原理:
根据欧几里得算法:
gcd(a,b)=gcd(b,a mod b);
由于a*x+b*y=gcd(a,b)
所以我们有:
b*x1+(a mod b)*y1=gcd(b,a mod b);
化简得到:
=a*y1+b*(x1-a/b*y1);
所以我们有:
x=y1;
y=x1-a/b*y1;
自然想到,这是一个递归调用的问题。
下面是一个网上流行版本的扩展欧几里得算法模板:
int exgcd(int a,int b,int &x,int &y){
if(b==0){
x=1;
y=0;
return a;
}
int r=exgcd(b,a%b,x,y);
int t=x;
x=y;
y=t-a/b*y;
return r;
}