扩展欧几里得算法

1|0扩展欧几里得算法

1|1裴蜀定理(Bézout's lemma)

1|0定义

a,b 是不全为零的整数,对任意整数 x,y,满足 gcd(a,b)ax+by,且存在整数 x,y, 使得 ax+by=gcd(a,b).

1|0证明

对于第一点

由于 gcd(a,b)a,gcd(a,b)b

所以 gcd(a,b)ax,gcd(a,b)by,其中 x,y 均为整数

因此 gcd(a,b)ax+by

对于第二点

在欧几里得辗转相除求 gcd的最后一步,即 b=0 时:

显然有一对整数 x=1,y=0,使得 a×1+0×0=gcd(a,0)

b>0,则 gcd(a,b)=gcd(b,amodb)

假设存在一对整数 x,y,满足 b×x+(amodb)×y=gcd(b,amodb)

因为 bx+(amodb)y=bx+(aba/b)y=ayb(xa/by)

所以令 x=y,y=xa/by,就得到了ax+by=gcd(a,b)

对上述过程用数学归纳法,得证。

1|0扩展欧几里得算法

由上述证明可以推出如何求 x,y

int exgcd(int a,int b,int &x, int &y) { if (b == 0) {x = 1, y = 0; return a;} int d = exgcd(b, a % b, x, y); int z = x; x = y; y = z - y * (a/b); return d; }

定义变量 d,x0,y0,调用 d = exgcd(b, a % b, x, y);。注意在上述代码中,x0,y0 是以引用方式传递的。上述程序求出方程 ax+by=gcd(a,b) 的一组特解 x0,y0,并返回 a,b 的最大公约数 d

对于更为一般的方程 ax+by=c,它有解当且仅当 d|c。我们可以先求出 ax+by=d 的一组特解 x0,y0,然后令 x0,y0 同时乘上 c/d,就得到了 ax+by=c 的一组特解 (c/d)x0,(c/d)y0

事实上,方程 ax+by=c 的通解可以表示为:

x=cdx0+kbd,y=cdy0kad(k\Z)

其中 k 取遍整数集合,d=gcd(a,b)x0,y0ax+by=gcd(a,b) 的一组特解。

1|2乘法逆元

若整数 b,m 互质,并且 ba,则存在一个整数 x,使得 a÷ba×xmodm。称 xbm 乘法逆元,记为 b1modm

因为

a÷ba×b1a÷b×b×b1modm

所以

b×b11modm

如果 m 是质数(此时用符号 p 代替 m)并且 b<p,根据费马小定理,bp11modp,即 b×bp21modp

因此,当模数 p 为质数时,bp2 即为 b 的乘法逆元。

如果只是保证 b,m 互质,那么乘法逆元可通过求解同余方程 b×x1modm 得到。

这里先按照推出的结论,给出用快速幂求逆元

int qpow(long long a, int b) { int ans = 1; a = (a % p + p) % p; for (; b; b >>= 1) { if (b & 1) ans = (a * ans) % p; a = (a * a) % p; } return ans; }

__EOF__

本文作者Kdlyh
本文链接https://www.cnblogs.com/kdlyh/p/17877850.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   加固文明幻景  阅读(14)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示