欧几里得算法及扩展欧几里得算法简单解释
欧几里得算法:
解释:给定两个自然数,求出两个自然数的最大公约数。也叫——辗转相除法
过程:1.给定两个自然数a、b
2.a == 0 时 gcd(a,b)= b;b == 0 时 gcd(a,b) = a
3.当a,b都大于0时有 gcd(a,b)= gcd(b,a%b),减小a,b继续计算
证明:当a,b都大于0时,我们保证a大于b;并令a=kb+r
当 r = 0时,最大公约数就是b
当 r != 0时,首先r = a%b = a-kb,又令g = a与b的任意公约数
a与kb都能整除g,所以r也能整除g,所以b与a%b的公约数等于g
反过来也可以从b与a%b推出,a与b的公约数为g,这样b与a%b跟a与b的所有公约数是一样的
得证
代码:
int gcd(int a,int b) { return b==0?a:gcd(b,a%b); }
扩展欧几里得算法:
解释:找到一对整数(x,y)使得ax+by=gcd(a,b)
证明及过程:当a为0时,y为1,(b一样)
当a、b都不为0时,因为gcd(a,b)=gcd(b,a%b)
所以 ax+by = b*x1+a%b*y1
= b*x1+(a-a/b*b)*y1
= a*y1+b*(x1-a/b*y1)
然后我们需要模拟欧几里得算法,交换x、y,并改变x
代码:
void exgcd(int a,int b,int &d,int &x,int &y) { if(!b) { x=1,y=0; d=a; } else { exgcd(b,a%b,d,y,x); y-=x*(a/b); } }
应用:模线性方程
方程:ax ≡ c (mod b) -> 线性不等方程 ax+by = c(≡ 为前后mod b同余)
解出ax+by=gcd(a,b)后a*(x*c/g)+b*(y*c/g)=c(g=gcd(a,b))
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决