分析可知,该题只需求解同余方程(x+am)%L=(y+an)%L最小的a即可。
对方程变形可得
令p=m−n,q=y−x,有:a∗p+k∗L=q (1)
(1)式即为扩展欧几里得算法可解的标准方程a∗x+b∗y=c,唯一不同的是扩展欧几里得中c是两个系数a,b的最大公约数gcd(a,b),而(1)式中q则不能保证。
先用扩展欧几里得求出a∗p+k∗L=gcd(p,L)的一个解a0,k0,那么:
a∗p+k∗L=q (1)
a0∗p+k0∗L=c=gcd(p,L) (2)
将(1)式两边同除以c,有:
由于c是
将(2)式两边同乘以q/c,有:
a∗p+k∗L=q (1)
(a0∗q/c)∗p+(k0∗q/c)∗L=q
两式比较,可得: a=a0∗q/c,k=k0∗q/c (3)
接着由一个特解扩展至解。
(3)式两边同除以q,有:
p/c,L/c互质,将方程变为:
(a0+u∗(L/c))∗(p/c)+(k0+v∗(p/c))∗(L/c)=1,只需u∗(L/c)∗(p/c)+v∗(p/c))∗(L/c)=0即可。
所以a,k的解系可以写为:a=(a0+u∗(L/c))∗(q/c),k=(k0+v∗(p/c))∗(q/c)
接着要求出a的最小值。
amin=(a0∗(q/c))mod(L/c)
最后,用扩展欧几里得求解a0∗p+k0∗L=c=gcd(p,L)
对于a*x+b*y=d;
递归调用时
令a=b;b=a%b;
将其变为形式2) b*x+a%b*y=d;
变形:b*x+a*y-(a/b)*b*y=d;
再变:a*y+b(x-a/b*y)=d; 3)
与2)式比较:b*x+a%b*y=d; 2)
得:
当a=b;b=a%b时:x=y;y=x-a/b*y;
调用过程中的x,y就是对应的a,b的解;
当回到顶层时,a,b就是最初的a,b所以此时的x,y就是所求解。