2016.1.25
(未更新完)
一、欧几里得算法(辗转相除法)
1、用途:快速计算两个数的最大公约数。
2、精髓:gcd(a,b)=gcd(b,a%b)
3、证明:设r=a mod b,则我们要证明的是gcd(a,b)=gcd(b,r)
设gcd(a,b)=c,则a=mc,b=nc,且m,n互质。那么r=a-kb=(m-kn)c,所以c也是r的因数。
若gcd(b,r)>c,则设为d,则有b=m1*d,r=n1*d,所以a=(m1+n1)*d,则d为a的因数,所以gcd(a,b)=d,与题设不符。
所以gcd(a,b)=gcd(b,r)
4、时间复杂度:显然经过两次递归后第一个参数至少减小一半
所以时间复杂度粗略为O(log max(a,b))
5、经典例题:线段上格点的个数
二、扩展欧几里得算法:
1、用途:快速求整数x,y使得ax+by=gcd(a,b)
2、精髓代码:
void extgcd(int a,int b,int &x,int &y) { if(!b) { x=1;y=0; return a; } else { extgcd(b,a%b,y,x); y-=(a/b)*x; } }
3、证明:由于gcd(a,b)=gcd(b,a%b)
所以b*x1 + (a%b)*y1 = gcd(a,b)
a%b = a - (a/b)*b
所以gcd(a,b) = b*x1 + (a-(a/b)*b)*y1
= b*x1 + a*y1 – (a/b)*b*y1
= a*y1 + b*(x1 – a/b*y1)
对于我们所求的x,y使得ax+by=gcd(a,b)
则有 x = y1
y = x1 – a/b*y1
证毕
至于终止条件,因为当欧几里得算法终止时a=gcd,b=0,则当x=1,y=0时,必使目标公式成立。
另外关于ax+by=c的充要条件为什么是c=gcd(a,b),可以自行百度一下裴蜀定理。
4、时间复杂度:与欧几里得算法一致
5、经典例题:双六
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· 【.NET】调用本地 Deepseek 模型
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)