【发布时间】:2010-04-04 13:43:10
【问题描述】:
给定 A,在 10^20 的数量级上,我想快速获得前几个大于 A 的素数的列表。好吧,我的需求不是那么精确 - 如果偶尔是复合数也没关系number 最终出现在列表中。
枚举(可能)大于 A 的素数的最快方法是什么?
有没有比遍历所有大于 A 的整数(比如 2 和 3 的明显倍数除外)并为每个整数执行素数测试更快的方法?如果不是,唯一的方法是测试每个整数,我应该使用什么素数测试?
【问题讨论】:
给定 A,在 10^20 的数量级上,我想快速获得前几个大于 A 的素数的列表。好吧,我的需求不是那么精确 - 如果偶尔是复合数也没关系number 最终出现在列表中。
枚举(可能)大于 A 的素数的最快方法是什么?
有没有比遍历所有大于 A 的整数(比如 2 和 3 的明显倍数除外)并为每个整数执行素数测试更快的方法?如果不是,唯一的方法是测试每个整数,我应该使用什么素数测试?
【问题讨论】:
很好的问题。这仍然没有被证明是多项式时间(位数的多项式,这里是 20)——这是 Finding Primes Polymath 项目,几位数学家(包括菲尔兹奖得主 Terence Tao 和 Tim Gowers!)试图提出一个算法,但该项目似乎还没有任何具体的结果。
无论如何,您可以做几件事。正如您和其他人所指出的那样,其中之一是尝试每个数字并检查它是否是素数,使用像Miller–Rabin 这样的快速素数测试。通过著名的数论启发式算法(基于prime number theorem),n 附近的数为素数的“概率”约为 1/ln(n),因此对于 10^20,大约每 46 个数中将是主要。因此,如果您想要 k 个 20 位数字,您将对大约 50k 个数字运行 Miller-Rabin 检验。
我认为第二种方法可能会更快,如果您要为许多 A(没有仔细考虑)这样做(没有仔细考虑)是使用 筛子 ,例如Sieve of Eratosthenes。如果您想要 k 个素数,请制作一个包含大约 50k 个数字(或更多以确保安全)的数组,然后筛选它们。您将从预先计算的小于某个数字的素数列表开始。 (1010 完全正确,但由于您愿意容忍一些合数,因此可以使用较小的素数列表,例如通过first 50 million primes 进行测试,确保您的数字没有素数低于 982,451,653 的因子,而且数量并不多。)
第三种方法是为这个问题找到其他人的实现。 :-) 例如,有一个网页给出了一个数字,finds the next prime number 或 finds the next ten prime numbers。如果您在线使用它,您似乎必须手动将它们复制下来,但source code 也可用。
【讨论】:
有没有比踩踏更快的方法 通过所有更大的整数 比 A(明显的倍数除外) 比如说,2 和 3) 并执行 他们每个人的素数测试?
不,没有素数测试就无法知道一个数字是否为素数。
但是,您可以非常快速地对任何数字执行概率素性测试,例如 Miller-Rabin。这是一种安全且广为接受的寻找大素数的方法。由于素数相对丰富,使用这种方法在任何范围内都可以轻松找到素数。只需使用经过测试且高效的 Miller-Rabin 实现,就可以了。
【讨论】:
您能做的最好的事情就是生成一个合理的候选者,然后对其进行测试。 Miller-Rabin 检验满足您提供高概率为素数的要求,并且您可以根据使用的迭代次数将复合滑过的可能性降低到或多或少的任意水平。
【讨论】:
素数是安静的频繁数。 素数的频率是 log(n),这意味着平均每个第 46 个数字是素数,其中 n=10^20。 这意味着检查每个数字的素数并不是这样的开销。
【讨论】: