BigInteger 的比较不起作用

Comparison for BigInteger not working

我没有得到预期的输出。这是用于素数测试。我不太确定出了什么问题。要么是我的循环工作不正常,要么是这个不正常。

n 是一个大整数。由用户输入的长度随机生成。

public static boolean isPrime(BigInteger n) {

    BigInteger zero = new BigInteger("0");
    BigInteger one = new BigInteger("1");
    BigInteger two = new BigInteger("2");
    BigInteger three = new BigInteger("3");

    System.out.println(n + " Mod 2 " + n.mod(two));

    if (n.compareTo(one) == 0 || n.compareTo(one) < 0) {
        //System.out.println("HIT1");
        return false;
    } else if (n.compareTo(three) == 0 || n.compareTo(three) < 0) {
        //System.out.println("HIT2");
        return false;
    } else if ((n.mod(two)).compareTo(zero) == 0 || (n.mod(three)).compareTo(zero) == 0) {
        //System.out.println("HIT3");
        return false;
    } else {
        System.out.println("Heres n : " + n);
        return true;
    }
}

这是我的循环。我确信我的数字生成器可以正常工作。

do {
    num1 = generateNumber(p);
} while (isPrime(generateNumber(p)) == false);

do {
    num2 = generateNumber(q);
} while (isPrime(generateNumber(q)) == false);

不测试compareTo()的结果是否等于-1。当你想表示 a < b 时,你应该写 a.compareTo(b) < 0。始终与 0 进行比较,而不是任何其他常数。

刚刚意识到问题所在。我在循环中和循环内生成两个不同的数字。我还在循环中错误地分配了 BigInteger。我应该做的 num1 = new BigInteger(generateNumber(p).toString());

首先,测试数字是否为 2(如果是,则为质数)。接下来,测试数字是否可以被 2 整除(如果是,那么它不是质数)。接下来,以 2 的增量从 3 迭代到数字的平方根,测试与原始数字的整除性(如果是,则它不是质数)。否则,该数为质数。像,

public static boolean isPrime(BigInteger n) {
    final BigInteger two = new BigInteger("2");
    if (n.equals(two)) {
        return true;
    }
    if (n.mod(two).equals(BigInteger.ZERO)) {
        return false;
    }
    for (BigInteger i = two.add(BigInteger.ONE); i.multiply(i).compareTo(n) < 1;
                i = i.add(two)) {
        if (n.mod(i).equals(BigInteger.ZERO)) {
            return false;
        }
    }
    return true;
}