目录

定义

1 常规方法判断

2 最有效方法判断

3 测试


定义

约数只有1和本身的整数称为质数,或称素数。

1 常规方法判断

根据定义,因为质数除了1和本身之外没有其他约数,所以判断n是否为质数,根据定义直接判断从2到n-1是否存在n的约数即可。

Java代码如下:

 /*** 判断是否为素数/质数的常规方法* 判断n是否为素数,根据定义直接判断从2到n-1是否存在n的约数即可* @param num* @return*/public static boolean isPrimeNormal(int num) {for(int i=2; i<num; i++) {if(num%i == 0) {return false;}}return true;}

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两侧的数为6x+2,6x+3,6x+4,由于2(3x+1),3(2x+1),2(3x+2),所以它们一定不是素数,再除去6x本身,显然,素数要出现只可能出现在6x的相邻两侧。

另外,我们知道,一个数若可以进行因数分解,那么分解时得到的两个数一定是一个小于等于sqrt(n),一个大于等于sqrt(n),据此,上述代码中并不需要遍历到n-1,遍历到sqrt(n)即可,因为若sqrt(n)左侧找不到约数,那么右侧也一定找不到约数。

Java代码如下:

 /*** 判断是否为素数/质数的最有效方法* 1.小于5的2和3* 2.大于等于5的素数一定和6的倍数相邻,例如5和7,11和13,17和19等等。* @param num* @return*/public static boolean isPrime(int num) {//两个较小数另外处理 if(num==2 || num==3) {return true;}//不在6的倍数两侧的一定不是素数if(num%6!=1 && num%6!=5) {return false;}int tmp = (int) Math.sqrt(num);//获取平方根//在6的倍数两侧的也可能不是素数for(int i=5; i<=tmp; i+=6) {if(num%i==0 || num%(i+2)==0) {return false;}}return true;}

下面来看下,这两个方法的性能测试:

 public static void main(String[] args) {int testNum = 1000000;//常规方法测试long start1 = Calendar.getInstance().getTimeInMillis();for(int i=0; i<testNum; i++) {isPrimeNormal(i);}long end1 = Calendar.getInstance().getTimeInMillis();System.out.println("常规方法,消耗时长(ms):" + (end1 - start1));//最有效方法测试long start2 = Calendar.getInstance().getTimeInMillis();for(int i=0; i<testNum; i++) {isPrime(i);}long end2 = Calendar.getInstance().getTimeInMillis();System.out.println("最有效方法,消耗时长(ms):" + (end2 - start2));}

3 测试

测试结果如下:

最后,注明下此算法思想出自:https://blog.csdn.net/huang_miao_xin/article/details/51331710

判断素数最有效的算法相关推荐

  1. 判断素数/质数的快速算法

    质数(Prime number),又称素数,指在大于1的自然数中,除了1和该数自身外,无法被其他自然数整除的数(也可定义为只有1与该数本身两个因数的数).--via维基百科 朴素算法: 1. def ...

  2. 判断素数———两种高效算法

    相信大家在学习的过程中,时不时就会遇到判断素数的问题.今天就让我们来讨论讨论这个有趣的数学问题,看看如何更高效的来解决它吧! 在刚开始接触到这个问题时,我只想到了利用一个循环去在目标数的全部范围内一个 ...

  3. 判断素数(质数)高效算法

    最近看到一篇高效的素数判断算法文章,但是文章中有些部分写的还不够完整清晰,所以在此详细记录一下此算法理解过程.(理解此算法前应先明白使用 sqrt(num) 为判断条件判断素数的方法) 此算法产生的原 ...

  4. 算法——如何快速判断素数?

    文章目录 前言 解决方案 方案1 方案2 方案3(最优算法) 总结 前言 最近闲来无事,刷刷题,碰到这样一个题目: 需求:要求实现一个判断素数的简单函数 相关信息:素数就是只能被1和自身整除的正整数. ...

  5. 判断素数的快速算法 sqrt()

    我们在日常判断素数的程序中常用到如下代码 //判断数num是不是素数 for(i=2;i<num;i++){if(num%i==0)return 0;return 1; } 这样写无疑是没有问题 ...

  6. 判断素数及其算法优化

    首先,我们要清楚什么是素数? 素数:又称质数,一个大于1的自然数,除了1和它本身外,不能被其他自然数整除,换句话说就是该数除了1和它本身以外不再有其他的因数;否则称为合数. 根据素数的定义,我们可以写 ...

  7. 【C语言】判断素数的算法从一般到高效

    在刚开始学习使用C语言时,通过练习编程来提高对语法的思考是一个很不错的方法.判断素数是一个非常适合刚刚开始学习的我们练习的.下面我给大家简绍几种判断素数的方法及参考代码. 一.暴力方法 在数学中我们知 ...

  8. c语言判断素数squ,poj1811——Prime Test//素数判断+整数分解因子

    题意:给定N,如果N为素数,输出"Prime",否则输出其最小因子. 思路:用miller_rabin判断素数,pollardRho用于整数因子的分解.整数因子分解还有一个更快的算 ...

  9. 费尔马小定理素数java_利用费马小定理判断素数

    今天听了ljss神犇的数论课,顿时感觉----我真的是太弱啦! 我只能稍微写一下我能听懂的部分orz 那么这就是今天我为数不多能听懂一点的之一......QAQ 首先先介绍今天的主角:费马小定理 -- ...

最新文章

  1. 准确率不变 损失率下降_最新斯诺克排名奥沙利文排在第二,丁俊晖排第十,第一保持不变...
  2. scikit_image
  3. 在java中会存在内存泄漏吗?
  4. 研制一个生产计划编制的软件
  5. Linux下安装MongoDB3.2.5(自测)
  6. VMware竟然出了一款防火墙
  7. HWM和delete,drop,truncate的关系
  8. OV7670摄像头模块资料
  9. linux中安装程序的命令是,Linux安装软件命令是什么
  10. 2022年餐具行业市场分析
  11. 【Python+Stata】豪斯曼检验:固定效应or随机效应?
  12. NLP - sentencepiece
  13. itunes未能连接到iphone软件更新服务器,iTunes无法联系iphone软件更新服务器 不可连接解决方法...
  14. 华为云k8s环境部署应用
  15. vue 如何获取图片的原图尺寸_js获取图片信息(一)-----获取图片的原始尺寸
  16. 【Linux网络编程】域名转IP后的一些深层(计算机底层)的思考
  17. 免费使用谷歌的深度学习云服务
  18. jsp标签与指令总结
  19. 前端学习随笔 css篇
  20. 国家电网:企业数字化发展的“3-3-4”框架!

热门文章

  1. Webmin--Webmin Configuration模块
  2. 微软的私有云存储协议SMB 3.0的多通道应用
  3. 真正能在手机上用的mysql软件_太牛逼了!一款软件几乎可以操作所有的数据库!...
  4. 3-MongoDB常用的命令-数据库创建-文档插入
  5. 闭包 closure
  6. 有趣的 CentOS 7 命令
  7. 从mq服务器中获取消息命令,WebSphere MQ 入门指南
  8. MySQL 源码分析 binlog 编号上限
  9. Android状态栏微技巧,带你真正意义上的沉浸式
  10. 浏览器内核-一张图看懂