扩展欧几里得算法(exgcd)
简介
扩展欧几里得算法基于辗转相除法构建,主要用于求方程
ax+by=c
最小正整数解
步骤
1.求方程ax+by=gcd(a,b)的解
我们构造两个方程
{ax+by=gcd(a,b)bx′+(a%b)y′=gcd(b,a%b)
因为由欧几里得算法易于得到
gcd(a,b)=gcd(b,a%b)
所以
ax+by=bx′+(a%b)y′
由此递推易得方程
ax+0y=1
此时方程解为
x=1a
对于a%b我们可以表示为
a%b=a−b∗⌊ab⌋
将此式带入原方程即可得
ax+by=bx′+ay′−b∗⌊ab⌋y′
整理可得
ax+by=ay′+b(x′−⌊ab⌋y′)
因为a=a,b=b
所以
{x=y′y=x′−⌊ab⌋y′
在写代码时可以用递归实现,先往下递归直到a%b=0得到方程的一个解,然后返回利用x,y和x',y'的关系得到原方程的解
2.求方程ax+by=gcd(a,b)的最小整数解
因为有方程ax+by=gcd(a,b),所以
a(x+b/a)+b(y−a/b)=gcd(a,b)
显然x+b/a,y−a/b也为方程的一组解
此时,我们把
b/a,a/b
分别称为x,y的一个周期,一般用字母T表示
在步骤1里我们已经得到了方程的一个解x,y
因为
{x′=x+k∗T1y′=y+k∗T2
也为方程的一组解,所以
{x′=x%T1y′=y%T2
因为无法保证x,y同时都为正整数
所以对于x的最小正整数解为
x′=(x%T1+T1)%T1
3.求普遍方程ax+by=c的最小正整数解
我们已经得到了普遍方城ax+by=gcd(a,b)的最小正整数解
我们设
p=c/gcd(a,b)
那么有
a∗px+b∗py=p∗gcd(a,b)
对比系数易于得到,ax+by=c的对于x的最小正整数解为
{x′=pxy′=py
显然如果c%gcd(a,b)!=0那么方程无最小正整数解
求逆元
对于求有理数的模运算
(ab)%p
我们可以将其转化为
a%p∗(1b%p)
而1b%p就可以转化为求方程
ax≡1(%p)
的解
因为1%p=1,所以x就可以看做方程
ax+py=1
最小正整数解,其中x被称为a的逆元
特别的如果p是一个质数,那么根据费马小定律
ap−1≡1(%p)a∗ap−2≡1(%p)
所以
x=ap−2
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】