枚举大(20位)[可能]素数

时间:2010-04-04 13:43:10

标签: algorithm primes

给定A,大约10 ^ 20,我想快速获得一个大于A的前几个素数的列表。好吧,我的需求不是那么精确 - 如果偶尔复合的话也没关系号码最终列在清单上。

枚举大于A的(可能)素数的最快方法是什么?

是否有更快的方法,而不是单步执行大于A的所有整数(除了明显的倍数,例如2和3)并对每个整数执行素性测试?如果没有,并且唯一的方法是测试每个整数,我应该使用什么素性测试?

4 个答案:

答案 0 :(得分:4)

好问题。这仍然没有被证明是多项式时间(数字的多项式,这里是20) - 这是Finding Primes Polymath项目,其中有几位数学家(包括菲尔兹奖得主Terence Tao和Tim Gowers!)试图来使用算法,但项目似乎还没有任何具体结果。

无论如何,你可以做几件事。正如你和其他人所指出的那样,其中一个是尝试每个数字并检查它是否为素数,并进行快速素性测试,如Miller–Rabin。通过众所周知的数论理论启发式(基于prime number theorem),n附近的数字的“概率”约为1 / ln(n),因此对于10 ^ 20,大约每46个数字将是素数。因此,如果您想要k个20位数字,您将在大约5万个数字上运行Miller-Rabin测试。

第二种方法,我认为可能会更快,如果你为许多A(没有仔细考虑过)这样做,那就是使用筛子 ,就像Sieve of Eratosthenes一样。如果你想要k素数,那么制作一个大约有5万个数字(或者更安全)的数组,并筛选它们。您将从一个预先计算的素数列表开始,该列表少于某个数字。 (10 10 是完全正确的,但由于你愿意容忍一些复合数字,一个较小的素数列表会做,例如first 50 million primes测试,确保你的数字有没有低于982,451,653的主要因素,并且它们并不多。)

第三种方法是找到其他人对此问题的实现。 :-)例如,有一个网页给出了一个数字,finds the next prime numberfinds the next ten prime numbers。如果您在线使用它,您似乎必须手动复制它们,但source code也可用。

答案 1 :(得分:3)

  

有没有比踩踏更快的方法   通过所有整数更大   比A(除了明显的倍数   比方说,2和3)并执行   每个人的素性测试?

不,如果没有素性测试,就无法知道数字是否为素数。

但是,您可以非常快速地对任何数字执行Miller-Rabin等概率素性测试。这是一种安全且广为接受的寻找大质数的方法。由于素数相对丰富,使用此方法可以毫无困难地找到任何范围内的素数。只需使用经过测试和有效的Miller-Rabin实现,您就可以了。

答案 2 :(得分:0)

关于你能做的最好的事情是生成一个合理的候选人,然后进行测试。 Miller-Rabin测试符合您提供数字素数高概率的要求,并且您可以根据您使用的迭代次数,将复合滑动的几率降低到或多或少。

答案 3 :(得分:0)

Primes是安静的频繁数字。 素数的频率是log(n),这意味着平均每个第46个数是素数,其中n = 10 ^ 20。 这意味着检查每个数字的素数并不是这样的开销。