nryoung/algorithms项目中的埃拉托斯特尼筛法实现解析
2025-07-10 05:53:32作者:劳婵绚Shirley
算法概述
埃拉托斯特尼筛法(Sieve of Eratosthenes)是一种古老而高效的寻找素数的算法,由古希腊数学家埃拉托斯特尼提出。该算法通过逐步筛选的方式,找出小于给定上限的所有素数。
算法原理
算法的工作原理如下:
- 创建一个从2到n的连续整数列表
- 从第一个素数2开始,将所有2的倍数标记为合数
- 找到下一个未被标记的数(即素数),然后将其所有倍数标记为合数
- 重复步骤3,直到处理完所有小于等于√n的数
- 剩下的未被标记的数即为素数
时间复杂度
该算法的时间复杂度为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)
实现特点
- 优化处理:直接从i²开始标记合数,而不是从2i开始,因为更小的倍数已经被之前的素数处理过了
- 范围筛选:支持指定起始值,只返回大于等于start的素数
- 灵活返回:可以选择返回素数列表或同时返回素数列表和布尔数组
使用示例
# 获取小于100的所有素数
primes = eratosthenes(100)
print(primes)
# 获取50到100之间的素数
primes = eratosthenes(100, 50)
print(primes)
# 获取素数列表和布尔数组
primes, is_prime = eratosthenes(100, return_boolean=True)
算法优化空间
虽然这个实现已经很高效,但仍有优化空间:
- 内存优化:可以使用位数组代替布尔数组减少内存占用
- 分段筛法:对于非常大的n,可以使用分段筛法减少内存需求
- 轮筛法:进一步减少需要检查的候选数数量
应用场景
埃拉托斯特尼筛法常用于:
- 密码学中需要大量小素数时
- 数学问题中需要素数表时
- 算法竞赛中需要预处理素数时
总结
nryoung/algorithms项目中的埃拉托斯特尼筛法实现简洁高效,提供了灵活的接口和合理的默认值,是学习素数筛选算法的优秀范例。理解这个算法不仅有助于解决实际问题,也是学习算法设计和优化的好案例。