如何在Java中测试非常大的BigDecimal是否为素数?

问题描述 投票:0回答:2

我的软件中有以下代码:

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;

也许像我一样堆叠测试不太好?

编辑 我把错误的例子拿出来了。

java biginteger
2个回答
0
投票

我们来看看吧。简单的代码像这样

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

-1
投票

您的代码是合理的,但这并不能完全消除 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;
}
© www.soinside.com 2019 - 2024. All rights reserved.