【发布时间】:2020-10-18 10:10:20
【问题描述】:
我已经定义了一个函数来生成一个小于或等于给定输入的素数列表,您可以根据 Eratosthenes 的筛子指定该输入。
def eratosthenes(max_num):
primes = list(range(2,max_num+1))
for i in primes:
j=2
while i*j<= primes[-1]:
if i*j in primes:
primes.remove(i*j)
j=j+1
return primes
现在,如果我想知道哪个素数是列表中的第 50 个,那么
len(primes) = 50
我该怎么做呢?是否可以通过这种方式对定义的函数进行逆向工程?
【问题讨论】:
-
@TomKarzes 好的。这不是我寻求帮助的原因,但谢谢。
-
一般来说,如果不先找到所有先前的素数,就很难知道第 n 个素数的值。此外,在内部循环中对
remove的调用是一个非常低效的实现。通常从筛子中去除素数应该是一个常数时间操作,而不是线性操作。 -
您将通过
eratosthenes(300)[49]获得列表中的第 50 个值。索引的计数从零开始,因此可以使用列表索引值 49 提取第 50 个值。 -
请注意,虽然您的算法与 Sieve 相似,但它的复杂性要差得多。通常,您将拥有一组 True/False 值,然后将该值翻转为 False 以获得多个素数。但是,您检查当前值是否仍在列表中,然后将其删除。这两个步骤都有 O(n) 复杂度。
标签: python function math primes