我正在寻找一种算法来进行素数测试(如10 200 )数字。 有没有好的算法?
理想情况下,我更喜欢一种非概率算法。
注意:数字超过50且少于200位。
答案 0 :(得分:12)
如果您正在寻找非概率测试,您可能需要查看AKS primality testing algorithm,该时间大致为O(log 6 n)。对于您拥有的位数,这可能是可行的。
也就是说,概率性素性测试非常好,许多都具有指数级的错误率。我建议使用其中一种,除非有充分的理由不这样做。
编辑:我刚刚找到this page containing several C++ implementations of AKS。我不知道它们是否正常工作,但它们可能是一个很好的起点。
希望这有帮助!
答案 1 :(得分:5)
通常我们会使用可能的主要测试。我推荐BPSW,如果您想要更多确定性,可以通过Frobenius测试和/或一些随机基础的Miller-Rabin测试来跟踪。与运行一些证明实现相比,这将是快速且可以说是更多。
假设你说这还不够好。然后你真的想使用ECPP并获得证书。合理的实施是Primo或ecpp-dj。这些可以在一秒钟内证明200位数字的正常性,并返回可以独立验证的证书。
APR-CL是另一种合理的方法。缺点是它没有返回证书,所以你相信实施 - 你得到一个"是"或"不"如果实现正确,则输出确定性正确。 Pari / GP使用APR-CL及其isprime
命令,David Cleaver具有出色的开源实现:mpz_aprcl。这些实现已经在各种软件中进行了一些代码审查和日常使用,因此应该是好的。
AKS是一种在实践中使用的可怕方法。它没有返回证书,并且找到破坏的实现并不是很难,完全在第一次使用证明方法与良好的可能的主要测试时失败了地点。它也非常缓慢。对于我所知道的任何实现,200位数字远远超过实际点。有一个"快速"一个包含在前面提到的ecpp-dj软件中,所以你可以尝试一下,还有很多其他实现可以找到。
对于速度的一些想法,这里是一些实现的时间。我不知道AKS,APR-CL或BPSW的任何实现比显示的更快(如果你知道的话,请发表评论)。 Primo比ecpp-dj开始慢一点,但是在500左右的数字上它更快,并且具有更好的斜率。它是大输入(2,000-30,000位)的首选程序。