厄拉多塞筛法的 Python 实现以及复杂度计算
想要得到一个不大于N的数所有素数,可以先找到不超过根号N的所有素数,设2 = p1 < p2 < ......<pk ≤√N,然后在2,3,4......N里面进行下面的操作:
留下p1 = 2,把p1的倍数全部划掉,
再留下p2 ,把p2 的倍数全部划掉,
继续这一过程,直到留下 \(p_k\),把 \(p_k\) 的倍数全部划掉,
最后留下来就是不超过N的全体素数。
样例

剩余的数就是小于等于30的所有素数,即 2,3,5,7,11,13,17,19,23,29
Python 实现
算法思想来自于上面的介绍,但是并不是严格遵循上面的步骤:
def eladuosai(n):
l = list(range(1,n+1))
l[0] = 0
for i in range(2,n+1):
if l[i-1] != 0 :
for j in range(i*2,n+1,i):
l[j-1] = 0
result = [x for x in l if x != 0]
return result
求小于等于N的所有素数的普通算法:
def sushu(n):
result = []
for x in range(2,n+1):
for y in range(2,x):
if x % y == 0:
break
else:
result.append(x)
return result
时间对比,使用timeit模块测试两个方法的时间,当取n为10000的时候有如下结论:
t1 = timeit.Timer('sushu(10000)',setup='from __main__ import sushu')
t2 = timeit.Timer('eladuosai(10000)',setup='from __main__ import eladuosai')
print('厄拉多塞筛法的时间 ',t2.timeit(1))
print('普通函数的时间 : ',t1.timeit(1))
厄拉多塞筛法的时间 0.005523548190824634
普通方法的时间 : 0.7220688150193577
可以看出厄拉多塞筛法的运行时间比普通方法的时间要少很多。
厄拉多塞筛法的时间复杂度
O(NloglogN)数的是算术运算的次数。当N很大时,每个算术运算不一定在常数个指令周期内完成。不妨假设算术运算的时间复杂度是O(logN),也就是存储N所需要的空间。
此时厄拉多塞筛法的时间复杂度是O(NloglogN) * O(logN) = O(NlogNloglogN)。
而这个loglogN又是怎么来的呢?厄拉多塞筛法找到k的时候需要标记O(N/k)个数为合数。因此一共需要
标记 \(\sum_{p\le N}\frac{N}{p} = N*\sum_{p\le N}\frac{1}{p}\) 次,其中p <= N表示所有小于等于N的素数。这就是N乘以小于等于N的素
数的倒数之和。
右边是O(N)*O(loglogN) = O(NloglogN)的。
厄拉多塞筛法的 Python 实现以及复杂度计算的更多相关文章
- Opencv python图像处理-图像相似度计算
一.相关概念 一般我们人区分谁是谁,给物品分类,都是通过各种特征去辨别的,比如黑长直.大白腿.樱桃唇.瓜子脸.王麻子脸上有麻子,隔壁老王和儿子很像,但是儿子下巴涨了一颗痣和他妈一模一样,让你确定这是你 ...
- python 对比图片相似度
最近appium的使用越来越广泛了,对于测试本身而言,断言同样是很重要的,没有准确的断言那么就根本就不能称之为完整的测试了.那么目前先从最简单的截图对比来看.我这里分享下python的图片相似度的代码 ...
- Python简单实现基于VSM的余弦相似度计算
在知识图谱构建阶段的实体对齐和属性值决策.判断一篇文章是否是你喜欢的文章.比较两篇文章的相似性等实例中,都涉及到了向量空间模型(Vector Space Model,简称VSM)和余弦相似度计算相关知 ...
- 转:Python 文本挖掘:使用gensim进行文本相似度计算
Python使用gensim进行文本相似度计算 转于:http://rzcoding.blog.163.com/blog/static/2222810172013101895642665/ 在文本处理 ...
- python 文本相似度计算
参考:python文本相似度计算 原始语料格式:一个文件,一篇文章. #!/usr/bin/env python # -*- coding: UTF-8 -*- import jieba from g ...
- Python代码相似度计算(基于AST和SW算法)
代码相似度计算将基于AST和Smith-Waterman算法 AST (抽象语法树) AST即Abstract Syntax Trees,是源代码的抽象语法结构的树状表示,树上的每个节点都表示源代码中 ...
- Python OpenCV 图像相识度对比
强大的openCV能做什么我就不啰嗦,你能想到的一切图像+视频处理. 这里,我们说说openCV的图像相似度对比, 嗯,说好听一点那叫图像识别,但严格讲, 图像识别是在一个图片中进行类聚处理,比如图片 ...
- java算法(1)---余弦相似度计算字符串相似率
余弦相似度计算字符串相似率 功能需求:最近在做通过爬虫技术去爬取各大相关网站的新闻,储存到公司数据中.这里面就有一个技术点,就是如何保证你已爬取的新闻,再有相似的新闻 或者一样的新闻,那就不存储到数据 ...
- word2vec词向量训练及中文文本类似度计算
本文是讲述怎样使用word2vec的基础教程.文章比較基础,希望对你有所帮助! 官网C语言下载地址:http://word2vec.googlecode.com/svn/trunk/ 官网Python ...
- NLP 语义相似度计算 整理总结
更新中 最近更新时间: 2019-12-02 16:11:11 写在前面: 本人是喜欢这个方向的学生一枚,写文的目的意在记录自己所学,梳理自己的思路,同时share给在这个方向上一起努力的同学.写得不 ...
随机推荐
- C#中的类和继承
公众号「DotNet学习交流」,分享学习DotNet的点滴. 类继承 通过继承我们可以定义一个新类,新类纳入一个已经声明的类并进行扩展. 可以使用一个已经存在的类作为新类的基础.已存在的类称为基类(b ...
- vscode设置将英文界面设置为中文?
如果您希望将 Visual Studio Code(以下简称VSCode)的界面从英文设置为中文,可以按照以下步骤进行: 打开 VSCode 编辑器,并进入"扩展"菜单. 在搜索框 ...
- 用最清爽的方式开发dotNet
用最清爽的方式开发dotNet 不管是官方自带模板还是其他开源搞的,总是一来一大堆,如果你也嫌弃这些过于臃肿,不如看看我这个方式 前提 假设我要做一个简单的api 方式 想到清爽,那肯定是简单方便,脑 ...
- MongoDB入门级别教程全(Windows版,保姆级教程)
下载mongodb 进入官网: Download MongoDB Community Server | MongoDB 选择msi,Windows版本 下载完后直接双击: 选择complete 这里建 ...
- [ABC265D] Iroha and Haiku (New ABC Edition)
Problem Statement There is a sequence $A=(A_0,\ldots,A_{N-1})$ of length $N$. Determine if there exi ...
- c语言指针数组和数组指针
1 #include<stdio.h> 2 #include<iostream> 3 using namespace std; 4 int main(){ 5 int a[2] ...
- 2018年长沙理工大学第十三届程序设计竞赛 G 题:逃离迷宫
题目链接:https://www.nowcoder.com/acm/contest/96/G 思路:两遍bfs,找到p到k的情况,记录时间:找到E到k的情况,记录时间.题目超时点在于输入需要用scan ...
- MySQL运维15-一主一从读写分离
一.读写分离介绍 读写分离,是把数据库的读和写分开操作,以应对不同的数据库服务器.主数据库提供写操作,从数据库提供读操作,这样能有效的减轻单台数据库的压力. 二.一主一从原理 MySQL的主从复制是基 ...
- 基于注解玩转excel导出导入-基于注解玩转excel导出导入
title: 基于注解玩转excel导出导入 date: 2021-05-01 15:55:13.53 updated: 2021-12-26 17:43:19.505 url: https://ww ...
- Python——第四章:作用域
作用域: 变量的访问权限 全局变量 -> 全局作用域 局部变量 -> 局部作用域(比如在函数内定义的变量,只能在函数内调用) a = 10 # 全局变量 -> 全局作用域 print ...