欧几里得算法
欧几里得算法(辗转相除法)基于“两数最大公约数等于较小数与两数相除余数的最大公约数”这一定理,通过重复取余运算,在余数为 0 时快速求得两个非负整数的最大公约数。
基础算法1分钟阅读

欧几里得算法(Euclidean Algorithm),又称辗转相除法,是用于计算两个非负整数 和 的最大公约数(Greatest Common Divisor, GCD)的最古老、最高效的算法之一。
该算法最早记录于公元前 300 年左右古希腊数学家欧几里得所著的《几何原本》第七卷中,是人类已知且至今仍被广泛使用的最古老的数值算法之一。
算法的核心原理建立在以下数学定理之上:
定理: 两个整数 和 ()的最大公约数,等于 和 除以 的余数 (即 )的最大公约数。
用公式表达即为:
终止条件: 当余数为 时,此时的除数就是两者的最大公约数,即 。
假设 是 和 的公约数,即 且 。
由于余数 (其中 是商),代入可得:
因此, 必定也是余数 的约数。由此证明了 与 的等价性。
以下是逐步求解过程:
当余数为 时,计算结束,最大公约数为 。
#include <numeric> // 使用 std::gcd 需要引入此头文件
// 1. 递归实现long long gcd_recursive(long long a, long long b) { return b == 0 ? a : gcd_recursive(b, a % b);}
// 2. 迭代实现(效率更高,无栈溢出风险)long long gcd_iterative(long long a, long long b) { while (b != 0) { long long temp = a % b; a = b; b = temp; } return a;}
// 3. 极简递归写法(三目运算符)long long gcd(long long a, long long b) { return b ? gcd(b, a % b) : a;}
// 4. C++17 标准库直接调用// auto ans = std::gcd(a, b);- 时间复杂度: 。算法每执行两次,问题规模至少缩小一半(Lamé 定理保证了极高的运行效率,即使输入上千位的庞大整数也能快速得出结果)。
- 空间复杂度: 迭代版本为 ,递归版本为 栈空间。
- 主要扩展与应用:
- 扩展欧几里得算法(Extended Euclidean Algorithm): 不仅求出 ,还能求解贝祖等式(Bézout’s identity) 中的整数解 。
- 密码学: 是 RSA 公钥加密算法中求解模逆元(Modular Multiplicative Inverse)的核心工具。