我的python prime finder中的无限范围?

时间:2013-12-07 20:05:54

标签: python primes

我想在我的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

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

5 个答案:

答案 0 :(得分:10)

您可以导入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 ...

第一个论点是起点。

答案 1 :(得分:5)

你可以使用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

答案 2 :(得分: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

答案 3 :(得分:0)

您最终将溢出。 请检查我的代码,它是素数生成器。只需将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!")

答案 4 :(得分:0)

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

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

如果我没记错的话,我设法使用我的筛子版本最多分析了前100万个数字。我对代码进行了很多优化。那里的故事很长(少于平方根,仅检查了以前的素数,使用了python列表(我发现numpy太慢了),跳过了偶数,...)无论代码多么聪明,每个素数所需的计算量都会大大增加随着时间的推移。例如,我没有使用并行处理,但是即使使用并行处理,我也认为您很快就会陷入困境。如果您得到的质数小于N ^ 2,也许您可​​以顺序计算所有质数直到N,然后使用它并行产生一些计算? ...