你能否建议一种在实践中可用的快速,确定性的方法,用于测试大数是否为素数?
另外,我想知道如何正确使用非确定性素性测试。例如,如果我使用这样的方法,如果输出为“no”,我可以确定数字不是素数,但是当输出“可能”时,另一种情况呢?在这种情况下,我是否必须手动测试素数?
提前致谢。
答案 0 :(得分:7)
我所知道的唯一确定性多项式时间算法是AKS素性测试(http://en.wikipedia.org/wiki/AKS_primality_test)。然而,有很多非常好的随机素性测试很快并且具有极好的成功概率。他们通常通过查找数字是否具有指数级概率的复合来工作,因此他们要么报告该数字是复合的,要么要求您以非常好的信心说“可能”。
答案 1 :(得分:7)
“可能”实际上意味着1-ε,ε变得尽可能小。
大多数应用程序都有一些小但非零的失败概率,与素性测试无关,例如
在加密应用程序中,攻击者幸运地猜测这个秘密,例如, 概率为2 ^( - 100)
硬件故障(辐射引起)随机翻转你的计算机内存(可能是一个保存你的“确定性”素性测试的输出
错误(事实上,比其他类型的失败更可能)
因此,将ε按到这个数量级就足够了。
例如,OpenSSL,GnuPG仅使用非确定性素性测试。 ``'可能''你真的不想要没有确定性测试。但请检查一下您可以使用的内容:如果您手头有任何库,并且它们的性能足够 - 请继续使用它们。
答案 2 :(得分:3)
如果您希望在RSA密钥中找到随机素数,则应首先使用概率测试。如果概率足够高,可以满足您的需求,那就停在那里。如果您必须确定,那么一旦找到大的随机可能素数,请使用AKS或其他非概率测试进行验证。这可以让你快速检查很多非素数,同时确定你认为你找到了非素数。
如果您正在尝试验证特定的现有号码是否为素数,那么您应该使用其中一个确定答案的测试。还有其他非多项式时间测试,使用实践中最快的测试。