1. 一般方法

定义一个空列表,双层循环实现。时间复杂高计算慢(时间复杂度为O(n2)\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)continuefor j in range(2, i):if i % j == 0:breakelse:if j == i - 1: result.append(i)return result 

2. 埃拉托斯特尼筛法

[https://zh.wikipedia.org/wiki/埃拉托斯特尼筛法]
给出要筛数值的范围n,找出n\sqrt{n}n​以内的素数p1,p2,…,pkp_{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(n⋆lglgn))

  • 算法实现
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] = Falsereturn [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.4600000000000003e−05,0.0001021000000000008,0.0010745000000000893][1.4600000000000003 e-05,0.0001021000000000008,0.0010745000000000893] [1.4600000000000003e−05,0.0001021000000000008,0.0010745000000000893]
    分别提速了
    [6.8055555683.48502994551.70287728]\left[\begin{array}{ccc}{} & {6.80555556} & {83.48502994} & {551.70287728 ]}\end{array}\right. [​6.80555556​83.48502994​551.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] = Falsereturn [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)continuefor j in range(2, i):if i % j == 0:breakelse: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() 

求1到n的所有质数(素数)相关推荐

  1. 求1到100之间的质数(素数)?

    求1到100之间的质数(素数) 用到知识:双层for循环,if判断 常识:2是最小的质数,质数的定义:除1和本身没有其他因数的数 思路:如何判断5是不是质数,用5分别对2,3,4取余,发现没有余数,说 ...

  2. python实现求质数(素数)

    python实现求质数(素数) 素数(质数):我们把公约数只有1和它本身的数字称为素数又称为质数,具体使用python的求法如下: num = [] # 定义一个空列表用来接收找到的符合条件的数字 f ...

  3. 求质数(素数)的方法

    质数是数学重要的一环,所谓质数,就是除了1和它本身外不存在任何因子的数.以下整理了一下c语言中质数的求法. 问题:输入一个正整数n(n>=2),求不大于n的全部质数 方法一:循环法 思路:判断一 ...

  4. 求不大于n的全部质数(素数 C++)

    题目描述 输入正整数n(n>=2),求不大于n的全部质数 代码 [方法一](定义法直接求) #include <iostream> using namespace std;int m ...

  5. MySQL素数怎么,求质数(素数)的方法

    质数是数学重要的一环,所谓质数,就是除了1和它本身外不存在任何因子的数.以下整理了一下c语言中质数的求法. 问题:输入一个正整数n(n>=2),求不大于n的全部质数 方法一:循环法 思路:判断一 ...

  6. C#筛法求出范围内的所有质数

    科普篇:筛法是一种简单检定素数的算法.据说是古希腊的埃拉托斯特尼(Eratosthenes,约公元前274-194年)发明的,又称埃拉托斯特尼筛法(sieve of Eratosthenes). 说实 ...

  7. python质数判断if isprime_使用Python判断质数(素数)的简单

    这篇文章主要介绍了使用Python判断质数(素数)的简单方法讲解,经常被用来做科学计算的Python处理这种小问题当然手到擒来^_-需要的朋友可以参考下 质数又称素数.指在一个大于1的自然数中,除了1 ...

  8. 【模板小程序】求M~N范围内的质数个数

    1 /* 2 本程序说明: 3 4 [编程题] 求素数 5 时间限制:2秒 6 空间限制:32768K 7 输入M.N,1 < M < N < 1000000,求区间[M,N]内的所 ...

  9. python判断素数的函数_使用Python判断质数(素数)的简单方法讲解

    质数又称素数.指在一个大于1的自然数中,除了1和此整数自身外,不能被其他自然数整除的数.素数在数论中有着很重要的地位.比1大但不是素数的数称为合数.1和0既非素数也非合数.质数是与合数相对立的两个概念 ...

  10. python求m和n之间的所有素数_C语言求助,《求m和n之间的所有素数》

    题目: C语言求助,<求m和n之间的所有素数> [问题描述] 输入两个正整数m和n(m≥1,n≤500),输出m和n之间的所有素数,每行输出6个。素数是指只能被1和自身整除的正整数,最小的 ...

最新文章

  1. 解决 Maven 依赖冲突的好帮手,必须了解一下!
  2. RDKit入门与进阶教程(30篇)
  3. MYSQL交通系统查询,城市公交查询系统的设计与实现(SSH,MySQL)(含录像)
  4. Python报错:UnicodeDecodeError:‘ascii‘ codec can‘t decode byte 0xe8 in position
  5. zabbix v3.0安装部署【转】
  6. Centos6.9下RocketMQ3.4.6高可用集群部署记录(双主双从+Nameserver+Console)
  7. 互联网女皇报告:拼多多美团崛起,支付宝微信同台竞技!
  8. CUDA精进之路(一):图像处理——大图像分块处理(包括求均值、最大值)
  9. Windows 2008 R2 安装 Windows phone 7 开发环境
  10. 求矩阵不靠边元素之和_机器(深度)学习数学知识之范数
  11. cemtos7重置mysql root,Centos7重置MySQL8.0 root密码
  12. 转载:EM算法的最精辟讲解
  13. R语言plotly可视化:使用plotly可视化模型预测概率值的直方图、使用分类标签为阴性和阳性样本预测概率直方图进行颜色区分(prediction probability histogram)
  14. 基于TCP的网络应用程序
  15. Python教你一键获得【王者荣耀全皮肤】~~~
  16. 导出pdf内容包换特殊符号,或转行符号等解决方法
  17. 修复图片音频全新升级带特效喝酒神器小游戏微信小程序源码下载
  18. 拉格朗日方法求最优解
  19. 物联网-物联前端安全加密技术简介
  20. 一起学英语第二季第六期

热门文章

  1. 【高等数学笔记】拉格朗日乘数法(Lagrange Multiplier Method):其实也没那么难嘛
  2. excel快速选择数据的4种方法
  3. 如何同时对多个 Word 文档批量插入页眉页脚、修改页眉页脚以及添加页码
  4. 一招让你的百度网盘免费不限速下载,每秒宽带满速下载
  5. 办公室电脑里的文件和家里电脑的文件同步,有什么便签软件可以实现
  6. Perfectly Clear Complete V3 mac(ps/lr智能修图插件)破解版
  7. 如何在word中找到标准偏差σ、α、β、δ等数学公式符号和物理公式符号
  8. pillow图像格式转化和缩放操作
  9. python 读取png图片 透明度
  10. 关于医学影像中的轴位面(横断面)、冠状面、矢状面的解释(转载)