算法学习笔记(1): 欧几里得算法及其扩展
1.算法学习笔记(∞):杂项
2.算法学习笔记(1): 欧几里得算法及其扩展
3.算法学习笔记(2): 欧拉定理与逆元4.算法学习笔记(3): 倍增5.算法学习笔记(3.1): ST算法6.算法学习笔记(4): 并查集及其优化7.算法学习笔记(5): 最近公共祖先(LCA)8.算法学习笔记(6): 树链剖分9.算法学习笔记(7): 二分图10.算法学习笔记(8): 网络流11.算法学习笔记(8.0): 网络流前置知识12.算法学习笔记(8.1): 网络最大流算法 EK, Dinic, ISAP13.算法学习笔记(8.2): 上下界网络流14.算法学习笔记(8.3): 网络最大流 - 模型篇15.算法学习笔记(9): 中国剩余定理(CRT)以及其扩展(EXCRT)16.算法学习笔记(10): BSGS算法及其扩展算法17.算法学习笔记(11): 原根18.算法学习笔记(12): 线性基19.算法学习笔记(13): Manacher算法20.算法学习笔记(14): 字符串哈希21.算法学习笔记(15): Trie(字典树)22.算法学习笔记(16): 组合数学基础23.算法学习笔记(17): 快速傅里叶变换(FFT)24.算法学习笔记(18): 平衡树(一)25.算法学习笔记(19): 树上启发式合并(DSU on tree)26.算法学习笔记(20): AC自动机27.算法学习笔记(21): 平衡树(二)28.算法学习笔记(22): 逆序对与原序列29.算法学习笔记(23): 马尔可夫链中的期望问题30.算法学习笔记(24): 狄利克雷卷积和莫比乌斯反演31.算法学习笔记(25): 矩阵树定理32.算法学习笔记(26): 计算几何33.算法学习笔记(27): 后缀结构34.算法学习笔记(28): 筛法35.算法学习笔记(29):分块36.算法学习笔记(30):Kruskal 重构树37.算法学习笔记(31): 李超线段树38.算法学习笔记(32): 分治39.算法学习笔记(33): 格路径与计数40.算法学习笔记(34): 矩阵乘法与线段树标记41.算法学习笔记(35): CMD Tree42.算法学习笔记(36): 期望中的停时43.算法学习笔记(37): 点分治,边分治小记44.算法学习笔记(38): 矩阵45.算法学习笔记(39): 2-SAT46.算法学习笔记(40): 具体数学47.算法学习笔记(41): 朴素多项式算法48.算法学习笔记(42): 颜色段均摊49.算法学习笔记(43): 可持久化线段树 - 区间加!50.算法学习笔记(44): 二维问题小计51.算法学习笔记(45): 快速沃尔什变换 FWT52.算法学习笔记(46): 离散余弦变换(DCT)扩展欧几里得算法详解
在了解扩欧之前我们应该先了解欧几里得算法
欧几里得算法
这是一个递归求最大公约数(greatest common divisor)的方法
可以通过一个类似的简单公式推导而来
好像叫做辗转相减法来着?
由于已知
令 则可以推导出
这里给出两种代码
int gcd(int a, int b) {
return b ? gcd(b, a % b) : a;
}
// 这种方法稍微快了那么一点点。其实也没有什么影响
int gcd(int a, int b) {
int t;
while (b) {
t = a % b, a = b, b = t;
}
return a;
}
但是在讲扩欧之前,还需要引入一个定理
贝祖定理
若,则 满足
定义:
其中,称为的贝祖系数,等式 称为贝祖恒等式
扩展欧几里得算法
本质上就是欧几里得算法和贝祖定理的结合产生的一种算法,可以用于求出形如
的二元一次等式的一组合法解(其中,为参数)
在欧几里得算法中,核心的思路是这样的
而边界条件是
则,在边界时有
即可知,边界时应有
但是我们要如何回推呢?
依据贝祖定理
以及
令等式左右的贝祖系数为和可以变形写出
于是可以知晓
于是,可以写出扩欧的代码
这里给出一种C-style的代码
int exgcd(int a, int b, int *s, int *t) {
if (b == 0) {
*s = 1, *t = 0;
return a;
}
int r = exgcd(b, a % b, t, s);
*t -= (a / b) * *s;
return r;
}
当然,扩欧其实也是可以利用矩阵递推的
我们通过上述递推式可以将之转化为矩阵递推式
其中,
于是,就可以一直乘下去
那么,有了从右向左的推导,从左向右呢?
设初始矩阵为M,则需要
所以
于是,我们可以简单的利用矩阵乘法递推了!
但是,如果真的用矩阵模拟还不如不用,所以我们还需要一定的优化
设当前矩阵为,需要乘上
则,变为
所以,就按照上面的式子写就是了(我就不提供参考了)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?