得到质数序列

  • 首页
  • 博客
  • 学院
  • 下载
  • GitChat
  • TinyMind
  • 商城
  • VIP
Chely 的博客
如何判断一个数是否为质数&得到质数序列

数的定义是:只能被1和本身整除而不能被其他数整除。(好了好了,这个初中生都知道……)

断一个数n是不是素数,最靠谱的方法就是用所有小于n的数来一个一个检测是不是能被n整除。不过稍微聪明一点的办法是只要用小于k = floor(sqrt(n))//取不大于n的平方根的最大整数的数来检测就可以了。原因如下:k^2 < n,而(k+1)^2 > n,假设是 k(k+1) = n,但是这个时候只要用k检测过就可以判断是不是为质数了,不需要用k+1。同样如果是k(k+2),k(k+3)一样的。

函数代码如下:

public static boolean isPrime(int a) {  
        if (a <= 2) 
            return false;  
        else {  
            int max =  (int) Math.floor( Math.sqrt(n)); 
            for (int i = 2; i <= max; i++) 
                if (a % i == 0) // 若能被整除,则说明不是素数,返回false  
                    return false;   
        }  
        return true;  
    }  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

上这种方法对于不是很大的数字来说没有问题,但如果是一个很大的数字,计算时间就太长了。比如加密解密程序中,往往需要一个100位的大数,对于大数判断是否为素数,推荐Miller Rabin算法。这个算法的核心思想是:如果p是素数,x是小于p的正整数,且x^2 mod p = 1,那么要么x=1,要么x=p-1。 有兴趣的话建议自行Google,会有相关算法解释,因为还是比较复杂的,涉及到费马小定理、快速幂模算法之类的,加上博主本人数学也没有好到哪去,所以先不说咯~


到一个小于n的所有质数序列,常用的方法是埃拉托色尼检测法(Eratosthenes)。其原理是:从第一个最小的数k开始作为因子来检测,从k^2开始进行判断,这是因为,k(k-1)、k(k-2)、……、2k一定都经过了之前数字的检测!并且每次被检测数字的跨度是k。k^2之后的数字中可以被其整除的就不是素数,剔除。检测到 floor(sqrt(n))就可以停止,理由同上,因为每次要从k^2开始检测。所以循环结束的条件是k^2 > n

个例子:

2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

第一次用2来测试,从4开始检测,结果如下:

2 3 5 7 9 11 13 15 17

第二次用3来测试,从9开始检测,结果如下:

2 3 5 7 11 13 17

此时应该用5来测试,但是由于5^2 = 25 > 17,所以结束。

下面附上函数代码块的Java实现(用了ArrayList,便于删除):

//产生不大于n的连续质数序列
    public static ArrayList  eratosthenes( int n){
        ArrayList array = new ArrayList();
        for(int i = 2; i < n; i ++)
            array.add(i);
        //最多只要计算到n的平方根即可,因为2p,....,(p-1)p都已经在之前测试过了
        int max =  (int) Math.floor( Math.sqrt(n)); 
        for(int p= 2;  p < max; p ++){
            Integer j = p * p;
            while( j < n ){
                if( j % p == 0)
                    array.remove( j );
                j = j +p; 
            }
        }
        return array;
    }
  • 1
  • 2
  • 3有时候我们不光去需要判断这个数是否为质数,还要判断当我们给定一个数值之后在这个数值内有多少质数
  • 首先给定一个vector数组,并且都赋值为1,意味着现在把数组里的所有数都当作质数,然后我们从2开始取,那么凡是2的倍数,并且在给定的数值内部              
  • 那么就把它置为0;之后在检查下一个是否为1,也就是看看下一个是否是质数,不是就continue,
  • if(vec[i]==0)
  • continue;
  • 例如下一个是3,那么3的倍数,当然有交叉的,自然
  • 也要考虑进去比如
  • if(vec[i*j]==0)continue;
  • 并且i*j<所要表达的数,从而经过循环把所有的质数都找出来
  • 想找到几对质数的和等于特定值ACnum
  • for(int i=0;i
  • {
  • if(vec[i]&&vec[ACnum-i])count++;
  • 意思是取出第一个质数,然后看ACnum-这个质数看看是否也是质数,如果是的话,就加入

  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

以上 欢迎指正错误 共同学习
文章标签:  算法-质数测试
个人分类:  算法

判断一个数是否质数/素数——从普通判断算法到高效判断算法思路

定义:约数只有1和本身的整数称为质数,或称素数。 计算机或者相关专业,基本上大一新生开始学编程都会接触的一个问题就是判断质数,下面分享几个判断方法,从普通到高效。1)直观判断法最直观的方法,根据定义,...

huang_miao_xin huang_miao_xin

2016-05-06 15:00:14

阅读数:56583

快速判断一个数是否质数

快速判断一个数是否质数

u013565099 u013565099

2017-04-21 16:20:18

阅读数:702

27岁沈阳妹子竟悟出股市投资铁律,爆赚成网红利云 · 顶新

一种快速判断是否质数的方法

 public static boolean isprime(int x) ...{    if (x  7) ...{      if (x == 2 || x == 3 || x==5 || x ...

java2000_net java2000_net

2007-12-25 15:04:00

阅读数:2601

一种快速判断是否质数的方法

public static boolean isprime(int x) ...{    if (x  7) ...{      if (x == 2 || x == 3 || x==5 || x =...

junli0310 junli0310

2008-02-26 09:40:00

阅读数:1358

简单的几种给定一个数判断是否质数的方法

给定一个整数n,判断是否质数质数是只能被1和它自身整除的数) 第一种:运用数学函数 import math num = int(input("输入一个数值:")) if num > 1: ...

syh_ong syh_ong

2018-01-05 19:25:48

阅读数:825

C语言中怎么判断一个数是否是素数(即质数

最近在重新学习C语言,因为以前学的东西太少太少,像指针使用什么的都不熟悉。所以决定买本书好好看看。在边看书边实践的过程中有一个很经典的问题需要解决。 就是怎么判断一个读入的整数是否是素数,如果不是并...

csdnzouqi csdnzouqi

2016-09-26 11:46:51

阅读数:33998

沈阳股民福利:A股或将迎一波大行情,这5类股获将领涨!!佳亿道荘 · 顶新

判断一个数是不是素数 埃拉托斯特尼筛法 时间复杂度 O(n*lglgn)

说明: 素数的定义:质数(prime number)又称素数。一个大于1的自然数,除了1和它本身外,不能被其他自然数整除,换句话说就是该数除了1和它本身以外不再有其他的因数;否则称为合数。 最小的素数...

x_i_y_u_e x_i_y_u_e

2015-06-04 18:36:20

阅读数:3823

判断素数的几种方法的总结

素数,又称质数,定义是:除了1和它本身以外不再有其他的除数整除。方法一按照定义,从2到n-1判断有没有能整除n的数。如果有,则不是素数,否则,是素数bool is_prime(int n){ ...

qq_21120027 qq_21120027

2016-04-09 22:36:56

阅读数:19595

C++常见的质数判断算法

质数定义:一个大于1的自然数,除了1和它本身外,不能被其他自然数(质数)整除。         算法1:(定义)判断一个整数n是否质数,只需用2到n-1之间的每一个整数去除,如果都不能被整除,那么...

wo17fang wo17fang

2015-08-14 09:53:48

阅读数:16390

素数筛选法,快速获取素数序列

今天,学习了[素数][6]求取的方法,感觉很棒,拿来分享一下。首先,对比一下两种方法—普通求取素数的方法和基于筛选法的素数求取方法。...

qq_34739984 qq_34739984

2016-11-01 19:57:38

阅读数:2655

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

标准版:大部分人都知道的比较快的方法:判断从2到sqrt(n)是否存在其约数,时间复杂度O(sqrt(n)) 高配版:判断2之后,就可以判断从3到sqrt(n)之间的奇数了,无需再判断之间的偶数,时...

songyunli1111 songyunli1111

2017-12-01 20:23:32

阅读数:1235

素数判断算法(高效率)

chuanbindeng 的 素数判断算法关于素数的算法是信息学竞赛和程序设计竞赛中常考的数论知识,在这里我跟大家讲一下寻找一定范围内素数的几个算法。看了以后相信对大家一定有帮助。    正如大家都知...

liukehua123 liukehua123

2010-04-13 21:58:00

阅读数:162600

c语言判断一个数是否质数

判断一个数是否质数,首先我们需要知道质数的定义:对于大于1的数,如果除了1和它本身,它不能再被其它正整数整除,那么我们说它是一个质数 因此判断一个整数m是否质数,只需把m被 2 ~ m-1 之间...

fuckomg fuckomg

2016-08-08 18:24:10

阅读数:12793

C语言实验——判断素数(循环结构)

Problem Description 从键盘上输入任意一个整数,然后判断该数是否为素数。 如果是素数则输出"This is a prime." 否则输出“This is not a prime.”...

be_your_back be_your_back

2016-10-24 15:03:03

阅读数:9406

javascript判断一个数是否质数

//1、非正则实现 function isPrime(num) { // 不是数字或者数字小于2 if(typeof num !== "number"...

longzhoufeng longzhoufeng

2017-06-09 10:23:21

阅读数:2184

Miller-Rabin素数检测算法

今天看了一下Miller-Rabin素数检测的算法,总结了一下,希望这篇博客对你们有帮助。 先说几个理论基础: 1. 费马小定理:假如p是质数,a是整数,且a、p互质,那么a的(p-1)次方除以p的...

ZengAMing ZengAMing

2016-07-09 16:22:23

阅读数:1779

Hiho 数论一·Miller-Rabin质数测试,大素数判断

题目1 : 数论一·Miller-Rabin质数测试 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho最近突然对密码学产生了兴趣,...

tham_ tham_

2016-04-18 21:37:06

阅读数:1366

为什么判断一个数X是不是素数时只需判断其能否在2~根号X被整除即可?

其实换个角度就行,用数学解决,反证法。 反过来说,就是:如果X不能被2到根号X之间的任一整数整除,则不是质数 那么X可以表示为:X = ab 其中ab是非1正整数 因为X不能被2到根号X之间的...

ZhEnGX_ ZhEnGX_

2017-09-27 13:30:41

阅读数:113

素数判断的几种方法代码实现及其复杂度分析

素数判断的几种方法代码实现及其复杂度分析 标签: ...

qq_33061377 qq_33061377

2016-11-05 20:05:43

阅读数:1047

判断一个数是否质数

1.质数的定义只要有小学毕业证的同学都知道质数是什么鬼。因为本人没有小学毕业证,特意记录一下质数的定义: 对于大于1的数,如果除了1和它本身,它不能再被其它正整数整除,那么我们说它是一个质数。2.判...

bitcarmanlee bitcarmanlee

2017-03-06 22:04:59

阅读数:1261

  • 0


  • 收藏

  • 评论

  • 微信

  • 微博

  • QQ

你可能感兴趣的:(bishi,算法-质数测试,算法)