当前位置:首页 > 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中实现动态主题切换,通常需要结合CSS变量和状态管理。通过修改根元素的CSS变量值,可以全局改变应用的主题样式。 定义主题相关的CSS变量在根元素中: :root {…

h5页面如何实现

h5页面如何实现

实现H5页面的方法 H5页面是基于HTML5技术的网页,通常用于移动端和响应式设计。以下是实现H5页面的关键步骤和技术要点。 基础结构 使用HTML5的DOCTYPE声明作为页面的起始。HTML5简…

vue如何实现级联

vue如何实现级联

实现级联选择器的基本方法 在Vue中实现级联选择器通常使用现成的组件库或自定义组件。以下是两种常见方式: 使用Element UI的Cascader组件 安装Element UI后,直接使用el-c…

如何实现vue验证

如何实现vue验证

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

vue如何实现webssh

vue如何实现webssh

使用Vue实现WebSSH WebSSH的实现需要结合前端Vue和后端服务,通常通过WebSocket协议与服务器进行实时通信。以下是具体实现方法: 安装必要依赖 在Vue项目中安装xterm.js…

vue同步如何实现

vue同步如何实现

同步实现方法 在Vue中实现同步操作通常涉及处理异步任务(如API调用、定时器等)并使其以同步方式执行。以下是几种常见方法: 使用async/await 通过ES7的async/await语法可以简…