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

2023-10-28 17:10

本文主要是介绍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(埃拉托斯特尼筛法)寻找素数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/294690

相关文章

寻找身高相近的小朋友

题目描述: 小明今年升学到小学一年级,来到新班级后发现其他小朋友们身高参差不齐,然后就想基于各小朋友和自己的身高差对他们进行排序,请帮他实现排序。 输入描述: 第一行为正整数H和N,0<H<200,为小明的身高,0<N<50,为新班级其他小朋友个数。第二行为N个正整数H1-HN,分别是其他小朋友的身高,取值范围0<Hi<200(1<=i<=N),且N个正整数各不相同。 输出描述: 输出

【第0006页 · 数组】寻找重复数

【前言】本文以及之后的一些题解都会陆续整理到目录中,若想了解全部题解整理,请看这里: 第0006页 · 寻找重复数         今天想讨论的一道题在 LeetCode 上评论也是颇为“不错”。有一说一,是道好题,不过我们还是得先理解了它才算真正的好题。这里我们展示一种使用二进制的做法,希望能帮到你哟! 【寻找重复数】给定一个包含 n + 1 个整数的数组 nums ,其数字都

windows手工杀毒-寻找可疑进程之线程

上篇回顾:windows手工杀毒-寻找可疑进程之进程模块-CSDN博客         上篇我们介绍了如何通过进程模块寻找可疑进程,进程模块文件按照PE格式存储,我们可以使用IDA等静态分析(不需要运行文件,只看文件内容)工具分析文件行为,也可以使用windbg,x64debug等动态分析(运行文件)文件行为,也可以根据文件所属公司,文件路径等文件相关信息寻找可疑进程。今天介绍如何通过线程寻找可疑

js算法判断是否为素数

/*判断一个数字是否是质数: 质数(prime number)又称素数,有无限个。除了1和它本身以外不再被其他的除数整除。*/ function isPrime(number){ //判断输入是否为number类型,是否为整数       if (typeof number!=='number'||!Number.isInteger(number))      {

数字时代,寻找新的生意增长点之前要做什么准备?

要做好最基础也最繁复的数据管理。 在竞争日益激烈的快消市场中,企业面临前所未有的挑战与压力。在这种高压环境下,数字化转型不再仅仅是选择,而是企业探索新的业务增长点、保持竞争优势的关键战略。然而,随着企业数字化进程的加速推进,业务系统持续生成的多样化与复杂化数据使得传统数据分析手段难以应对。因各系统间业财口径的不一致和数据维度的差异,企业在数据整合与分析过程中经常遭遇瓶颈,难以获得准确且具有前瞻性

【时时三省】c语言例题----华为机试题< 查找组成一个偶数最接近的两个素数>

山不在高,有仙则名。水不在深,有龙则灵。                                                                         ----CSDN 时时三省 1,题目 HJ60 查找组成一个偶数最接近的两个素数 描述 任意一个偶数(大于2)都可以由2个素数组成,组成偶数的2个素数有很多种情况,本题目要求输出组成指定偶数的两个

书客、松下、飞利浦护眼台灯怎么样?测评寻找护眼台灯天花板!

大家好,我是专注在护眼领域的一名评测师,长期以来,我致力于探索并体验各类能保护视力健康的护眼产品。今天,我来和大家分享我对护眼台灯的深入评测。护眼台灯作为日常学习生活的一部分,视觉体验的好坏往往取决于所选用的台灯,然而,并非所有的护眼台灯都能完美契合我们对于舒适度与效率的期待。 作为一名经验丰富的评测博主,我深知光谱结构、光线设计这些都是评价一款护眼台灯好坏的重要标准。基于此,我特意选择了市场上

题目:求100以内的素数,全部打印出来。

题目:求100以内的素数,全部打印出来。 public class ZhaoSuShu {public static void isPrime1(){int i,j,count = 0;//System.out.println("2");for(i = 1; i <= 100; i++){for(j = 2; j <= i; j++){if(i % j == 0){break;}}if(j ==

编程之美——寻找最大的K个数

编程之美——寻找最大的K个数 解法一: 我们先假设元素的数量不大,例如在几千个左右,在这种情况下,那我们就排序一下吧。在这里,快速排序或堆排序都是不错的选择,他们的平均时间复杂度都是 O(N * log2N)。然后取出前 K 个,O(K)。 总时间复杂度 O(N * log2N)+ O(K) = O(N * log2N)。 你一定注意到了,当 K=1 时,上面的算法也是

素数判定和分解质素数

1.素数判定   public static boolean isPrime(int n) {if (n <= 1) return false;if (n == 2) return true;if (n % 2 == 0) return false;int limit = (int)Math.sqrt(n) + 1;for (int i = 3; i <= limit; i += 2) {i