确定BigInteger在Java中是否为素数
我正在亲自验证输入的biginger数字是否为素数 但是,对于较小的数字,如13,31,它运行良好,但对于15,它会产生错误;通过将它声明为素数。我无法找出错误,可能是隐藏在涉及二进制搜索的平方根()方法中 请查看代码并帮我指出错误 呼叫代码:-确定BigInteger在Java中是否为素数,java,primes,biginteger,binary-search,square-root,Java,Primes,Biginteger,Binary Search,Square Root,我正在亲自验证输入的biginger数字是否为素数 但是,对于较小的数字,如13,31,它运行良好,但对于15,它会产生错误;通过将它声明为素数。我无法找出错误,可能是隐藏在涉及二进制搜索的平方根()方法中 请查看代码并帮我指出错误 呼叫代码:- boolean p=prime(BigInteger.valueOf(15)); System.out.println("P="+p); public static boolean prime(BigInteger bi2){ if(
boolean p=prime(BigInteger.valueOf(15));
System.out.println("P="+p);
public static boolean prime(BigInteger bi2){
if(bi2.equals(BigInteger.valueOf(2)) || bi2.equals(BigInteger.valueOf(3)))
{
return true;
}
BigInteger bi,bin;
bin=squareroot(bi2);
for(bi=BigInteger.valueOf(2);bi.compareTo(bin)<=0;bi=bi.add(ONE)){
if(bi2.mod(bi).equals(ZERO))
return false;
else continue;
}
return true;
}
public static BigInteger squareroot(BigInteger bi){
BigInteger low,high,mid=ZERO,two;
low=ONE;
high=bi;
two=BigInteger.valueOf(2);
while(low.compareTo(high)<0)
{
mid =(BigInteger)(low.add(high)).divide(two);
//System.out.println("Low-Mid-High="+low+" "+mid+" "+high);
if(mid.multiply(mid).compareTo(bi)==0)
return mid;
if(mid.multiply(mid).compareTo(bi)>0)
high = mid.subtract(ONE);
else if(mid.multiply(mid).compareTo(bi)<0)
low = mid.add(ONE);
}
return mid;
}
调用代码:-
boolean p=prime(BigInteger.valueOf(15));
System.out.println("P="+p);
public static boolean prime(BigInteger bi2){
if(bi2.equals(BigInteger.valueOf(2)) || bi2.equals(BigInteger.valueOf(3)))
{
return true;
}
BigInteger bi,bin;
bin=squareroot(bi2);
for(bi=BigInteger.valueOf(2);bi.compareTo(bin)<=0;bi=bi.add(ONE)){
if(bi2.mod(bi).equals(ZERO))
return false;
else continue;
}
return true;
}
public static BigInteger squareroot(BigInteger bi){
BigInteger low,high,mid=ZERO,two;
low=ONE;
high=bi;
two=BigInteger.valueOf(2);
while(low.compareTo(high)<0)
{
mid =(BigInteger)(low.add(high)).divide(two);
//System.out.println("Low-Mid-High="+low+" "+mid+" "+high);
if(mid.multiply(mid).compareTo(bi)==0)
return mid;
if(mid.multiply(mid).compareTo(bi)>0)
high = mid.subtract(ONE);
else if(mid.multiply(mid).compareTo(bi)<0)
low = mid.add(ONE);
}
return mid;
}
公共静态布尔素数(BigInteger bi2){
如果(bi2.equals(biginger.valueOf(2))| | bi2.equals(biginger.valueOf(3)))
{
返回true;
}
BIG整数bi,bin;
bin=平方根(bi2);
对于(bi=biginger.valueOf(2);bi.compareTo(bin),您的问题是从平方根返回mid
,而没有将其重新计算为(低+高)/2
。这导致它返回算法上一次迭代的中点;这几乎总是错误的
这样做的结果是,您有时会遗漏一些素数因子。在15的情况下,因为平方根
返回2,所以您遗漏了作为素数因子的3。在13和31的情况下,没有可遗漏的素数因子,因此您得到了正确的结果。您的问题是从返回mid
>平方根
,而不将其重新评估为(低+高)/2
。这会导致它返回算法上一次迭代的中点;这几乎总是错误的
这样做的结果是,您有时会遗漏一些素数因子。在15的情况下,因为平方根
返回2,所以您遗漏了作为素数因子的3。在13和31的情况下,没有可遗漏的素数因子,因此您得到了正确的结果。您的问题是从返回mid
>平方根
,而不将其重新评估为(低+高)/2
。这会导致它返回算法上一次迭代的中点;这几乎总是错误的
这样做的结果是,您有时会遗漏一些素数因子。在15的情况下,因为平方根
返回2,所以您遗漏了作为素数因子的3。在13和31的情况下,没有可遗漏的素数因子,因此您得到了正确的结果。您的问题是从返回mid
>平方根
,而不将其重新评估为(低+高)/2
。这会导致它返回算法上一次迭代的中点;这几乎总是错误的
这样做的结果是,您有时会遗漏一些基本因子。在15的情况下,因为平方根返回2,所以您遗漏了作为基本因子的3。在13和31的情况下,没有可以遗漏的基本因子,因此您会得到正确的结果。我假设这里的部分挑战是实现所有方法从头开始?因此是平方根实现?我强烈建议您使用调试器逐步完成此过程。我相信您会在几秒钟内发现问题。平方根为15(以及大多数数字)不是整数,所以你的平方根函数无法找到正确的答案。例如,对于15,它返回2的平方根。不,@shekhar,试着在你的平方根函数中运行15。它返回2,无论你相信谁。你不认为反驳两个拥有正确答案的人有点粗鲁吗找出你的错误?我想这里的部分挑战是从头开始实现所有方法?因此是平方根实现?我强烈建议使用调试器逐步完成。我相信你会在几秒钟内发现问题。平方根为15(以及大多数数字)不是整数,所以你的平方根函数无法找到正确的答案。例如,对于15,它返回2的平方根。不,@shekhar,试着在你的平方根函数中运行15。它返回2,无论你相信谁。你不认为反驳两个拥有正确答案的人有点粗鲁吗找出你的错误?我想这里的部分挑战是从头开始实现所有方法?因此是平方根实现?我强烈建议使用调试器逐步完成。我相信你会在几秒钟内发现问题。平方根为15(以及大多数数字)不是整数,所以你的平方根函数无法找到正确的答案。例如,对于15,它返回2的平方根。不,@shekhar,试着在你的平方根函数中运行15。它返回2,无论你相信谁。你不认为反驳两个拥有正确答案的人有点粗鲁吗找出你的错误?我想这里的部分挑战是从头开始实现所有方法?因此是平方根实现?我强烈建议使用调试器逐步完成。我相信你会在几秒钟内发现问题。平方根为15(以及大多数数字)不是整数,所以你的平方根函数无法找到正确的答案。例如,对于15,它返回2的平方根。不,@shekhar,试着在你的平方根函数中运行15。它返回2,无论你相信谁。你不认为反驳两个拥有正确答案的人有点粗鲁吗指出你的错误?按照你的说法,我必须尝试什么???我已经知道用这种方法计算平方根的二进制搜索法已经足够好了!!!请再详细解释一下。我的回答解释了你必须做的事情。很好吗:-返回低。加(高)。除(二);@shekhar你为什么不尝试一下?为什么这种方法是错误的(不正确/为什么这是好的?意思是,通常我见过一些人