Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
确定BigInteger在Java中是否为素数_Java_Primes_Biginteger_Binary Search_Square Root - Fatal编程技术网

确定BigInteger在Java中是否为素数

确定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(

我正在亲自验证输入的biginger数字是否为素数

但是,对于较小的数字,如13,31,它运行良好,但对于15,它会产生错误;通过将它声明为素数。我无法找出错误,可能是隐藏在涉及二进制搜索的平方根()方法中

请查看代码并帮我指出错误

呼叫代码:-

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你为什么不尝试一下?为什么这种方法是错误的(不正确/为什么这是好的?意思是,通常我见过一些人