python高效的素数判断算法

 更新时间:2021年04月07日 11:46:06   作者:木偶小佐  
这篇文章主要介绍了python高效的素数判断算法,研究算法的同学一定要看一下

高效素数判断算法

算法概述

此算法将其他博主对基本素数算法的一些改进进行了整合,其中主要整合了如下三条规则:

1.大于3的素数一定在6的倍数前一个或后一个(如素数37在36的后面)

2.要判断n是否为素数,只需要让n从2开始,依次除到根号n即可

3.在进行“让n从2开始,依次除到根号n”过程中,若n除以2的余数不为0,可以直接跳过[2, sqrt(n)]里面的所有偶数

博主语文素养不高,表达不是很准确,在后面会对这三条规则进行解释。

规则详解

1.大于3的素数一定在6的倍数前一个或后一个(如素数37在36的后面)

  • 数学证明:

任意一个整数n可以表示为n = 6a + b ( 0 <= b <= 5, a >= 0 ),接下来依次讲当n等于0到5的情况,以对此结论进行证明:

当n = 6a + 0 = 6a时,n有一个不为1及其本身的因数(素数判断条件)6,此类数不为素数

当n = 6a + 2 = 2( 3a + 1 )时,n有一个不为1及其本身的因数(素数判断条件)2,此类数不为素数

当n = 6a + 3 = 3( 2a + 1 )时,同上,有一因数3,此类数也不为素数

当n = 6a + 4 = 2( 3a + 2 )时,有一因数2, 此类数也不为素数

而当n = 6a + 1 或 n = 6a + 5时,不能绝对确定n是否为素数,需要考虑a的取值,显然此时的数值n就是分布在6的倍数前一个或后一个

总结:大于3的素数一定分布在6的倍数前后

  • 此规则可以直接对素数进行初步筛选,不符合此规则的数可直接判定为非素数,直接减少了2/3的运算量,效率提高肉眼可见
  • 注意小于等于3的素数(2, 3)需要另外判断

2.要判断n是否为素数,只需要让n从2开始,依次除到根号n即可

最基本的素数判断方法是:让n从2开始除,依次除到n - 1,如果每次除出来的结果余数皆不为0,那么此数n即为素数
实际上并不需要从除以[2, n - 1]区间的所有整数,只需除以[2, sqrt(n)]

3.在进行让n除以[2, sqrt(n)]区间内的所有整数操作时,如果2不是n的一个因数,那么之后可以不判断[2, sqrt(n)]区间的所有偶数

数学证明:当n/2除不尽时,n除以[2, sqrt(n)]区间内的所有偶数都除不尽

因此如果n不能将2除尽,那么之后的偶数一样除不尽,可以直接不除
如果将2除尽了,n就不是素数,直接排除
如果没有将2除尽,之后的计算量直接减半,肉眼可见的效率提升

算法时间复杂度复杂度

1.最基础的算法:也就是让n从2开始判断,一直到n-1

若遇到的数是素数时,此时需要进行n-2次判断
当遇到的不是素数时,要进行a(2<a<n-2)次判断
也就是说时间复杂度为n

2.改进后的算法:

根据规则二,判断素数只要从[2,sqrt(n)]即可,此时复杂度为sqrt(n)
根据规则3,无论如何都可以不判断2之后的偶数(当n大于2,当n除尽2时,n不为素数,之后不需要判断,如果n除不尽2时,之后的偶数不要判断)
假设n可以除尽2和不可以除尽2概率相等,那此时复杂度为sqrt(n)/4
根据规则一,只有1/3的数要进行判断,此时复杂度为sqrt(n)/12
也就是说时间复杂度为sqrt(n)/12

在计算过程中做出的假设以及计算过程并不那么严谨,此结果仅供参考

Python代码实现

def primeJudge(n):
 #先将数分为三类, 小于等于1,大于1小于5,和大于等于5
 #非整数统统不是素数
 if not isinstance(n, int): return False
 #小于1等于的都不是素数
 if n <= 1: return False
 #大于1小于5
 elif n == 2 or n == 3: return True
 #大于等于5
 elif n >= 5:
  #先判断是否在6的附近
  if n % 6 == 5 or n % 6 == 1:
   #再判断是否可以将2除尽
   #可以的话不是素数
   if n % 2 == 0: return False
   else:
    #不可除尽2,直接跳过所有偶数
    for i in range(3, int(sqrt(n) + 1), 2):
     if n % i == 0: return False
    #经过筛选即为素数
    return True
  #不在6的附近不是素数
  else: return False

以上就是python高效的素数判断算法的详细内容,更多关于python素数算法的资料请关注脚本之家其它相关文章!

相关文章

  • Python子类继承父类构造函数详解

    Python子类继承父类构造函数详解

    在本文里我们给大家分享一篇关于Python 子类继承父类构造函数的相关知识点内容,需要的朋友们跟着学习下。
    2019-02-02
  • python通过微信发送邮件实现电脑关机

    python通过微信发送邮件实现电脑关机

    这篇文章主要为大家详细介绍了python通过微信发送邮件实现电脑关机,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-06-06
  • 如何查看python中安装库的文件位置

    如何查看python中安装库的文件位置

    这篇文章主要介绍了查看python中安装库的文件位置的方法,python自带标准库位置在安装环境的lib文件夹下的.py文件都是,在环境的lib文件夹中,本文给大家详细讲解需要的朋友可以参考下
    2022-11-11
  • Django框架cookie和session方法及参数设置

    Django框架cookie和session方法及参数设置

    这篇文章主要为大家介绍了Django框架cookie和session参数设置及介绍,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-03-03
  • python实现图像处理之PiL依赖库的案例应用详解

    python实现图像处理之PiL依赖库的案例应用详解

    这篇文章主要介绍了python实现图像处理之PiL依赖库的案例应用详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • Python对字符串实现去重操作的方法示例

    Python对字符串实现去重操作的方法示例

    字符串去重是python中字符串操作常见的一个需求,最近在工作中就又遇到了,所以下面这篇文章主要给大家介绍了关于Python对字符串实现去重操作的相关资料,文中给出了详细的介绍,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-08-08
  • python使用布隆过滤器的实现示例

    python使用布隆过滤器的实现示例

    这篇文章主要介绍了python使用布隆过滤器的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • 使用pandas生成/读取csv文件的方法实例

    使用pandas生成/读取csv文件的方法实例

    在使用Pandas处理数据时,常见的读取数据的方式时从Excel或CSV文件中获取,这篇文章主要给大家介绍了关于如何使用pandas生成、读取csv文件的相关资料,需要的朋友可以参考下
    2021-07-07
  • jupyter notebook 重装教程

    jupyter notebook 重装教程

    这篇文章主要介绍了jupyter notebook 重装教程,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-04-04
  • Flask框架学习笔记(一)安装篇(windows安装与centos安装)

    Flask框架学习笔记(一)安装篇(windows安装与centos安装)

    Flask是一个轻量级的Web应用框架, 使用Python编写。Flask也被称为 “microframework” ,因为它使用简单的核心,用 extension 增加其他功能。
    2014-06-06

最新评论