判断质数/素数——我知道的最快的方法

判断质数/素数——我知道的最快的方法标准版 大部分人都知道的比较快的方法 判断从 2 到 sqrt n 是否存在其约数 时间复杂度 O sqrt n 高配版 判断 2 之后 就可以判断从 3 到 sqrt n 之间的奇数了 无需再判断之间的偶数 时间复杂度 O sqrt n 2 尊享版 首先看一个关于质数分布的规律 大于等于 5 的质数一定和 6 的倍数相邻 例如 5 和 7 11 和 13 17 和 19 等等 证明 令 x 1 将大于等于 5 的自然数

标准版:大部分人都知道的比较快的方法:判断从2到sqrt(n)是否存在其约数,时间复杂度O(sqrt(n))

高配版:判断2之后,就可以判断从3到sqrt(n)之间的奇数了,无需再判断之间的偶数,时间复杂度O(sqrt(n)/2)

尊享版:

首先看一个关于质数分布的规律:大于等于5的质数一定和6的倍数相邻。例如5和7,11和13,17和19等等;

证明:令x≥1,将大于等于5的自然数表示如下:

··· 6x-1,6x,6x+1,6x+2,6x+3,6x+4,6x+5,6(x+1),6(x+1)+1 ···

可以看到,不和6的倍数相邻的数为6x+2,6x+3,6x+4,由于2(3x+1),3(2x+1),2(3x+2),所以它们一定不是素数,再除去6x本身,显然,素数要出现只可能出现在6x的相邻两侧。因此在5到sqrt(n)中每6个数只判断2个,时间复杂度O(sqrt(n)/3)。

在高配版和尊享版中,都是一个剪枝的思想,高配版中裁剪了不必要的偶数,尊享版中裁剪了不和6的倍数相邻的数,虽然都没有降低时间复杂度的阶数,但都一定程度上加快了判断的速度。

在此给出尊享版C++代码:

#include 
  
    #include 
   
     using namespace std; int isPrime(int n) { //返回1表示判断为质数,0为非质数,在此没有进行输入异常检测 float n_sqrt; if(n==1) return 0; if(n==2 || n==3) return 1; if(n%6!=1 && n%6!=5) return 0; n_sqrt=floor(sqrt((float)n)); for(int i=5;i<=n_sqrt;i+=6) { if(n%(i)==0 | n%(i+2)==0) return 0; } return 1; } int main() { int flag; flag=isPrime(37); cout< 
     
    
  

python 版代码参考:https://github.com/hichenway/UsefulCode/blob/master/isPrimeFunction.py

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/213343.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午6:03
下一篇 2026年3月18日 下午6:03


相关推荐

  • 内网穿透 隧道_内网渗透攻击

    内网穿透 隧道_内网渗透攻击本文研究DNS隧道的一个经典工具,iodine

    2025年7月5日
    5
  • 超级小爱是接入豆包模型吗

    超级小爱是接入豆包模型吗

    2026年3月12日
    1
  • Android中bindService的使用及Service生命周期

    Android中bindService的使用及Service生命周期Android中有两种主要方式使用Service,通过调用Context的startService方法或调用Context的bindService方法,本文只探讨纯bindService的使用,不涉及任何startService方法调用的情况。如果想了解startService相关的使用,请参见《Android中startService的使用及Service生命周期》。bindService启动服务

    2022年6月9日
    81
  • PyCharm使用教程(详细版 – 图文结合)

    PyCharm使用教程(详细版 – 图文结合)目录一 创建项目二 运行三 错误提示四 安装三方包 PyCharm 的使用贯穿整个 Python 的学习 所以单独拿出来出教程不合适 说多了对于新手来说也还是不明白 这里我们先从学习开始前大家需要用到 PyCharm 的一些功能讲起 后面的 python 视频教程中我们会带着给大家讲更高级一点的用法 上一节课我们已经安装好 PyCharm 了 这里就不多说了 先从创建项目讲起 一 创建项目 1 我们每次新开发一个项目之前都要创建一个环境 这里打开 PyCharm 直接点击 CreateNewPro

    2026年3月27日
    1
  • SQL——coalesce函数详解「建议收藏」

    SQL——coalesce函数详解「建议收藏」最近写SQL的过程中,学习到一个非常有用的函数:coalesce。特别是在做统计的时候,这个函数作为条件可以兼顾到一些特殊情况。这里做一下总结和分享。用途:(1):将控制替换成其他值;(2):返回第一个非空值表达式COALESCE是一个函数,(expression_1,expression_2,…,expression_n)依次参考各参数表达式,遇到非null值即停止并返…

    2022年8月20日
    10
  • maven快照更新策略_eclipse更新maven包

    maven快照更新策略_eclipse更新maven包1、为什么会有快照?开发中,A项目依赖于项目B,没有快照时,B每次改动我们就需要赋予给他一个新版本号,然后在A的pom.xml中修改B的版本,这不仅浪费版本号,而且会带来很多的沟通成本。快照就是为了解决这个问题而生的,每次B发布到私服,maven都会将B打上时间戳,A更新时会检查B的时间戳,如果晚于本地仓库B的时间戳,那么就会进行更新。2、快照更新策略注意,快照并不是每次ins

    2022年10月4日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号