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;
}
我没有得到预期的输出。这是用于素数测试。我不太确定出了什么问题。要么是我的循环工作不正常,要么是这个不正常。
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;
}