我的软件中有以下代码:
boolean isPrime = false;
BigInteger testnumber = new BigInteger(unLikelyPrime.toPlainString());
if (testnumber.isProbablePrime(100))
{
isPrime = true;
}
还有一些合数,它告诉我它们是素数。
示例:
32589158477649702043=181*12161*14805575143823
198962376391690981640415251545285153602734402721821058212203976095419318882061= 271224769 × 683929111734272089584900601 × 1072582042095206356022742074568536678215669
我可以使用什么 Java 代码来获得准确的结果,这些示例是复合的。 还有其他我可以使用的图书馆吗?或者有人写过素性测试可以分享吗?
如有任何帮助,我们将不胜感激。
编辑 这是我的更多代码:
result.setUnLinkelyPrime(unLikelyPrime.toPlainString());
int trys = 0;
BigInteger testnumber = new BigInteger(unLikelyPrime.toPlainString());
boolean isPrime = false;
for (; trys < 200; trys++)
{
if (testnumber.isProbablePrime(3))
{
if (testnumber.isProbablePrime(40))
{
if (testnumber.isProbablePrime(100))
{
isPrime = true;
break;
}
}
}
unLikelyPrime = unLikelyPrime.add(sievesize);
testnumber = new BigInteger(unLikelyPrime.toPlainString());
}
result.setTrys(trys);
result.setPrime(isPrime);
return result;
也许像我一样堆叠测试不太好?
编辑 我把错误的例子拿出来了。
我们来看看吧。简单的代码像这样
import java.util.*;
import java.lang.*;
import java.io.*;
import java.math.*;
class Main {
public static void main(String[] args) {
String text[] = {
"32589158477649702043",
"232862364358497360900063316886467769617",
"198962376391690981640415251545285153602734402721821058212203976095419318882061" };
for (String st : text) {
BigInteger value = new BigInteger(st);
boolean result = value.isProbablePrime(100);
if (result)
System.out.println("Prime");
else
System.out.println("NOT Prime");
}
}
}
演出:
NOT Prime
Prime
NOT Prime
我们来看第二个例子:
7*1777*26613151*99269775704082066217823753 ==
32862364358497360900063316886467769617 !=
232862364358497360900063316886467769617
您的代码是合理的,但这并不能完全消除 rist 尝试使用下面的代码
public static boolean isPrime(BigInteger n) {
if (n.compareTo(BigInteger.ONE) <= 0) {
return false;
}
if (n.equals(BigInteger.TWO) || n.equals(BigInteger.valueOf(3))) {
return true;
}
if (n.mod(BigInteger.TWO).equals(BigInteger.ZERO) || n.mod(BigInteger.valueOf(3)).equals(BigInteger.ZERO)) {
return false;
}
BigInteger sqrtN = n.sqrt().add(BigInteger.ONE);
for (BigInteger i = BigInteger.valueOf(5); i.compareTo(sqrtN) <= 0; i = i.add(BigInteger.TWO)) {
if (n.mod(i).equals(BigInteger.ZERO) || n.mod(i.add(BigInteger.TWO)).equals(BigInteger.ZERO)) {
return false;
}
}
return true;
}