首页
/ nryoung/algorithms项目中的埃拉托斯特尼筛法实现解析

nryoung/algorithms项目中的埃拉托斯特尼筛法实现解析

2025-07-10 05:53:32作者:劳婵绚Shirley

算法概述

埃拉托斯特尼筛法(Sieve of Eratosthenes)是一种古老而高效的寻找素数的算法,由古希腊数学家埃拉托斯特尼提出。该算法通过逐步筛选的方式,找出小于给定上限的所有素数。

算法原理

算法的工作原理如下:

  1. 创建一个从2到n的连续整数列表
  2. 从第一个素数2开始,将所有2的倍数标记为合数
  3. 找到下一个未被标记的数(即素数),然后将其所有倍数标记为合数
  4. 重复步骤3,直到处理完所有小于等于√n的数
  5. 剩下的未被标记的数即为素数

时间复杂度

该算法的时间复杂度为O(n log log n),这使得它在寻找较小素数(通常小于1000万)时非常高效。

代码实现解析

nryoung/algorithms项目中的实现提供了以下功能:

def eratosthenes(end, start=2, return_boolean=False):
    primes = []
    if end < start or end < 2:
        return []
    is_prime = [True for i in range(end + 1)]
    is_prime[0] = is_prime[1] = False
    for i in range(2, end + 1):
        if not is_prime[i]:
            continue
        if start <= i <= end:
            primes.append(i)
        j = i * i
        while j <= end:
            is_prime[j] = False
            j += i
    if return_boolean:
        return primes, is_prime
    return primes

参数说明

  • end:查找素数的上限(不包含)
  • start:查找素数的起始值(默认为2)
  • return_boolean:是否返回布尔数组(默认为False)

实现特点

  1. 优化处理:直接从i²开始标记合数,而不是从2i开始,因为更小的倍数已经被之前的素数处理过了
  2. 范围筛选:支持指定起始值,只返回大于等于start的素数
  3. 灵活返回:可以选择返回素数列表或同时返回素数列表和布尔数组

使用示例

# 获取小于100的所有素数
primes = eratosthenes(100)
print(primes)

# 获取50到100之间的素数
primes = eratosthenes(100, 50)
print(primes)

# 获取素数列表和布尔数组
primes, is_prime = eratosthenes(100, return_boolean=True)

算法优化空间

虽然这个实现已经很高效,但仍有优化空间:

  1. 内存优化:可以使用位数组代替布尔数组减少内存占用
  2. 分段筛法:对于非常大的n,可以使用分段筛法减少内存需求
  3. 轮筛法:进一步减少需要检查的候选数数量

应用场景

埃拉托斯特尼筛法常用于:

  1. 密码学中需要大量小素数时
  2. 数学问题中需要素数表时
  3. 算法竞赛中需要预处理素数时

总结

nryoung/algorithms项目中的埃拉托斯特尼筛法实现简洁高效,提供了灵活的接口和合理的默认值,是学习素数筛选算法的优秀范例。理解这个算法不仅有助于解决实际问题,也是学习算法设计和优化的好案例。