问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

判断一个数是否为质数(素数)的4种方法

创作时间:
作者:
@小白创作中心

判断一个数是否为质数(素数)的4种方法

引用
CSDN
1.
https://blog.csdn.net/sinat_26811377/article/details/96584293

质数判断是计算机科学和数学领域中的一个基础问题,广泛应用于密码学、数据安全和算法设计等领域。本文将介绍四种判断一个数是否为质数的方法,从最直观的试除法到基于数论性质的优化算法,逐步深入,帮助读者理解质数判断的核心思想和实现技巧。

什么是质数?

首先来看质数的概念:

质数(Prime number),又称素数,指在大于1的自然数中,除了1和该数自身外,无法被其他自然数整除的数。(也可定义为只有1与该数本身两个正因数的数)


图1 数字12不是质数,而数字11是质数

如上图所示,数字12可以将每4个分成一组,一共3组;而数字11将每4个、每5个、每3个分成一组都无法全部分完,而有剩余,因此将数字11称为质数。

如何判断是否为质数?

质数的特点如下:一个自然数(如1、2、3、4、5、6等)若恰有两个正约数(1及此数本身),则称之为质数。

方法1

根据质数的约数只有1和本身这一特点,可以首先想到最直观的方法。第一种方法就是判断一个数是否能被比它小的数整除

方法1的时间复杂度是O(n)。

public static boolean isPrime(int n){
    //n<=3时,质数有2和3
    if (n <= 3) {
        return n > 1;
    }
    //当n>3时,质数无法被比它小的数整除
    for(int i = 2; i < n; i++){
        if (n % i == 0) {
            return false;
        }
    }
    return true;
}

方法2

当一个数不是质数时,必定存在两个约数,一个大于等于sqrt(n),另一个小于sqrt(n)。利用这种特性,可以对方法1进行改进,只判断数n能否被小于sqrt(n)的数整除。

方法2的时间复杂度是O(sqrt(n))。


图2 筛选判断集,只选择小于等于sqrt(n)的集合

public static boolean isPrime(int n) {
    if (n <= 3) {
        return n > 1;
    }
    //判断一个数能否被小于sqrt(n)的数整除
    int sqrt = (int)Math.sqrt(n);
    for (int i = 2; i <= sqrt; i++) {
        if(n % i == 0) {
            return false;
        }
    }
    return true;
}

方法3

任一偶数一定能分解为2和其他偶数/奇数的积,因此一个数不能被2整除,那么这个数一定不能被其他偶数整除。利用这个特点,可以对方法2进行改进,判断数n能否被小于sqrt(n)的奇数整除。

方法3的时间复杂度是O(sqrt(n)/2)。


图3 进一步筛选判断集,只选择小于等于sqrt(n)的奇数

public static boolean isPrime(int n) {
    if (n <= 3) {
        return n > 1;
    }
    //只需判断一个数能否被小于sqrt(n)的奇数整除
    int sqrt = (int)Math.sqrt(n);
    for (int i = 3; i <= sqrt; i += 2) {
        if(n % 2 == 0 || n % i == 0) {
            return false;
        }
    }
    return true;
}

方法4

质数的分布具有特点,经过证明可以得到,(大于等于5的)质数一定和6的倍数相邻,一定是6x-1或6x-1。利用这种特性。可以对整数进行筛选,只判断那些是6x-1或6x-1的整数是否为质数。


图4 筛选数据集,只选择6的倍数相邻的数

证明过程如下:
令x≥1,将大于等于5的自然数表示如下: ······6x-1,6x,6x+1,6x+2,6x+3,6x+4······(相邻6个数为一组)
在以上的数字中,6x、6x+2和6x+4是偶数,一定不是质数;6x+3可以分解为3(2x+1),不是质数,因此质数只能是6x-1和6x+1。

public static boolean isPrime(int n) {
    if (n <= 3) {
        return n > 1;
    }
    // 只有6x-1和6x+1的数才有可能是质数
    if (n % 6 != 1 && n % 6 != 5) {
        return false;
    }
    // 判断这些数能否被小于sqrt(n)的奇数整除
    int sqrt = (int) Math.sqrt(n);
    for (int i = 5; i <= sqrt; i += 6) {
        if (n % i == 0 || n % (i + 2) == 0) {
            return false;
        }
    }
    return true;
}
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号