BigInteger无法正常工作的比较

时间:2016-04-07 03:40:31

标签: java biginteger

我没有得到我期待的输出。这是一个素性测试。我不确定是什么问题。我的循环无法正常工作,或者这不是。

n是一个BigInteger。它是由用户输入的长度随机生成的。

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);

3 个答案:

答案 0 :(得分:1)

不要测试compareTo()的结果是否等于-1。如果您想表示a < b,则应撰写a.compareTo(b) < 0。始终与0比较,而不是任何其他常数。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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;
}