【问题标题】:Reverse-engineering conditional output for a function definition函数定义的逆向工程条件输出
【发布时间】: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


【解决方案1】:

您将通过eratosthenes(300)[49] 获得列表中的第 50 个值:

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

print(eratosthenes(300))
print(eratosthenes(300)[49])

这将产生

[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293]
229

索引的计数从零开始,因此可以使用列表索引值 49 提取第 50 个值。

如果你想限制列表的长度为 50,你可以通过多次调用该函数进行逆向工程,直到满足条件:

i = 2
while True:
    primes = eratosthenes(i)
    if len(primes) >= 50:
        break
    i = i + 1
 
print(i)
print(len(primes))
print(primes[49])   

产生

229
50
229

【讨论】:

    【解决方案2】:

    为什么不在一个循环中调用函数,最大数越来越大,直到输出的长度为 50,然后打印输出中的最后一项?

    【讨论】:

    • 好主意,我该如何尝试呢?我对 Python 很陌生,所以在一些事情上有点慢。
    • 您不确定哪一部分? (调用函数?增加最大数?等)
    猜你喜欢
    • 1970-01-01
    • 2020-07-29
    • 1970-01-01
    • 1970-01-01
    • 2012-03-12
    • 2018-05-27
    • 2011-07-14
    • 2016-07-25
    • 1970-01-01
    相关资源
    最近更新 更多