【问题标题】:Infinite range in my python prime finder?我的 python prime finder 中的无限范围?
【发布时间】:2013-12-07 20:05:54
【问题描述】:

我试图在我的 python 素数查找器中获得无限范围!这是我的代码!

import math
print "Welcome to Prime Finder!"
option = raw_input("continue(y/n)")
 if option == "y":
    for num in range(1,(infinite number)):
        if all(num%i!=0 for i in range(2,int(math.sqrt(num))+1)):
           print num

我试图将它所说的(无限数)实际上是一个无限数。是否有一些价值或东西可以用来找到它?任何帮助将不胜感激!

【问题讨论】:

  • 大量的意图比无限的端点更不清晰,如果你没有输入足够多的零,你的代码就会中断。
  • 因为任何超过 100000001 的东西都会返回溢出错误。
  • 另外,任何想法如何添加一点代码,以便任何时候,如果您按 q 或其他东西,它将停止查找并显示结果。还有一个计数系统会很好,就像如果你按 q,它会打印,”找到 _ 素数。

标签: python primes


【解决方案1】:

您可以导入itertools并使用count函数

import itertools
for num in itertools.count(1):
    print num

count(1) --> 1 2 3 4 5 ...

count(10) --> 10 11 12 13 14 ...

count(1, 2) --> 1 3 5 7 9 ...

第一个参数是起点。

【讨论】:

  • 修正了你的起点。如果这是一个错误,请随时恢复。
  • @user2357112 谢谢,你说得对,他从1 开始而不是0
【解决方案2】:

你可以只使用一个while循环

num = 1
while True:
    option = raw_input("continue(y/n)")
    if option != "y": break

    if all(num%i!=0 for i in range(2,int(math.sqrt(num))+1)):
       print num
    num += 1

【讨论】:

    【解决方案3】:

    这是对@samrap 答案的修改,基本上将generator 与while 循环结合使用。然后生成器将确保您不必为循环的每次迭代重新计算素数。

    def gen_primes():
        D = {}  
        q = 2  
    
        while True:
            if q not in D:
                yield q        
                D[q * q] = [q]
            else:
                for p in D[q]:
                    D.setdefault(p + q, []).append(p)
                del D[q]
    
            q += 1
    
    if __name__ == "__main__":
    
        prime_generator = gen_primes()
    
        while True:
    
            option = raw_input("continue(y/n)")
            if option == "y":
                prime = next(prime_generator)
                print prime
            else:
                break
    

    那个筛子不是我的,credit goes to Eli Bendersky David Eppstein of UC Irvine

    【讨论】:

    • 实际上,您链接到的 Eli Bendersky 的帖子说此代码应归功于 2002 年加州大学欧文分校的 David Eppstein。此外,它可以/应该是 improved
    • @WillNess,感谢您提出更好的算法。从现在开始我会开始提到那个问题=)。
    • 很高兴它有帮助。 :) 在 2002-2004 年的某个时间里,我花了很多时间在这方面,阅读 SICP 并调整他们的素数代码,并提出我自己推迟启动过滤器的想法......这很有趣。 :) (当然我不是唯一一个......而且他们已经在 Haskell 中有另一个代码自动实现了延期......):)
    【解决方案4】:

    你最终会得到溢出。 请检查我的代码,它是一个素数生成器。只需将 n 更改为您要开始生成素数的数字即可。

    def gen_next_prime():
        n = 0
        while True:
            n += 1
            if (check_prime(n)):
                yield n
    
    def check_prime(n):
        if n <= 3:
            return n > 1
        elif n%2 == 0 or n%3 == 0:
            return False
        i = 5
        while i*i <= n:
            if n%i == 0 or n%(i+2) == 0:
                return False
            i = i+6
        return True
    
    g = gen_next_prime()
    
    while True:
        key_input = input("press 'y' to get next prime ('n' to exit): ")
    
        if key_input == "y":
            print(next(g))
        elif key_input == "n":
            break
        else:
            print("Error! Invalid Input!")
    

    【讨论】:

      【解决方案5】:

      我在下面的意思是,即使您的代码具有无限范围,在某些时候,它也会非常缓慢,以至于它似乎根本不会做任何事情。对我来说,我认为某个点大约是 n=1000,000。

      正如上面其他人指出的那样,您可以使用 while 循环,这很容易做到。但是请注意,从实际的角度来看,您的有效范围仍然会受到限制,即使我们忽略了打印时间会在某些时候减慢处理速度这一事实。

      如果我没记错的话,我最多只能使用我的筛子分析前一百万个数字。我对代码进行了相当多的优化。长话短说(小于平方根,只检查以前的素数,使用 python 列表(我发现 numpy 太慢了),跳过偶数,......)无论你的代码多么聪明,每个素数所需的计算量都会显着增加随着时间的推移。例如,我没有使用并行处理,但即使我这样做了,我认为你很快就会陷入困境。如果您得到的素数小于 N^2,也许您可​​以按顺序计算直到 N 的所有素数并使用它来并行产生一些计算? ...

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多