【发布时间】:2015-01-29 04:34:14
【问题描述】:
假设我所说的只是小于 1000 万的自然数。
我希望为 10 000 000 以下的所有数字预先生成一个最低素除数 (LPD) 列表。例如,LPD(14) == 2、LPD(15) == 3,以及任何素数的 LPD 都是它自己。
我已经预先生成了所有的素数。访问第 n 个素数是一个简单的数组查找。效率为:O(1)
我已经预先生成了一个查找表,用于确定给定数字是否为素数。访问第 n 个素数是一个简单的数组查找。效率为:O(1)
现在,我计算给定数字的 LPD 的简单算法是循环遍历所有素数,直到一个素数除以该数字。但这需要很长时间。我可以在找到所有数字的最低除数所需的一半时间内生成所有低于 1000 万的素数(使用阿特金筛,我不明白,但用伪代码实现)。
有没有更好的算法来计算最低素除数?
【问题讨论】:
-
希望你只考虑小于
sqrt(10 000 000)的素数? -
好点,我也希望如此。大多数人不遵循这种做法
-
是的,我首先检查 IsPrime(n),然后检查所有素数。如果 n 不是素数,则存在一个小于 n 的素数除以 n。我循环直到找到那个素数,它总是恰好小于 sqrt(n)。