Sieve of Eratosthenes(埃拉托斯特尼筛法)寻找素数

介绍了埃拉托斯特尼筛法的基本原理及其优化过程,并提供了两种不同优化级别的Python实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天突然看书的时候涉及寻找素数的问题,学习了一下这个Sieve of Eratosthenes方法,点击就可以进入维基百科的页面,其中有一个动画来展示这个算法的运行步骤。这个方法可以用来求解不超过给定值n的所有素数。而且效率非常高,算法也很简单,我觉得很有趣,因此记录一下。




最初版本的素数筛查法的思想是,以最小的素数2开始,删除2的整数倍数的数字,这些数字都不是素数;接着寻找比2大的未被删除的最小数字,寻找其整数被的数字,去除;重复上述过程,最终剩下的数字就是素数。下面给出算法的思路:
1. 生成从2到n连续的列表;
2. 起初,让p等于2,2是最小的素数;
3. 从2p开始,依次将2p, 3p, 4p, …; 的数字标记为不是素数;
4. 寻找大于p且是素数的最小数字,将p取为这个数字,重复,第三步;如果没有,则停止,没有被标记的所有数字均为素数。

# -*- coding:utf-8 -*-
import numpy as np

n = 100
a = np.arange(2, n + 1)
is_prime = np.ones(len(a), dtype=bool)
for i in range(2, n + 1):
    if i in a[is_prime]:
        is_prime[(2 * i)::i] = False
print(a[is_prime])

这个算法的时间复杂度是 O(nlogn) O ( n log ⁡ n )


由于有:

定理:一个数如果不能被从2开始到自身开根号范围内的整数整除,则它是素数

因此算法可以优化,使得时间复杂度将为 O(nloglogn) O ( n log ⁡ log ⁡ n ) ,代码如下:

# -*- coding:utf-8 -*-
import numpy as np

n = 100
a = np.arange(2, n + 1)
n_max = int(np.sqrt(n))
is_prime = np.ones(len(a), dtype=bool)
for i in range(2, n_max):
    if i in a[is_prime]:
        is_prime[(i**2)::i] = False
print(a[is_prime])
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值