看了这篇博客才稍微理解http://www.cnblogs.com/frog112111/archive/2012/08/19/2646012.html
感恩。
在此附上自己理解,加深记忆。
扩展欧几里得
基本算法:对于不完全为 0 的非负整数 a,b,必然存在整数对 x,y ,使得 gcd(a,b)=ax+by。(gcd即a,b的最大公约数)
证明:
1. b=0时,gcd(a,b)=a,此时x=1,y=0;
2.设 ax1+by1=gcd(a,b);
bx2+(a%b)*y2=gcd(b,a%b);
(这里穿插欧几里得算法,上面博客有详细解释,这里只写一种。)
————————————————————————————————————————————————————————
基本算法:设a=kb+r,皆为整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd(b,a%b)。
证明:设w为a,b的一个公约数,则w|a(w可以被a整除),w|b;因为r=a-kr,则w|r。
所以,w也是b,r的公约数。
由此 gcd(a,b)=gcd(b,a%b)。
————————————————————————————————————————————————————————
(回归正题)
因为 gcd(a,b)=gcd(b,a%b)
所以 ax1+by1=bx2+(a%b)*y2——>ax1+by1=bx2+(a-b*(a/b))*y2——>ax1+by1=ay2+b*(x2-(a/b)*y2;
得 :x1=y2 y1=x2-(a/b)*y2;
则 x1,y1可由a,b,x2,y2得到。
接着不断递归2的情况,直到出现1时为止。
递归模板:
void gcd(ll a,ll b,ll &d,ll &x,ll &y)
{
if(!b)
{
d=a;
x=1;
y=0;
}
else
{
gcd(b,a%b,d,y,x);
y=y-x*(a/b);
}
}
扩展欧几里得求逆元。如求(a/b)%mod,则求b对mod的逆元,即bx+mody=1,求解出的x即为逆元,(逆元=(x+mod)%mod),则(a/b)% mod=(a* x)%mod。
求解膜线性方程:求解方程 ax≡b (mod n) 相当于求解方程 ax+ ny= b, (x, y为整数),
ax≡b (mod n)的一个解为 x0= x* (b/ d ) mod n,且方程的 d 个解分别为 xi= (x0+ i* (n/ d ))mod n {i= 0... d-1}。
设ans=x*(b/d),s=n/d;方程ax≡b (mod n)的最小整数解为:(ans%s+s)%s;