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);
}
}