📜  在Java执行 Baillie-PSW Primality 测试(1)

📅  最后修改于: 2023-12-03 15:37:36.455000             🧑  作者: Mango

在Java执行 Baillie-PSW Primality 测试

简介

Baillie-PSW Primality 测试是一种判断一个数是否为质数的算法,该算法结合了费马小定理和埃拉托斯特尼素数筛选法。它的原理是首先使用费马小定理来判断一个数可能是质数,然后利用埃拉托斯特尼素数筛选法来进一步验证其是否为质数,以达到更高的准确性。

实现

在Java中,我们可以通过实现Baillie-PSW Primality 测试的算法来判断一个数是否为质数。下面是一个基本的实现示例:

public static boolean isPrime(long n) {
    if (n <= 1) {
        return false;
    }
    if (n <= 3) {
        return true;
    }
    if (n % 2 == 0 || n % 3 == 0) {
        return false;
    }
    long i = 5;
    while (i * i <= n) {
        if (n % i == 0 || n % (i + 2) == 0) {
            return false;
        }
        i += 6;
    }
    return true;
}

public static boolean bailliePsw(long n) {
    if (n <= 1) {
        return false;
    }
    if (n == 2 || n == 3) {
        return true;
    }
    long a, temp;
    int s = 0;
    long d = n - 1;
    while (d % 2 == 0) {
        d /= 2;
        s++;
    }

    for (int i = 0; i < 3; i++) { // 重复三次以提高准确性
        a = (long) (Math.random() * (n - 3) + 2);
        temp = d;
        long mod = modPow(a, temp, n);
        while (temp != n - 1 && mod != 1 && mod != n - 1) {
            mod = mulMod(mod, mod, n);
            temp *= 2;
        }
        if (mod != n - 1 && temp % 2 == 0) {
            return false;
        }
    }
    return true;
}

public static long modPow(long a, long b, long c) {
    long res = 1;
    a %= c;
    while (b > 0) {
        if ((b & 1) == 1) {
            res = mulMod(res, a, c);
        }
        a = mulMod(a, a, c);
        b >>= 1;
    }
    return res;
}

public static long mulMod(long a, long b, long mod) {
    return BigInteger.valueOf(a).multiply(BigInteger.valueOf(b)).mod(BigInteger.valueOf(mod)).longValue();
}

在上述实现中,我们先通过判断较小的数是否为质数来提高效率,在判断大数时使用Baillie-PSW Primality测试算法。该算法需要重复三次来提高准确性,可以根据实际需要进行调整。

另外还实现了 modPow 和 mulMod 两个方法,分别用于计算取模幂和取模乘法。

使用

使用上述代码进行Baillie-PSW Primality测试只需要调用 bailliePsw() 方法即可。

long n = 123456789;
if (bailliePsw(n)) {
    System.out.println(n + " is a prime number.");
} else {
    System.out.println(n + " is not a prime number.");
}
结论

通过Baillie-PSW Primality测试算法,我们可以判断一个数是否为质数,实现简单,运行高效。由于该算法需要重复三次才能提高准确性,因此在较大的范围内进行质数判断时,需要进行更多次的重复计算以提高准确性。