1. 概述

在本文中,我们将分析欧几里得算法(Euclid’s Algorithm)的两种常见实现方式,并讨论它们的时间复杂度。

该算法用于计算两个整数的最大公约数(GCD),是计算机科学中非常基础且重要的算法之一。理解其时间效率对我们在处理数学运算、密码学、算法优化等场景时有重要意义。


2. 最大公约数(GCD)

最大公约数指的是两个整数都能被整除的最大正整数。例如:

  • gcd(10, 5) = 5
  • gcd(96, 72) = 12
  • gcd(23, 89) = 1
  • gcd(x, 1) = 1,其中 x 是任意正整数

当数字变大时,手动计算变得困难,例如计算 gcd(31487, 21933)。欧几里得算法正是解决这一问题的高效工具。


3. 基于减法的欧几里得算法

这是欧几里得最初在《几何原本》中提出的原始版本,通过不断用较大的数减去较小的数,直到两个数相等为止。

3.1 算法步骤

  1. 如果 a == b,返回 a
  2. 如果 a > b,则 a = a - b,回到第1步
  3. 如果 a < b,则 b = b - a,回到第1步

例如计算 gcd(25, 10) 的过程如下:

a = 25, b = 10
a = 15, b = 10
a = 5,  b = 10
a = 5,  b = 5

最终 gcd(25, 10) = 5

3.2 伪代码

algorithm gcd(a, b)
    if a == b:
        return a
    else if a > b:
        return gcd(a - b, b)
    else:
        return gcd(a, b - a)

3.3 时间复杂度分析

在最坏情况下,每次减法操作只减少1,因此时间复杂度为 O(a + b)。当输入数字较大时,这种效率显然较低。

缺点:对于大数不够高效
适用场景有限:仅适用于小整数或教学用途


4. 基于除法的欧几里得算法(现代版)

这是目前最常用的欧几里得算法变体,使用取模运算来快速缩小问题规模。

4.1 算法核心思想

利用以下两个性质:

  • gcd(a, 0) = a
  • gcd(a, b) = gcd(b, a % b)

通过不断计算余数,直到余数为零,此时的除数即为最大公约数。

例如计算 gcd(25, 10) 的过程如下:

a = 25, b = 10 → r = 5
a = 10, b = 5  → r = 0
a = 5,  b = 0

结果为 5

4.2 伪代码

递归实现:

algorithm gcd(a, b)
    if b == 0:
        return a
    else:
        return gcd(b, a % b)

迭代实现:

algorithm gcd(a, b)
    while b != 0:
        r = a % b
        a = b
        b = r
    return a

4.3 时间复杂度分析

该算法的执行次数与输入的大小关系密切。可以证明:

  • 最坏情况下,当输入为连续的斐波那契数时,所需步骤最多
  • 步数与较小的输入值 b 的对数成正比
  • 因此时间复杂度为 O(log b),其中 b 是两个输入中较小的那个

⚠️ 注意:即使输入顺序颠倒(如 a < b),算法也会在第一步自动交换,不影响整体复杂度

优点:效率高,适合大整数
适用广泛:常用于密码学、编译器优化、数学库等


5. 总结

我们比较了两种欧几里得算法的实现方式及其时间复杂度:

方法 时间复杂度 说明
基于减法 O(a + b) 原始版本,效率较低,适用于教学
基于除法 O(log b) 现代常用,效率高,适合实际应用

在实际开发中,推荐使用基于除法的版本,因其效率高且实现简洁。在需要频繁计算最大公约数的场景(如分数化简、RSA加密等)中,这种算法的性能优势尤为明显。


原始标题:Time Complexity of Euclid's Algorithm