欧几里得算法

欧几里得算法

在«几何原本»中,欧几里得提出了用辗转相除的方法求解两个整数a,b的最大公约数的算法:

gcd(a, b)
    if (0 == b) return a
    else return gcd(b, a mod b)

定理:若整数a,b的最大公约数为gcd(a,b),那么gcd(a,b)=gcd(b,amodb)
证明:
d表示a,b的公约数,那么d|ad|b
推出d|(amodb)=akb
所以(a,b)(b,amodb)两者拥有的公约数集合是一样的
即得证

算法复杂度

欧几里得算法最多只会递归Θ(logn)次,所以完全不用担心爆栈,证明如下:
引理:设a>b1并且gcd(a,b)递归调用了k1次,那么afk+2bfk+1,其中fk表示第k项斐波那契数
证明:
这里用归纳法证明,当k=1时,bf2=1,af3=2成立
k>1时,bfk+1,amodbfk并且ab+(amodb)fk+1+fk=fk+2
即得证
由于fkϕk5,其中ϕ=1+52,是呈几何倍数增长的,所以欧几里得算法复杂度为Θ(logn)

扩展欧几里得算法

当要求解方程ax+by=gcd(a,b)的整数解的时候,只需要扩展一下欧几里得算法就可以得到整数解(x,y)

exgcd(a, b, &x, &y)
    if (0 == b)
        x = 1 y = 0
        return a
    else
        d = exgcd(b, a % b, &xx, &yy)
        x = yy y = xx - a / b * yy
        return d
posted @   HachikoT  阅读(317)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示