Java BigInteger.isProbablePrime

Java BigInteger.isProbablePrime,java,Java,我只是想证实我对这种方法的直觉。考虑下面的代码。 long knownPrime = // some large known prime int certainty = // some integer greater than 0 BigInteger b = BigInteger.valueOf(knownPrime); boolean isPrime = b.isProbablePrime(certainty); 对于一个大的已知素数,以及任何大于0的确定性,说b.isProbableP

我只是想证实我对这种方法的直觉。考虑下面的代码。

long knownPrime = // some large known prime
int certainty = // some integer greater than 0

BigInteger b = BigInteger.valueOf(knownPrime);
boolean isPrime = b.isProbablePrime(certainty);
对于一个大的已知素数,以及任何大于0的确定性,说
b.isProbablePrime(确定性)
总是返回true是否准确

或者有没有任何情况下,该方法“猜测”一个已知的素数是复合的

对于一个大的已知素数,以及任何大于0的确定性,说b.isProbablePrime(确定性)总是返回true是否准确

对。表示只有在确定数字是复合数字时才会返回
false

返回: 如果这个大整数可能是素数,则为true;如果它肯定是复合的,则为false

因此,
确定性
参数只会影响假阳性的几率:说一个复合数是素数,而实际上不是。

根据,此方法将返回

如果这个大整数可能是素数,则为true;如果它肯定是复合的,则为false


因此,根据定义,对于传入的任何合法(>0)确定性/容差值,任何确定的(独立验证的)素数都将返回true。确定性/公差值唯一改变的是误报的发生(对于复合材料为真)和方法的执行时间。

对于大型已知素数
b
,以及任何
确定性
b.isProbablePrime(确定性)
返回


isProbablePrime
只有在输入不是prime时返回
true
才会出错(例如
b=6
确定性=0
,返回
true
),而不是相反的方式(因为
isProbablePrime
使用的拉宾米勒测试只能在这个方向失败).

也许我完全误解了我阅读文档的方式,如果确定性的价值增加,那么答案的准确性也应该增加?如果这是正确的,那么是的,它应该总是返回true,确定1是唯一可能出现错误或“猜测”的点。当然,我可能完全误解了这一点。实际上,方法名称中包含了对您问题的回答。这个方法不会猜测数字是否是复合的,它猜测的是相反的条件,也就是说,只有在确定数字是复合的情况下,该方法才会返回false(有任何确定性)。我想知道您从哪里发现该方法内部使用了拉宾-米勒测试。@Brandon Buck;see代码总是好的,但添加一些注释/上下文也有助于说明此代码如何解决原始问题。
import java.util.*;
import java.math.*;
public class Main
{
    public static void main(String[] args) {
        Scanner s = new Scanner(System.in);
        long l = s.nextLong();
        BigInteger b = new BigInteger(String.valueOf(l));
        BigInteger p = b.nextProbablePrime();
        System.out.println(p);
    }
}