当前位置:首页 > Java

java如何实现质数

2026-03-23 01:15:56Java

判断质数的基本方法

质数是指大于1的自然数,除了1和它本身外没有其他约数。以下是一个简单的Java实现方法:

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

优化方法:筛法(埃拉托斯特尼筛法)

如果需要生成一定范围内的所有质数,可以使用筛法提高效率:

public static List<Integer> sieveOfEratosthenes(int n) {
    boolean[] isPrime = new boolean[n + 1];
    Arrays.fill(isPrime, true);
    isPrime[0] = isPrime[1] = false;
    for (int i = 2; i * i <= n; i++) {
        if (isPrime[i]) {
            for (int j = i * i; j <= n; j += i) {
                isPrime[j] = false;
            }
        }
    }
    List<Integer> primes = new ArrayList<>();
    for (int i = 2; i <= n; i++) {
        if (isPrime[i]) {
            primes.add(i);
        }
    }
    return primes;
}

大数质数检测(Miller-Rabin算法)

对于非常大的数(如超过int范围),可以使用概率性算法如Miller-Rabin进行高效检测:

java如何实现质数

import java.math.BigInteger;

public static boolean isPrimeMillerRabin(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 composite = true;
        for (int j = 0; j < s - 1; j++) {
            x = x.modPow(BigInteger.TWO, n);
            if (x.equals(n.subtract(BigInteger.ONE))) {
                composite = false;
                break;
            }
        }
        if (composite) {
            return false;
        }
    }
    return true;
}

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

实际应用建议

  • 小范围质数检测:直接使用基本方法或筛法。
  • 大数质数检测:优先选择Miller-Rabin等概率性算法。
  • 性能优化:避免重复计算,缓存已检测的质数结果。

分享给朋友:

相关文章

vue如何实现递归

vue如何实现递归

递归组件的实现方法 在Vue中实现递归组件通常用于渲染树形结构或嵌套数据。核心思路是组件在其模板中调用自身,但需注意终止条件以避免无限循环。 定义递归组件 组件需设置name选项,才能在模板中调用自…

如何实现vue验证

如何实现vue验证

Vue 表单验证的实现方法 Vue 表单验证可以通过多种方式实现,包括内置指令、第三方库和自定义验证逻辑。以下是几种常见的方法: 使用 Vue 内置指令进行基础验证 Vue 提供了 v-model…

vue如何实现餐桌

vue如何实现餐桌

Vue 实现餐桌功能 数据绑定与状态管理 使用 Vue 的响应式数据特性管理餐桌状态,例如桌号、座位数、是否占用等。通过 data 或 Vuex 存储餐桌信息: data() { return…

vue如何实现数据

vue如何实现数据

Vue 数据实现方式 Vue 提供了多种方式实现数据管理和响应式更新,核心机制基于响应式系统和状态管理方案。 响应式数据声明 在组件选项中使用 data 函数返回对象,Vue 会自动递归转换属性为响…

vue如何实现循环

vue如何实现循环

Vue 中实现循环的方法 Vue 提供了 v-for 指令来实现循环渲染,可以遍历数组、对象或数字范围。 遍历数组 <ul> <li v-for="(item, index)…

vue如何实现翻页

vue如何实现翻页

Vue 实现翻页的方法 在 Vue 中实现翻页功能通常可以通过以下方法完成: 使用计算属性分页 通过计算属性对数据进行分页处理,结合页码和每页显示数量动态计算当前页数据。 data() { r…