我编写了一个函数sieve(n)
,它使用Eratosthenes的Sieve返回所有素数的数组,直到n
。
sieve(25) # ==> [2, 3, 5, 7, 11, 13, 17, 19, 23]
可以阅读此功能的来源here。
我想现在重构一下,以便sieve(n)
返回n
素数。我只是不确定我是怎么做到的。我不想写一个全新的更精细的功能,所以看起来最好的方法是弄清楚筛子应该具备的价值。
例如,如果我要求第27个素数,那么筛子的初始整数列表应该是2到(我知道第27个素数不大于)。但有没有一种简单的方法来确定这个价值是什么?
我研究了这个问题,发现this Quora post表示第n个素数必须介于n*Math.log(n) + n*(Math.log(Math.log(n))-1)
和n*Math.log(n) + n*Math.log(Math.log(n))
之间(其中Math.log
是Ruby的自然对数),但是简单地在这两个数字之间设置list
数字就会使筛子产生奇怪的值,例如第15个素数的56
(56不是素数,答案应该是47)。
你可以猜到,我完全脱离了我的元素。如果有人能给我一些建议,我真的很感激。
答案 0 :(得分:3)
p n <对于 n ≥6
n ln( n )所以简单地接受那个界限,插入你的 n 并迭代直到你找到 n 素数。你的筛子通常有点太大,但如果束缚相当紧,那就不会太多,我希望是这样。
请参阅here以获取该范围的表格或here表格。顺便说一下,创建表的代码也在做同样的事情。我想要至少500个条目,所以我计算了
n = 500
lst = list(range(2, ceil(n*log(n*log(n)))))
ps = []
while lst:
p = lst[0] # next prime
ps.append(p)
lst = [i for i in lst if i % p != 0]
并且有超过500个素数,然后我可以告诉你计算的边界与实际值的比较。