繁体   English   中英

为什么不终止 - BigInteger Prime测试

[英]Why doesn't it terminate - BigInteger Prime test

我写了两种方法来测试BigInteger是否是素数。 我从(2 ^ 64)+1开始,然后我总是加2,直到我找到一个素数。 这是两种方法:

public static boolean isPrime(BigInteger n) {

    BigInteger max_long = BigInteger.valueOf(Long.MAX_VALUE);       
    if (n.compareTo(max_long)<=0) return isPrime(n.longValue());

    final BigInteger two = new BigInteger ("2");

    if ((n.mod(two)).compareTo(BigInteger.ZERO)==0) return false;

    else {
        for (BigInteger i=new BigInteger ("3"); i.multiply(i).compareTo(n)<=0; i=i.add(two)) {
            if((n.mod(i)).compareTo(BigInteger.ZERO)==0) return false;
        }
    }
    return true;
}

另一个是:

public static boolean isPrimeImproved (BigInteger n) {
    BigInteger max_long = BigInteger.valueOf(Long.MAX_VALUE);
    if(n.compareTo(max_long)<=0) return isPrime(n.longValue());

    final BigInteger two = new BigInteger("2");
    if(n.mod(two).compareTo(BigInteger.ZERO)==0) return false;

    else {
        for(BigInteger i=new BigInteger("3"); i.multiply(i).compareTo(n)<=0; i=i.nextProbablePrime()) {
             if(n.mod(i).compareTo(BigInteger.ZERO)==0) return false;
        }       
    }
    return true;

}

第一个在大约310秒后终止。 但第二个似乎没有终止,虽然它应该更快,不应该吗? 我知道,有一个名为isProbablePrime()的方法,但我不能使用它。

两者的for循环需要BigInteger乘法通过每次循环: i.multiply(i).compareTo(n)<=0; 鉴于我们在Long.MAX_VALUE之上工作,那么这是很多昂贵的乘法。 进行单个平方根计算以找到循环的固定限制可能会更快: i.compareTo(iSqrt)<=0;

编写一段简单的Newton-Raphson代码来查找整数平方根很容易。 它只会运行一次,并将取代许多昂贵的乘法。 Crandall和Pomerance给出了一个版本,我相信还有其他版本。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM