求1到n的所有质数(素数)

2023-11-19

1. 一般方法

定义一个空列表,双层循环实现。时间复杂高计算慢(时间复杂度为 O ( n 2 ) \mathrm{O}\left(\mathrm{n}^{2}\right) O(n2)

def naive_prime(n):
	result = []
	for i in range(2, n+1):
		if i == 2:
			result.append(i)
			continue
		for j in range(2, i):
			if i % j == 0:
				break
			else:
				if j == i - 1: 
					result.append(i)
	return result 
		

2. 埃拉托斯特尼筛法

[https://zh.wikipedia.org/wiki/埃拉托斯特尼筛法]
给出要筛数值的范围n,找出 n \sqrt{n} n 以内的素数 p 1 , p 2 , … , p k p_{1}, p_{2}, \dots, p_{k} p1,p2,,pk。先用2去筛,即把2留下,把2的倍数剔除掉;再用下一个素数,也就是3筛,把3留下,把3的倍数剔除掉;接下去用下一个素数5筛,把5留下,把5的倍数剔除掉;不断重复下去…。
如图:
在这里插入图片描述
图片来自 https://upload.wikimedia.org/wikipedia/commons/b/b9/Sieve_of_Eratosthenes_animation.gif
其时间复杂度为( O ( n ⋆ lg ⁡ lg ⁡ n ) O\left(n^{\star} \lg \lg n\right) O(nlglgn)

  • 算法实现
def my_prime(n):
    is_prime = [True] * (n + 1)
    for i in range(2, (int(n ** 0.5) +1)):
        if is_prime[i]:
            for j in range(i**2, n+1, i):
                is_prime[j] = False
    return [x for x in range(2, n) if is_prime[x]]

3. 两种算法所需时间的计算

用上述两种算法求1到100,1到1000, 1到10000的所有质数,计算两种算法的运行时间,评价其性能

  • 第一中算法花费的时间分别为
    [ 0.0001109 , 0.008414699999999999 , 0.609495 ] [0.0001109,0.008414699999999999,0.609495] [0.0001109,0.008414699999999999,0.609495]
  • 第二种算法花费的时间分别为
    [ 1.4600000000000003 e − 05 , 0.0001021000000000008 , 0.0010745000000000893 ] [1.4600000000000003 e-05,0.0001021000000000008,0.0010745000000000893] [1.4600000000000003e05,0.0001021000000000008,0.0010745000000000893]
    分别提速了
    [ 6.80555556 83.48502994 551.70287728 ] \left[\begin{array}{ccc}{} & {6.80555556} & {83.48502994} & {551.70287728 ]}\end{array}\right. [6.8055555683.48502994551.70287728]
    在这里插入图片描述
  • 程序汇总
import matplotlib.pyplot as plt
import seaborn as sns
import time as tm
import numpy as np
def my_prime(n):
    is_prime = [True] * (n + 1)
    for i in range(2, (int(n ** 0.5) +1)):
        if is_prime[i]:
            for j in range(i**2, n+1, i):
                is_prime[j] = False
    return [x for x in range(2, n) if is_prime[x]]

def naive_prime(n):
	result = []
	for i in range(2, n+1):
		if i == 2:
			result.append(i)
			continue
		for j in range(2, i):
			if i % j == 0:
				break
			else:
				if j == i - 1: 
					result.append(i)
	return result 
		

n = [100,1000,10000]
naive_time = []
advanced_time = []
for i in n:

    start_1 = tm.perf_counter()
    naive_prime(i)
    end_1 = tm.perf_counter()
    naive_time.append(end_1 - start_1)
    
    start_2 = tm.perf_counter()
    my_prime(i)
    end_2 = tm.perf_counter()
    advanced_time.append(end_2 - start_2)
print('naive_time ->>>>>>>>', '\n', naive_time)
print('advanced_time_time ->>>>>>>>', '\n', advanced_time)
print('提速了',(np.array(naive_time) -  np.array(advanced_time)) /  np.array(advanced_time))   
fig = plt.figure(figsize=(10,6))
time = [naive_time, advanced_time]
colors = ['red', 'blue']
label = ['naive_prime', 'advanced_prime']
for i in range(2):
    plt.plot(n, time[i], c=colors[i], label=label[i])
    plt.scatter(n, time[i], c=colors[i])
#添加图例,loc='upper left表示图例位置在最左侧,一般也可以直接使用loc='best'
plt.legend(loc='upper left')
plt.xlabel('number')
plt.ylabel('running time')
plt.title('velocity of two algorithm')
plt.show() 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

求1到n的所有质数(素数) 的相关文章

  • 《IT项目管理》-大题&计算题保分秘籍

    经过今天的努力 已经把大部分大题和计算题全部总结完了 希望对你们有用 查看链接自取 百度网盘 APP即可获取 链接 https pan baidu com s 1U0EFY23KgTtM8lKlYnjrug pwd tehx 提取码 teh
  • 软考-嵌入式系统设计师-笔记:历年专业英语题

    文章目录 2020年 2019年 2018年 2017年 2016年 2015年 2014年 2013年 2020年 题目 加粗的为各题答案 Fog computing is a mid layer between cloud data c
  • deepIn 、 DDE 系统桌面黑屏解决方案

    桌面黑屏有两种情况 1 桌面除了底部菜单栏 其它全是黑的 解决方案 Deepin sudo apt install reinstall dde DDE sudo apt fix broken install sudo apt install
  • 基于SpringBoot和vue的若依后台管理系统 部署

    RuoYi Vue是一款前后端分离的极速后台开发框架 基于SpringBoot和Vue 目录 一 准备 二 启动前端项目 解决报错 digital envelope routines unsupported 测试 三 启动后端项目 四 运行
  • 8个适合新手的Python小项目

    这是我挑出来的8个适合新手的小项目 涉及了爬虫 多线程 selenium PhantomJs itchat 邮件发送 crontab 命令行颜色显示 excel操作 PIL 识别验证码 首先说明 天下没有免费的午餐 每个项目平均下来2元多一
  • 根据子网掩码算出 IP 地址 的网络号和主机号

    我们如何根据子网掩码算出 IP 地址 的网络号和主机号呢 举个例子 比如 10 100 122 0 24 后面的 24表示就是 255 255 255 0 子网掩码 255 255 255 0 二进制是 11111111 11111111
  • Ant design Pro V5 +Typescript + Hooks + Umi + Dev + SpringBoot + mysql + redis + scrity 实现动态菜单权限管理

    Ant design Pro V5 Typescript Hooks Umi Dev SpringBoot mysql redis scrity 实现动态菜单权限管理 企业中台架构 1 app tsx页面配置 该页面集成了登陆权限控制 动态
  • Android实战系列(三)---级联菜单

    需求A 一级菜单 多级菜单联动 1 在activity上弹出多个pop窗口 达到父菜单与子菜单级联的效果 2 多个Activity页面相互的嵌套实现多级菜单 考虑 传值 数据结构的定义 之前在用前端写Android构造级联菜单出现过标题栏不
  • 算法系列15天速成——第八天 线性表【下】

    一 线性表的简单回顾 上一篇跟大家聊过 线性表 顺序存储 通过实验 大家也知道 如果我每次向 顺序表的头部插入元素 都会引起痉挛 效率比较低下 第二点我们用顺序存储时 容 易受到长度的限制 反之就会造成空间资源的浪费 二 链表 对于顺序表存
  • Finetuner+:为企业实现大模型微调和私有化部署

    如 ChatGPT GPT4 这样的大型语言模型就像是你为公司请的一个牛人顾问 他在 OpenAI Google 等大公司被预训练了不少的行业内专业知识 所以加入你的公司后 你只需要输入 Prompt 给他 介绍一些业务上的背景知识 他就能
  • 2021-01-08

    问题 F 有序数组中插入元素 时间限制 1 Sec 内存限制 128 MB 提交 2116 解决 967 提交 状态 讨论版 题目描述 输入n n lt 20 输入n个有序整数 降序或升序 插入元素e 使新序列仍按原来的排序规则为有序序列
  • 【Java】Java中的String类

    文章目录 一 认识 String 类 二 String 类的常用方法 2 1 构造方法 2 2 String 类对象之间的比较 2 3 字符串查找 2 4 字符串的转换 2 5 字符串替换 2 6 字符串拆分 2 7 字符串截取 2 8 字
  • Java语言 ASCII to Hex 互转(IOT-示例)

    概述 最近想起之前做的IOT项目 使用JAVA写了一个
  • libcurl交叉编译支持https

    简介 libcurl是一个跨平台的网络协议库 支持dict file ftp ftps gopher http https imap imaps pop3 pop3s rtsp smb smbs smtp smtps telnet tftp
  • Android Ble 连接设备失败 onConnectionStateChange status 返回133

    Android Ble 连接设备失败时回调函数 onConnectionStateChange status 返回133 开始找问题 各种mac地址 权限 线程 找了个遍 结果就是返回纹丝不动 又因为 mBluetoothGatt mBlu
  • BUUCTF [极客大挑战 2019]Knife

    打开一看结合题目 就是连接一下菜刀蚁剑 菜刀没用过只有蚁剑 下面用蚁剑实现 设置好URL和链接密码 找到flag文件 打开后找到flag 文件上传漏洞 一句话木马 php Asp Aspx 前端判断文件后缀名可以Burp Suite配置好P
  • pygame小游戏之飞机拼音大作战( 送给娃学拼音的礼物,星际旅行)

    二娃再过一年就该上一年级了 但现阶段的拼音咋都学不进去 买了拼音挂图贴在墙上 拉都拉不到旁边 突发奇想 何不用python的pygame做个小游戏 在玩中也能学习 让学变得有趣 这对搞编程的来说小菜一碟 于是说干就干 两个晚上就成型啦 这里

随机推荐

  • 如何使用条件格式在Excel中突出显示行

    Conditional formatting lets you format cells in an Excel spreadsheet based on the cells content For example you could ha
  • 程序员在囧途之垃圾创业团队

    以前 空虚和寂寞 时写的一篇通过真实案例进行 小说化改编 文 原型中的 我 并不完全代表作者本人 特此拿出和大家分享 也与自己共勉 正文 这年头互联网创业有两个人就算一个团队了 如果是精英组成的团队往往两个人能抵得上十个人 但如果是一帮平庸
  • 接口测试postman和python代码实现

    postman是一个做接口测试的工具 它是谷歌公司的 可谓是根正苗红的大家族 在接口测试领域和它拼的一个手指头也能数得出来 POSTMAN本只是Chrome的一个插件工具 后来谷歌老爹看着小家伙越来越受测试工程师的喜爱 名气越来越大 便做了
  • 【Detectron2】入门03 Faster RCNN + VOC

    在detectron2 data datasets builtin py中可以看到在DatasetCatelog上各个数据集的注册 其中 root即为数据集的基地址 代码指明 root要么是DETECTRON2 DATASETS 要么是da
  • Beyond Compare使用和安装教程

    一 背景 Beyond Compare是一款文件和文件夹比较工具 它能够比较和同步文件夹和文件 并显示它们之间的差异 方便用户决定如何更新和管理它们 Beyond Compare的主要用途包括 文件和文件夹比较 用户可以将两个文件或文件夹进
  • 九种常见排序的比较和实现

    首先排序算法大的可以分为 关键字比较 非关键字比较 关键字比较 关键字比较就是通过关键字之间的比较和移动 从而使整个序列有序 而关键字比较的算法 又可以像下面这样划分 对于排序算法之间的比较 无异于时间复杂度和空间复杂度 看下面这张表格 由
  • OpenCV读取视频并获得相关属性信息

    使用VideoCapture读取视频 video cv2 VideoCapture r prototype mp4 通过下代码确定视频是否读取成功 is open video isOpened 读取成功后 通过VideoCapture ge
  • css实现响应式布局

    一 什么是响应式布局 响应式布局指的是同一页面在不同屏幕尺寸下有不同的布局 传统的开发方式是PC端开发一套 手机端再开发一套 而使用响应式布局只要开发一套就够了 响应式设计与自适应设计的区别 响应式开发一套界面 通过检测视口分辨率 针对不同
  • JQuery使用

    JQuery 框架 注意事项 在导入JQUREY外部文件的时候不可以使用自闭合标签 无效化导入且不报错 不可使用此方式加载 jQuery框架特点 免费开源 轻量级框架 占用资源少 运行速度快 宗旨 write less do more jQ
  • python下载安装教程(Python 3.10版本)

    目录 一 Python下载 二 Python安装 三 检查Python是否安装成功 今天换了新的电脑 需要重新安装python和PyCharm 就简单的写个教程吧 一 Python下载 1 进入Python官网 官网地址 https www
  • 使用http携带token请求第三方接口 并封装参数以post方式请求

    首先准备条件 1 四个jar包 fastjson 1 2 3 jar commons io 2 4 jar commons httpclient 3 1 jar httpcore 4 3 jar slf4j api 1 7 7 jar 这个
  • 范围for语句

    C 新标准提供的范围for语句 这种语句遍历给定序列中个元素并对序列中每一个值执行某种操作 其语法形式是 for declaration expression statement 其中 expression 部分是一个对象 用于表示一个序列
  • tp5 生成随机数

    控制器调用 public function GetRanStr if request gt isPost 生成6位数随机数 return GetRandStr 6 公共方法 生成随机数 param len return string fun
  • 常用与业务密切相关的prompt

    可以在 Bard Bing Claude 2 ChatGPT和 Llama 2 上使用 定义您的业务目的和愿景 提示 我正在 插入行业 创业 我的重点是定义与我的受众产生共鸣的明确目标和愿景 你能指导我制定有意义的愿景声明吗 研究和分析您的
  • android通过JNI用C/C++创建本地文件

    通过jni在本地创建文件 1 在android studio创建基本的jni工程 并且在APP界面成功显示 Hello from C 不会的可以看android studio使用jni 2 在native lib cpp文件中创建文件 为了
  • eclipse导入项目后,项目报红叉的解决方法

    导入项目后 项目报红叉的解决方法 导入别人的项目后 一般都会报错 我之前尝试build path 发现并没有问题 后来发现 点击项目右键 properties 把服务加上Apply and Close就可以了
  • Spring(三):JavaBean的生命周期

    JavaBean的生命周期 一 基本概念 bean 就是由IOC 容器初始化 装配及管理的对象 Spring中的bean默认都是单例的 那么单例Bean在多线程程序下如何保证线程安全呢 Spring的单例是基于BeanFactory也就是S
  • 音视频学习笔记(雷神)—技术解析

    音视频技术解析 封装技术 视频压缩编解码 音频压缩编解码 这是技术层 流媒体传输协议 这是网络层 视频播放器解析 解协议 从视频播放器的角度做解析 拿到传输而来的视频数据后 首先要解协议 传输协议 自然的本地视频经过硬盘传输数据自然没有解协
  • 关于UI适配的文档

    第一部分 原理 1 根据当前屏幕尺寸与开发预设屏幕尺寸尺寸得出以下参数 1 XRatio 当前屏幕尺寸与开发尺寸的X轴比例 2 YRtaio 当前屏幕尺寸与开发尺寸的Y轴比例 3minRatio XRatio与YRtaio中的较小值 2 之
  • 求1到n的所有质数(素数)

    1 一般方法 定义一个空列表 双层循环实现 时间复杂高计算慢 时间复杂度为 O n 2 mathrm O left mathrm n 2