扩展欧几里得

来源:互联网 发布:java编程视频教程 编辑:程序博客网 时间:2024/06/13 07:30

欧几里得定理: gcd(a, b) = gcd(b , a%b)
当知道这个定理,求解最大公因数就可以用递归函数轻松求解。
当知道这个定理有什么用呢?

现在若要求 a*x+b*y=gcd(a,b)的通解,已知一组特解(x0,y0),那么通解就可以用这组特解表示:x=x0+(b/gcd)*t
y=y0-(a/gcd)*t
那么现在问题就是找到这组特解,一个最简单的方法就是遍历了,只要找到一组便找到所有的解了。但是显然这种方法耗时长。
方法:
a*x+b*y=gcd
b*x1+(a%b)y1=gcd=b*x1+(a-a/b*b)y1=a*y1+b*(x1-a/b*y1)
………
gcd*1+0*0=gcd
那么 x=y1,y=x1-a/b*y1,最终x=1,y=0。利用这组关系便可以利用递归函数求出一组特解;
代码段:
int e_gcd(int a,int b,int &x,int &y)//求得使得ax+by=gcd,最后的x,y即为一个特解
{
if(b==0)
{
x=1;
y=0;//此时对应的a就是最大公因数
//cout<<x<<" "<<y<<endl;
return 0;
}
e_gcd(b,a%b,x,y);
int temp=x;//这里尤其需要注意!!!
x=y;
y=temp-a/b*y;
//cout<<x<<" "<<y<<endl;
}

例题:

原创粉丝点击