问题
给定数n,2 <= n <= 2 ^ 63。 n本身可能是素数。找到最接近n的素数p。
使用对于所有素数p,p> 2,p为奇数且p为6k + 1或6k + 5形式的事实,可以写出从n-1到2的循环以检查该数字是否为主要。因此,我不需要检查所有数字,而是需要检查上面两种形式的每个奇数。但是,我想知道是否有更快的算法来解决这个问题?即需要检查一些可以限制数字范围的约束?任何想法都将不胜感激。
答案 0 :(得分:4)
实际上,找到素数的几率是“高”,所以蛮力检查同时跳过“琐碎”数字(可被小素数整除的数字)将是你最好的方法,因为我们对数论的了解到目前为止
[更新]您可能会做的温和优化类似于Eratosthenes的Sieve,您可以在其中定义一些小的平滑边界,并将约N范围内的所有数字标记为复合,并仅测试相对于你的光滑基地。您需要使您的范围和平滑度足够小,以免超过相对“费用”主要测试的运行时间。
答案 1 :(得分:2)
您可以做的最大优化是在进行完整测试之前使用快速素数检查。例如,请参阅http://en.wikipedia.org/wiki/Miller%E2%80%93Rabin_primality_test以获取常用测试,该测试将快速消除大多数数字,因为“可能不是素数”。只有在你有充分的理由相信一个数字是素数之后,你才能尝试正确地证明素数。 (出于很多目的,人们很乐意接受,如果它通过了Rabin-Miller测试的固定数量的试验,那么你很可能接受这个事实。)