概念
扩展欧几里得算法(exgcd) 是一种可以求出关于 x,y 的方程 ax+by=gcd(a,b) 的通解的算法。
不妨设 a>b,则 exgcd 的时间复杂度为 O(logb)
思想
exgcd 的实现求出的是原方程的一组整数特解 x,y.
显然当 b=0 时原方程有一组特解 x=1,y=0
当 b≠0 时,设方程 bx+(amodb)y=gcd(b,amodb) 有一组整数特解 x2,y2,则方程 ax+by=gcd(a,b) 有一组整数特解为 x1=y2,y1=x2−⌊ab⌋y2
递归求解即可。
证明
根据裴蜀定理,存在 x,y∈Z 使得 ax+by=gcd(a,b)
当 b=0 时原方程显然有特解 x=1,y=0
当 b≠0 时,设原方程有一组整数特解 x1,y1
则 ax1+by1=gcd(a,b)=gcd(b,amodb)
设 bx2+(amodb)y2=gcd(b,amodb)
则 ax1+by1=bx2+(amodb)y2
又因为 amodb=a−⌊ab⌋b
代入得 ax1+by1=bx2+(a−⌊ab⌋b)y2
ax1+by1=bx2+ay2−⌊ab⌋by2
ax1+by1=ay2+(bx2−⌊ab⌋by2)
所以有 ax1+by1=ay2+b(x2−⌊ab⌋y2)
易得 x1=y2,y1=x2−⌊ab⌋y2
拓展
通解和最小非负整数解
设方程 ax+by=gcd(a,b) 有一组整数特解 x′,y′
则 ax+by=gcd(a,b) (1) 且 ax′+by′=gcd(a,b) (2)
(1)−(2) 得 (ax+by)−(ax′+by′)=0
整理得 a(x−x′)+b(y−y′)=0
即 a(x−x′)=b(y′−y)
两边同除 gcd(a,b) 得 agcd(a,b)(x−x′)=bgcd(a,b)(y′−y)
∵ agcd(a,b) 和 bgcd(a,b) 互质
∴ x−x′=tbgcd(a,b),y′−y=tagcd(a,b),t∈Z
∴ 原方程的通解为 x=x′+tbgcd(a,b),y=y′−tagcd(a,b),t∈Z
∴ 原方程的最小非负整数解为 x=(x′modbgcd(a,b)+bgcd(a,b))modbgcd(a,b)
ax+by=c
根据裴蜀定理知,原方程有解,当且仅当 gcd(a,b)∣c
先求出 ax+by=gcd(a,b) 的一组通解 x0,y0
原式两边乘 cgcd(a,b) 得 ax0cgcd(a,b)+by0cgcd(a,b)=c
易得原方程的一组特解为 x′=x0cgcd(a,b),y′=y0cgcd(a,b)
类似地,可以得出原方程的通解形式为
x=x0cgcd(a,b)+tbgcd(a,b),y=y0cgcd(a,b)−tagcd(a,b),t∈Z
原方程的最小正整数解为 x=(x′modbgcd(a,b)+bgcd(a,b))modbgcd(a,b)
ax≡c(modb)
原方程可化为 ax+by=c 的形式,其中 y∈Z
用上面的方法求解即可
注意到有很多解在模 b 意义下相同
此时有结论:共有 gcd(a,b) 个模 b 意义下不同的解
当通解中的 t 满足 t∈[0,gcd(a,b)−1] 时取到所有解
模板
ll exgcd(ll a, ll b, ll &x, ll &y)
{
ll d = a;
if (b == 0)
x = 1, y = 0;
else
{
d = exgcd(b, a % b, y, x);
y -= (a / b * x);
}
return d;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】