扩展欧几里得算法(POJ 1061)

分析可知,该题只需求解同余方程 (x+am) % L=(y+an) % L 最小的a即可。
对方程变形可得 a(mn)+kL=yx , k为一整数
p=mnq=yx ,有: ap+kL=q (1)
(1)式即为扩展欧几里得算法可解的标准方程 ax+by=c ,唯一不同的是扩展欧几里得中 cabgcd(a,b)1q


先用扩展欧几里得求出 ap+kL=gcd(p,L) 的一个解 a0k0 ,那么:
ap+kL=q (1)
a0p+k0L=c=gcd(p,L) (2)
将(1)式两边同除以 c ,有:
a(p/c)+k(L/c)=q/c
由于 c pL,所以 p/cL/c 均为整数,故 q/c 必为整数,否则方程无解。
将(2)式两边同乘以 q/c ,有:
ap+kL=q (1)
(a0q/c)p+(k0q/c)L=q
两式比较,可得: a=a0q/ck=k0q/c (3)


接着由一个特解扩展至解。
(3)式两边同除以 q ,有:a0(p/c)+k0(L/c)=1
p/cL/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 即可。
所以 ak 的解系可以写为: a=(a0+u(L/c))(q/c)k=(k0+v(p/c))(q/c)


接着要求出 a 的最小值。
a=(a0mod(L/c)+(u+a0/(L/c))(L/c))(q/c) (不是很懂哎。。。)
amin=(a0(q/c))mod(L/c)


最后,用扩展欧几里得求解 a0p+k0L=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就是所求解。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值