本文主要是介绍Sieve of Eratosthenes(埃拉托斯特尼筛法)寻找素数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
今天突然看书的时候涉及寻找素数的问题,学习了一下这个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 npn = 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 npn = 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])
这篇关于Sieve of Eratosthenes(埃拉托斯特尼筛法)寻找素数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!