一、素数的定义

​ 质数(prime number)又称素数,有无限个。除了1和它本身以外不再有其他的除数整除。从定义知道;1不是素数,最小的素数是2。

二、N以内素数常用实现方法

​ 首先教科书写法(暂时不做任何代码优化):

import math

def prime(n):

if n <= 1:

return 0

#for i in range(2,int(math.sqrt(n)+1)):

for i in range(2,n):

if n%i == 0:

return 0

return 1

if __name__ == "__main__":

n = int(input(">>"))

for i in range(2,n+1):

if prime(i):

print (i)

​ 代码中注释行是取了[2,√n+1]作为除数范围,通过对比测试,显然,[2,√n+1]范围下,效率快了很多。

三、优化方法

原理层面

​ 1、除了2以外,其余的偶数显然不可能是素数,再来看奇数,1不是素数,从3开始看,除了3以外,其余能被3整除的都是合数,再看5,除了5以外,其余能被5整除的都是合数,加起来,一共在[2,√n+1]范围内排除了近3/4的计算量。

​ 2、另外使用埃拉托斯特尼筛法(希腊语:κόσκινον Ἐρατοσθένους,英语:sieve of Eratosthenes ),简称埃氏筛,也有人称素数筛。这是一种简单且历史悠久的筛法,用来找出一定范围内所有的素数。

所使用的原理是从2开始,将每个素数的各个倍数,标记成合数。一个素数的各个倍数,是一个差为此素数本身的等差数列。

算式:

给出要筛数值的范围n,找出\sqrt{n}以内的素数 p1,p2,...,pk

先用2去筛,即把2留下,把2的倍数剔除掉;再用下一个素数,也就是3筛,把3留下,把3的倍数剔除掉;接下去用下一个素数5筛,把5留下,把5的倍数剔除掉;不断重复下去......。

Eratosthenes原理

def eratosthenes(n):

IsPrime = [True] * (n + 1)

IsPrime[1] = False

for i in range(2, int(n ** 0.5) + 1):

if IsPrime[i]:

for j in range(i * 2, n + 1, i):

IsPrime[j] = False

return {x for x in range(2, n + 1) if IsPrime[x]}

if __name__ == "__main__":

print (eratosthenes(n))

代码层面

第一种优化思路:

import math

def prime(n):

if n%2 == 0:

return n==2

if n%3 == 0:

return n==3

if n%5 == 0:

return n==5

for p in range(7,int(math.sqrt(n))+1,2): #只考虑奇数作为可能因子

if n%p == 0:

return 0

return 1

if __name__ == "__main__":

n = int(input(">>"))

for i in range(2,n+1): #1不是素数,从2开始

if prime(i):

print i

​ 再来实现第二种思路,代码如下:

#寻找n以内的素数,看执行时间,例子100000内的素数

def prime(n):

flag = [1]*(n+2)

p=2

while(p<=n):

print p

for i in range(2*p,n+1,p):

flag[i] = 0

while 1:

p += 1

if(flag[p]==1):

break

# test

if __name__ == "__main__":

n = int(input(">>"))

prime(n)

统一测试下差异很清楚。第二种方法要优于第一种,再优化下代码

首先,将range换成xrange,再测试下:两种方法速度都有提升。range和xrange的差异,range是一次性连续返回一个列表,而xrange是每次只生成一个,并且不保留上次生成的值。

​致命错误:

对于range(2*p,n+1,p),还有一种实现方法,range(2*p,n+1)[::p],但这两种写法,完全不相干,range(2*p,n+1,p)返回的列表就是按照p步长来生成的,而range(2*p,n+1)[::p],是生成了步长为1的列表,最后列表执行切片操作,只取p步长的值返回,显然没有range(2*p,n+1,p)的实现更为直接,两者虽然返回值一样,但经过实际测试发现,效率差异非常大,甚至可以颠覆算法的优势。

​在这几种方案中,最后一种速度最快,效率最高,但有个应用前提,就是待搜索列表必须是有序且连续的,所以比较适合N以内符合某条件的数字。

python求小于n的所有素数_关于求N以内素数的python实现以及优化方法相关推荐

  1. python中的数据分析库有哪些_全网最全数据分析师干货-python篇

    作者:胖熊酱 著作权归作者所有.AI开发者获得授权转载,禁止二次转载 https://zhuanlan.zhihu.com/p/79873148 注:封面图片来自网络 最近正在准备面试,故整理了很多面 ...

  2. python 相关性检验怎么计算p值_收藏 | 大神教你用Python预测未来:一文看懂时间序列...

    (由Python大本营付费下载自视觉中国) 作者 |  Leandro Rabelo 译者 | 李洁 整理 | Lemonbit 出品 | Python数据之道 本文内容较长,较为详细的阐述了进行时间 ...

  3. python协同过滤电影推荐的论文_协同过滤?教你用Python实现协同过滤

    提到ALS相信大家应该都不会觉得陌生,它是协同过滤的一种,并被集成到Spark的Mllib库中.本文就ALS的基本原理进行讲解,并手把手.肩并肩地带您实现这一算法. 协同过滤?教你用Python实现协 ...

  4. python算发必须有输出吗_数据时代为什么一定要学python+算法?

    感觉目前很多家长还是很有前瞻目光,小学的时候就让孩子学习python+算法,以前总感觉英语(和外国人沟通)很重要,但是现在感觉编程(和计算机沟通)更重要,现在计算机已经无处不在,伴随着人工智能的进一步 ...

  5. java生成大素数_用BigInteger实现大素数生成算法

    一.通过素数的基本性质 根据素数的性质(除了1和此整数(n)自身外,无法被其他自然数整除的数):即从2到n/2的数都不能整除n. 1 public static booleanisPrime(BigI ...

  6. python用于数据处理真的那么强大嘛_为什么有那么多人选择Python,真的有那么好吗?...

    Python真的有那么好吗 今天超模君讲的是4个关于Python编程语言的故事,来看看人工智能时代爆发的Python. 超模君在这里不会告诉你Python是"较好的编程语言"(无论 ...

  7. python金融实务从入门到精通_免费下载中-华尔街学堂:python金融实务从入门到精通,数据实战分析视频教程下载 价值599元...

    华尔街学堂:python金融实务从入门到精通 [4.5G] ┣━━第0章 课时 1 学员须知 [145.5M] ┃ ┗━━课时 2 课程讲义及学习资料 [145.5M] ┃ ┣━━data [92.3 ...

  8. 学了python结果还是找不到工作_痛彻心扉:学了半年 Python,还是找不到工作!...

    python算是高级语言里面入门比较简单的编程语言,集成度非常高,初学很容易培养形成自豪感,对于初学者是一种精神上的鼓励,短短的几行代码就能展示出很炫酷的功能对于初学者而言简直就是一种恩赐,对于零基础 ...

  9. python定义函数prime判断是否是素数_用自定义函数判断素数 用C语言编写自定义函数prime(int x),判断x是否为素数?...

    用C语言编写自定义函数prime(int x),判断x是否为素数? int prime(int x) { int i,k k=(int)sqrt( (double)x ) for(i=2i&l ...

  10. python求两数之和的命令_数学建模:科学计算Python2小时-Python基础

    这一部分主要面向数模活动中的python基础知识进行讨论 作者 系列文章(科学计算Python2小时)目录:李似:科学计算Python2小时-前言与目录​zhuanlan.zhihu.com 首先要说 ...

最新文章

  1. Mybatis复习笔记3:映射文件详解
  2. 安卓开发8-WebView支持文件上传
  3. memory align
  4. 抛开抑制思维飞跃的“枷锁”
  5. boost::fusion::traits用法的测试程序
  6. 【linux】查看字体
  7. 一个Android开发者开博一周年的成长日记——送给不知如何下手的【初级开发者】和【在校生】...
  8. php面向对象教学笔记,php学习笔记之面向对象编程
  9. MySQL子查询原理分析
  10. html做3d游戏进微波,射频微波电路设计.html(350页)-原创力文档
  11. 2.尽量用const, enum, inline代替#define -- Prefer const, enum, inline to #define.
  12. Zookeeper3.4.10使用Curator
  13. 无纸化民主测评考核系统领导班子干部微信二维码匿名评价投票打分平台
  14. 华为java安全编程规范考试答案
  15. amd opencl使用低版本驱动
  16. 微信订阅号利用订阅号助手发布信息
  17. Redis主从服务器安装配置
  18. UNITY TMP PRO 字体制作
  19. 第十二届蓝桥杯大赛软件赛省赛 Java 大学 B 组(2021年4月18日)
  20. 拼多多校招内推编程题3 六一儿童节

热门文章

  1. [转] android自定义布局中的平滑移动
  2. iphone GCDAsyncSocket 详解
  3. 回忆我的军训,好怀念那时啊!
  4. 2.Kong入门与实战 基于Nginx和OpenResty的云原生微服务网关 --- Kong 的安装和基本概念
  5. 24.Yii 组件行为
  6. E - Alignment
  7. Linux镜像资源收集
  8. oracle常用命令(比较常见好用)
  9. Javascript中相同Function使用多个名称
  10. MEncoder的基础用法——6.9. 将DVD子标题提取到VOBsub文件