欧几里得算法
- 什么是欧几里得算法
- 操作步骤
- 为什么有效
- 特点
什么是欧几里得算法
欧几里得算法(又称辗转相除法)用于计算两个数的最大公约数(GCD),被称为世界上最古老的算法,最早记载于公元前 300 年欧几里得的著作中。
操作步骤
核心操作就是反复做取余(mod)运算:用较大的数除以较小的数,得到余数;然后用除数和余数继续重复,直到余数为 0。
以求 1112 和 695 的最大公约数为例:
1112 mod 695 = 417 ← 用 1112 除以 695,余 417
695 mod 417 = 278 ← 用 695 除以 417,余 278
417 mod 278 = 139 ← 用 417 除以 278,余 139
278 mod 139 = 0 ← 余数为 0!
→ 最大公约数 = 139(最后一次的除数)
Python 实现:
def gcd(a, b):
while b != 0:
a, b = b, a % b
return a
print(gcd(1112, 695)) # => 139
为什么有效
把两个数看作两条线段,最大公约数就是能同时整分这两条线段的最大单位:
1112 = 139 × 8
695 = 139 × 5
GCD = 139
余数也一定是 139 的整数倍:
417 = 139 × 3
278 = 139 × 2
每次取余后,余数仍然能被最大公约数整除。当余数为 0 时,最后一次的除数就是最大公约数。
特点
- 只需重复做除法,不需要因式分解
- 即使两个数字很大,也能高效求解
- 与分而治之思想相通(D&C 中土地分方块的例子本质就是欧几里得算法)
- 时间复杂度为 O(log(min(a,b)))
小结
- 欧几里得算法通过反复取余求最大公约数
- 余数为 0 时,最后一次的除数就是 GCD
- 简单高效,是最古老的算法之一