如果不理解欧几里德,请参考一下blog
欧几里德
扩展欧几里德
结论:ax+by=gcd(a,b),一定有解
或
若ax+by=c有解,设t=gcd(a,b),则c%t=0。
证明: 1.设ax+by=t,当b=0时,t=a(为什么?因为gcd算法,if(b==0) return a;),则有ax=a,易得x=1.
2.设ax1+by1=gcd(a,b),bx2+(a%b)y2=gcd(b,a%b);由于gcd(a,b)=gcd(b,a%b),联立有:ax1+by1=bx2+(a%b)y2。
3.a%b=a-floor(a/b)b;(floor表示向下取整)。
4.将3的结论带入2的等式:ax1+by1=bx2+[a-floor(a/b)b]y2;
5.将a,b示为未知数:整理等式:ax1+by1=ay2+[x2-y2*floor(a/b)]*b;
6.由5的等式:x1=y2, y1=x2-(a/b)*y2;(计算机整数除法为向下取整);
则得到扩展欧几里得递归做法(实质为层层迭代,当b=0时,x=1,然后往上迭代)
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 temp=y; //把x y变成上一层的
y=x-(a/b)*y;
x=temp;
return r; //得到a b的最大公因数
}