一直对拓展欧几里得算法处于不明觉厉的状态
觉得接下来我要好好研究数论,首当其冲的当然就是拓展欧几里得算法啦!
题:求ax+by=c的解。b<=a。
将问题规模变小,令a=kb+d,有(kb+d)x+by=c,亦即b(kx+y)+dx=c。
然而发现b比a小,d比b小,所以问题规模变小了。
因此有代码:
inline int exgcd(int a,int b,int &d,int &x,int &y)
{ if(!b) d=a,x=1,y=0;
else exgcd(b,a%b,d,y,x),y-=(a/b)*x;
}
然后注意到由于初始值x=1,y=0所以这样计算出来的解是ax+by=(a,b)的(x',y')。
然后判断一下(a,b)|c是否成立,不是就无解,否则解(x,y)=(cx'/d,cy'/d),其中d=(a,b)。
例如,在模非质数p的意义下求v的逆元t=inv(v)。
vt=1(mod p)亦即vt+pk=1(注意这里不要写-kp),把t和k看作x,y即可。
由此式可以看出t存在的充要条件是(v,p)=1。
关于拓展欧几里得合并来代替中国剩余定理(CRT)以便把后者扔进垃圾桶。
首先CRT的唯一用处就是这个结论:在模一堆互质的数得到的方程中,解在模模数乘积意义下是有解并且唯一的。
考虑两个方程x=a1 (mod m1) x=a2 (mod m2) , (m1, m2)>=1
那么令m=[m1, m2],那么有x=m1*k1+a1=m2*k2+a2 (mod m)显然成立。
使用欧几里得算法解出这个方程的一个解,就可以知道x在模m意义下的解了。
这个算法可以用来计算形如C(n,m)%P在n,m特别大,且P为质数的若干次方的情况。