永世相随一生挚爱。|

永无岛

园龄:5年9个月粉丝:6关注:11

excrt

EXCRT

为了契合整个系统,定义 gcd(x,0)=x

欧几里得算法

证明 gcd(a,b)=gcd(b,a mod b)

  • gcd(a,b)|gcd(b,a mod b):

a mod b=akbgcd(a,b)|agcd(a,b)|bgcd(a,b)|gcd(b,a mod b)

  • gcd(b,a mod b)|gcd(a,b):

a mod b+kb=agcd(b,a mod b)|gcd(b,a mod b)gcd(b,a mod b)|bgcd(b,a mod b)|gcd(a,b)

扩展欧几里得算法

扩展欧几里得算法解决的是这样的二元一次不定方程:ax+by=gcd(a,b)

ax1+by1=gcd(a,b)bx2+(a mod b)y2=gcd(b,a mod b)

由辗转相除法:

ax1+by1=bx2+(a mod b)y2ax1+by1=bx2+(aab×b)y2ax1+by1=ay2+b(x2aby2)

递归求解 bx2+(a mod b)y2=gcd(b,a mod b)。这个递归显然是有边界的,即 b=0,此时 x=1,y=0 即是合法解。递归问题解决之后,当前问题的解就是 x1=y2y1=x2aby2

exgcd

exgcd解决的是这样的二元一次不定方程:ax+by=c

首先由裴蜀定理:gcd(a,b)|c,否则无解。

根据上文,我们已经能解出ax0+by0=gcd(a,b)

那么有:ax0cgcd(a,b)+by0cgcd(a,b)=c。这样我们就找到了一组特解。

接下来考虑通解:

a(x1+db)+b(y1da)=c

因为 da,db 是整数,所以 d 一定是 1gcd(a,b) 的倍数。那么通解就是:

x=x1+bgcd(a,b)ky=y1agcd(a,b)k

这也可以求指定范围解的个数。

CRT/EXCRT

算法流程:每次取出方程组中的两个方程,合并成一个。
如何合并:

{xr1(modm1)xr2(modm2)a=k1m1+r1=k2m2+r2k1m1k2m2=r2r1

用exgcd解这个即可,合并后就是 x(modlcm(m1,m2))

本文作者:永无岛

本文链接:https://www.cnblogs.com/thedreammaker/p/17674996.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   永无岛  阅读(6)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起