厄拉多塞筛法的 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给在这个方向上一起努力的同学.写得不 ...
随机推荐
- 震荡指标(一)RSI指标
相对强弱指数RSI是根据一定时期内上涨点数和涨跌点数之和的比率制作出的一种技术曲线.能够反映出市场在一定时期内的景气程度.由威尔斯.威尔德(Welles Wilder)最早应用于期货买卖,后来人们发现 ...
- 文心一言 VS 讯飞星火 VS chatgpt (151)-- 算法导论12.2 7题
七.用go语言,对于一棵有 n 个结点的二叉搜索树,有另一种方法来实现中序遍历,先调用 TREE-MINIMUM 找到这棵树中的最小元素,然后再调用 n-1 次的 TREE-SUCCESSOR.证明: ...
- C和C++练习
要点: 1.数组 2.冒泡排序BubbleSort 3.带指针的结构体(malloc,free) 4.字符串操作(拷贝.逆序.比较) 5.格式化输出printf,sprintf 6.格式化输入,sca ...
- 华企盾DSC可能造成系统蓝屏奔溃常见处理方法
1.蓝屏先卸载我们DSC客户端检测是否是我们影响的 2.如果是我们影响的查到版本说明是否有处理过 3.是否有一些不常用的杀毒软件卸载试试 4.如果使用一些USB驱动类的先把USB的注册表改一下试试 5 ...
- 【算法】Java版
二分查找算法 二分查找算法(Binary Search Algorithm)是一种在有序数组中查找特定元素的搜索算法.该算法的基本思想是将数组从中间分成两部分,然后与目标元素进行比较,进而确定目标元素 ...
- 将MultipartFile对象转换成File对象
将MultipartFile对象转换成File对象 // 将MultipartFile对象转换成File对象 private File convertToFile(MultipartFile mult ...
- 假如这个地方可能为null,那他一定会为null
假如你的代码,在某个地方(比如controller层)提示你:这个方法调用可能会产生null,那么千万不要视而不见,在某一瞬间它一定会是null,势必报错. /** * 修改保存管理员 */ @Pos ...
- zabbix_agent配置文件
agent常用参数 : [root@jqebsdb zabbix]# cat zabbix_agentd.conf | grep -v ^$ | grep -v ^# PidFile=/var/ru ...
- 斯坦福 UE4 C++ ActionRoguelike游戏实例教程 10.控制台变量的用法 & 静态函数库 & 使用对象通道对碰撞进行控制
斯坦福课程 UE4 C++ ActionRoguelike游戏实例教程 0.绪论 概述 本文对应Lecture 15, 61 - Console Variables for debugging and ...
- Llama2-Chinese项目:8-TRL资料整理
TRL(Transformer Reinforcement Learning)是一个使用强化学习来训练Transformer语言模型和Stable Diffusion模型的Python类库工具集, ...