当前位置:首页 > Java

java 如何判断素数

2026-03-03 18:27:28Java

判断素数的基本方法

素数是大于1的自然数,除了1和它本身外没有其他约数。以下是几种常见的判断方法:

暴力法(试除法)

通过遍历2到n-1的所有整数,检查是否能整除n。若存在能整除的数,则n不是素数。

java 如何判断素数

public static boolean isPrime(int n) {
    if (n <= 1) {
        return false;
    }
    for (int i = 2; i < n; i++) {
        if (n % i == 0) {
            return false;
        }
    }
    return true;
}

优化试除法

只需检查2到√n的整数,因为若n有约数大于√n,必有一个对应的约数小于√n。

java 如何判断素数

public static boolean isPrime(int n) {
    if (n <= 1) {
        return false;
    }
    for (int i = 2; i <= Math.sqrt(n); i++) {
        if (n % i == 0) {
            return false;
        }
    }
    return true;
}

进一步优化(跳过偶数)

除2外,所有偶数都不是素数。可以跳过偶数检查,减少循环次数。

public static boolean isPrime(int n) {
    if (n <= 1) {
        return false;
    }
    if (n == 2) {
        return true;
    }
    if (n % 2 == 0) {
        return false;
    }
    for (int i = 3; i <= Math.sqrt(n); i += 2) {
        if (n % i == 0) {
            return false;
        }
    }
    return true;
}

适用于大数的概率性测试(Miller-Rabin算法)

对于极大数(如加密场景),确定性方法效率低,可采用概率性测试。以下是一个简化实现:

import java.math.BigInteger;

public static boolean isPrime(BigInteger n, int k) {
    if (n.compareTo(BigInteger.ONE) <= 0) {
        return false;
    }
    if (n.compareTo(BigInteger.valueOf(3)) <= 0) {
        return true;
    }
    if (n.mod(BigInteger.TWO).equals(BigInteger.ZERO)) {
        return false;
    }

    BigInteger d = n.subtract(BigInteger.ONE);
    int s = 0;
    while (d.mod(BigInteger.TWO).equals(BigInteger.ZERO)) {
        d = d.divide(BigInteger.TWO);
        s++;
    }

    for (int i = 0; i < k; i++) {
        BigInteger a = randomBigInteger(BigInteger.TWO, n.subtract(BigInteger.TWO));
        BigInteger x = a.modPow(d, n);
        if (x.equals(BigInteger.ONE) || x.equals(n.subtract(BigInteger.ONE))) {
            continue;
        }
        boolean isComposite = true;
        for (int j = 0; j < s - 1; j++) {
            x = x.modPow(BigInteger.TWO, n);
            if (x.equals(n.subtract(BigInteger.ONE))) {
                isComposite = false;
                break;
            }
        }
        if (isComposite) {
            return false;
        }
    }
    return true;
}

private static BigInteger randomBigInteger(BigInteger min, BigInteger max) {
    BigInteger range = max.subtract(min).add(BigInteger.ONE);
    BigInteger res;
    do {
        res = new BigInteger(range.bitLength(), new java.util.Random());
    } while (res.compareTo(range) >= 0);
    return res.add(min);
}

性能对比

  • 暴力法:时间复杂度O(n),适用于小范围。
  • 优化试除法:时间复杂度O(√n),适用于中等范围(如n < 10^6)。
  • Miller-Rabin:时间复杂度O(k log³n),适用于极大数,但存在极小概率误判。

根据实际需求选择合适的方法。

分享给朋友:

相关文章

如何判断react泡棉

如何判断react泡棉

判断React泡棉的方法 观察外观和质地 React泡棉通常具有独特的蜂窝状结构,质地轻盈且柔软。表面可能呈现微孔设计,按压后回弹迅速。与普通泡棉相比,React泡棉的弹性更明显,且长期使用不易变形。…

react如何判断属性非空

react如何判断属性非空

判断属性非空的方法 在React中,可以通过多种方式判断属性(props)是否非空。以下是几种常见的方法: 使用条件渲染 function MyComponent(props) { if (p…

react如何判断卡片的高度

react如何判断卡片的高度

判断卡片高度的方法 在React中,可以通过多种方式获取卡片元素的高度。以下是几种常见的方法: 使用useRef和useEffect钩子 通过useRef获取DOM节点的引用,结合useEffec…

react中如何判断数据的更新

react中如何判断数据的更新

判断数据更新的方法 在React中,判断数据是否更新可以通过多种方式实现,具体取决于使用的状态管理方式和场景需求。 使用useEffect依赖数组 通过useEffect的依赖数组监听特定状态或属性…

js实现素数

js实现素数

判断素数的基本方法 素数是大于1的自然数,除了1和它本身外没有其他约数。在JavaScript中,可以通过以下方法实现素数判断: 方法一:基础遍历法 通过遍历2到n-1之间的所有数,检查是否能被…

java如何判断是数字

java如何判断是数字

判断字符串是否为数字的方法 在Java中,判断字符串是否为数字可以通过多种方式实现,以下是几种常见的方法: 使用正则表达式 通过正则表达式可以快速判断字符串是否由数字组成: public stat…