分析可知,该题只需求解同余方程
(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就是所求解。