详解扩展欧几里得(exgcd)
在讲解扩展欧几里得之前我们先回顾下辗转相除法:
gcd(a,b)=gcd(b,a%b)$$当$a%b==0$的时候b即为所求最大公约数好了切入正题:简单地来说exgcd函数求解的是$ax+by=gcd(a,b)$的最小正整数解。根据数论的相关知识,一定存在一组解$x,y$使得$ax+by=gcd(a,b)$当且仅当$a$与$b$互质的时候。那就来谈谈具体如何来求解吧。根据辗转相除法的内容$gcd(a,b)=gcd(b,a%b)$我们可以得到:$$ax1+by1=gcd(a,b)=gcd(b,a%b)=bx2+a%by2······①
又由于a%b=a−⌊a÷b⌋×b
在计算机中a%b=⌊a÷b⌋×b=a/b∗b所以$$bx_2+a%by_2=bx_2+(a-a/bb)y_2将等式①变形得:ax_1+b(y_1+a/ by_2)=ay_2+bx_2因为等式左右两边结构相同我们可以解得:\begin{cases}x_1=y_2\y_1=x_2-a/by_2\end{cases}$$
在扩展欧几里得算法的最后一步即b=0的时候,显然有一对整数x=1,y=0使得$$a1+b*0=gcd(a,0)$$
那么我们就可以通过编程实现exgcd了,请仔细体验下代码的精妙之处:
int exgcd(int a,int b,int &x,int &y) {
if(b) {
int d=exgcd(b,a%b,y,x);
y-=a/b*x;
} else {
x=1;
y=0;
return a;
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架