标签:
扩展欧几里得挺早就会了,但是当时不会证明,现在可以自己推导出来了,下面说一下推导过程。
首先给你a,b,让你求出一组x,y,满足ax+by=gcd(a,b).这个gcd是很轻松可以得到的,但是x和y呢?其实我们也可以在求gcd的时候顺便得到一组解。
先看看我们是怎么求gcd的:ans=gcd(b,a%b),那么最后一步终止条件是什么呢?是b=0,从这里我们可以发现此时,gcd*x+0*y=gcd,这个时候我们可以看出x和y分别是1和0时肯定满足条件。此时我们就得到了终止条件时候的x和y的值了。但是,每一次相邻的x和y有没有什么关系呢?答案是有的,我们令c=gcd(a,b), ax1+by1=c, 那么下一步就有ax2+(a%b)y2=c, 我们对这一步的公式进行变形。首先可以发现a%b=a-(a/b)*b, 我们带入就得到ax2+(a-(a/b)*b)y2=c, 移项合并后就有ay2+b[x2-(a/b)*y2]=c, 因此,我们发现其实x1=y2,y1=x2-(a/b)*y2, 依靠这种关系,我们就可以得到一组解了。
int e_gcd(long long a,long long b,long long &x,long long &y)
{
if(b==0)
{
x=1;
y=0;
return a;
}
long long ans=e_gcd(b,a%b,x,y);
long long temp=x;
x=y;
y=temp-(a/b)*y;
return ans;
}
当然,我们还要知道怎么得到所有解。这个很容易就可以推导,我直接给出公式: 令A=a/gcd(a,b), B=b/gcd(a,b), 一组解为x0,y0, 则所有解为x=x0+B*t, y=y0-A*t, t为任意整数。
标签:
原文地址:http://www.cnblogs.com/cons/p/5400541.html