返回

揭秘厄拉多塞筛法:快速列出质数的利器

python

## 厄拉多塞筛法:快速列出质数的算法

作为经验丰富的程序员和技术作家,我经常被问到如何快速有效地列出质数。今天,我将分享一种有效算法——厄拉多塞筛法。这种算法比暴力的试除法要快得多,可以高效地找出小于给定整数的所有质数。

### 厄拉多塞筛法的工作原理

厄拉多塞筛法的核心思想是标记非质数,留下质数。它的步骤如下:

  1. 创建数字列表: 从 2 到给定的整数 N 创建一个包含所有整数的列表。
  2. 将 2 标记为质数: 2 是第一个质数,因此将其标记为质数。
  3. 从 3 开始,循环到 √N: 对于每个数字 i:
    • 如果 i 是质数:
      • 将 i 的所有倍数标记为非质数。
  4. 收集质数: 循环结束后,未被标记为非质数的数字就是质数。

### 优化厄拉多塞筛法

为了进一步提高效率,我们可以对筛法进行以下优化:

  • 使用位数组: 用一个位数组来存储每个数字是否为质数,而不是使用列表,以节省空间和时间。
  • 仅检查奇数: 除了 2,所有质数都是奇数,因此我们仅需要检查奇数。
  • 仅检查到 √N: 对于每个质数 i,我们只需要将它的倍数标记到 √N,因为任何大于 √N 的数字的倍数一定已经由更小的质数标记过了。

### 厄拉多塞筛法的应用

厄拉多塞筛法广泛应用于需要查找质数的领域,例如:

  • 加密算法
  • 素数测试
  • 数学研究
  • 计算机科学理论

### Python 代码示例

def get_primes(n):
    primes = [True] * (n + 1)
    primes[0] = primes[1] = False
    for i in range(2, int(math.sqrt(n)) + 1):
        if primes[i]:
            for j in range(i * i, n + 1, i):
                primes[j] = False
    return [i for i in range(2, n + 1) if primes[i]]

这个 Python 函数使用优化后的筛法来生成小于给定整数 N 的所有质数列表。

### 常见问题解答

  1. 什么是质数? 质数是一个只能被 1 和自身整除的自然数。
  2. 厄拉多塞筛法的复杂度是多少? 厄拉多塞筛法的复杂度为 O(N log log N),比暴力的试除法 O(N^2) 快得多。
  3. 厄拉多塞筛法可以处理多大的整数? 理论上,筛法可以处理任意大的整数,但实际限制取决于计算机的内存和处理能力。
  4. 厄拉多塞筛法有什么局限性? 筛法不能生成大于给定整数 N 的质数,也不能确定给定的数字是否是质数。
  5. 除了厄拉多塞筛法,还有其他列出质数的方法吗? 还有其他算法可以列出质数,如试除法和 Miller-Rabin 检验法。