BigInteger的.isProbablePrime()的可能用例是什么?
BigInteger.isProbablePrime()
的方法很奇怪;从文档中,这将告诉一个数是否是概率为 的素数,其中整数参数是。1 - 1 / 2^arg
arg
它在JDK中已经存在了很长时间,所以这意味着它必须有用途。我在计算机科学和算法(以及数学)方面的有限知识告诉我,知道一个数字是否“可能”是素数,但不完全是素数,这真的没有意义。
那么,想要使用此方法的可能方案是什么?密码学?
BigInteger.isProbablePrime()
的方法很奇怪;从文档中,这将告诉一个数是否是概率为 的素数,其中整数参数是。1 - 1 / 2^arg
arg
它在JDK中已经存在了很长时间,所以这意味着它必须有用途。我在计算机科学和算法(以及数学)方面的有限知识告诉我,知道一个数字是否“可能”是素数,但不完全是素数,这真的没有意义。
那么,想要使用此方法的可能方案是什么?密码学?
是的,此方法可用于加密。RSA加密涉及查找巨大的素数,有时约为1024位(约300位)。RSA 的安全性取决于这样一个事实,即将一个由这些素数中的 2 个相乘组成的数字分解在一起是极其困难和耗时的。但要使它起作用,它们必须是主要的。
事实证明,证明这些数字素数也很困难。但是米勒-拉宾素数检验(米勒-拉宾素数检验)是 使用的素数之一,要么检测到一个数是复合的,要么没有给出任何结论。运行此测试时间可以得出这样的结论:这个数字确实是复合数的几率为 1/2n。运行它次数会产生可接受的风险,即此数字是复合的 1/2100。isProbablePrime
n
100
如果测试告诉你一个整数不是素数,你当然可以相信100%。
这只是问题的另一面,如果测试告诉你一个整数是“一个可能的素数”,你可能会怀疑。使用不同的“基数”重复测试可以使错误地成功“模仿”素数(相对于多个基数的强伪素数)的概率尽可能小。
测试的有用性在于它的速度和简单性。人们不一定会满足于“可能素数”作为最终答案的地位,但是在引入素数测试的大枪之前,人们肯定会通过使用这个例程来避免在几乎所有的合数上浪费时间。
与分解整数的难度相比,有点像红鲱鱼。众所周知,整数的素数可以在多项式时间内确定,并且确实有证据表明米勒 - 拉宾检验扩展到足够多的碱基是确定的(在检测素数时,而不是可能的素数),但这假设了广义黎曼假设,因此它不像(更昂贵的)AKS素数检验那么确定。