扩展欧几里得

概念

扩展欧几里得算法(exgcd) 是一种可以求出关于 x,y 的方程 ax+by=gcd(a,b) 的通解的算法。

不妨设 a>b,则 exgcd 的时间复杂度为 O(logb)

思想

exgcd 的实现求出的是原方程的一组整数特解 x,y.

显然当 b=0 时原方程有一组特解 x=1,y=0

b0 时,设方程 bx+(amodb)y=gcd(b,amodb) 有一组整数特解 x2,y2,则方程 ax+by=gcd(a,b) 有一组整数特解为 x1=y2,y1=x2aby2

递归求解即可。

证明

根据裴蜀定理,存在 x,yZ 使得 ax+by=gcd(a,b)

b=0 时原方程显然有特解 x=1,y=0

b0 时,设原方程有一组整数特解 x1,y1

ax1+by1=gcd(a,b)=gcd(b,amodb)

bx2+(amodb)y2=gcd(b,amodb)

ax1+by1=bx2+(amodb)y2

又因为 amodb=aabb

代入得 ax1+by1=bx2+(aabb)y2

ax1+by1=bx2+ay2abby2

ax1+by1=ay2+(bx2abby2)

所以有 ax1+by1=ay2+b(x2aby2)

易得 x1=y2,y1=x2aby2

拓展

通解和最小非负整数解

设方程 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(xx)+b(yy)=0

a(xx)=b(yy)

两边同除 gcd(a,b)agcd(a,b)(xx)=bgcd(a,b)(yy)

agcd(a,b)bgcd(a,b) 互质

xx=tbgcd(a,b),yy=tagcd(a,b),tZ

原方程的通解为 x=x+tbgcd(a,b),y=ytagcd(a,b),tZ

原方程的最小非负整数解为 x=(xmodbgcd(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),tZ

原方程的最小正整数解为 x=(xmodbgcd(a,b)+bgcd(a,b))modbgcd(a,b)

axc(modb)

原方程可化为 ax+by=c 的形式,其中 yZ

用上面的方法求解即可

注意到有很多解在模 b 意义下相同

此时有结论:共有 gcd(a,b) 个模 b 意义下不同的解

当通解中的 t 满足 t[0,gcd(a,b)1] 时取到所有解

模板

posted @   kymru  阅读(49)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示
主题色彩