当前位置:首页 > 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 是一个广泛使用的 JavaScript 库,用于构建用户界面。判断其真实性通常涉及以下几个方面: 检查官方来源 React 由 Facebook(现 Meta…

如何判断react是否渲染完成

如何判断react是否渲染完成

判断 React 渲染完成的方法 使用 useEffect 钩子 在函数组件中,useEffect 钩子可用于监听渲染完成。传入空依赖数组 [] 时,回调函数会在组件首次渲染完成后执行。 imp…

react如何判断卡片的高度

react如何判断卡片的高度

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

react如何判断回退路由

react如何判断回退路由

判断回退路由的方法 在React中,可以通过react-router提供的API或自定义逻辑来判断用户是否执行了回退操作(例如点击浏览器的后退按钮)。以下是几种实现方式: 使用useNavigate…

如何判断react列表渲染完成

如何判断react列表渲染完成

监听列表渲染完成的方法 在React中,可以通过多种方式判断列表渲染是否完成。以下是几种常见的方法: 使用useEffect钩子 当列表数据更新或组件挂载时,useEffect可以监听这些变化并执行…

react如何判断组件渲染完成

react如何判断组件渲染完成

判断组件渲染完成的方法 在React中,可以通过多种方式判断组件是否已完成渲染。以下是几种常见的方法: 使用componentDidMount生命周期方法(类组件) 对于类组件,componentD…