质数上更好的算法

时间:2015-02-03 23:36:22

标签: python algorithm primes python-3.4

我正在开发一个能找到n的程序。素数。例如,通过列出前六个素数:2, 3, 5, 7, 1113,我们可以看到第6个素数是13。我试图制作一个算法,比如,如果我想看到第50个素数,我会将1添加到range()函数的末尾。我现在使用这种算法来寻找素数;

cnt = 1
print (2)
for x in range(3,40,2):
    div = False
    for y in range(2,round(x**0.5)+1):
        if x%y == 0:
            div = True
    if div == False:
        print (x)
        cnt += 1

print ("\nThere is {} prime numbers.".format(cnt))

你看,我把40。但是我想把n放在那里,例如,直到达到第50个素数,向n添加+1。但是,如果我尝试了类似的东西,它就不会那样了。

cnt = 1
n = 40 #example
while cnt<50:
    for x in range(3,n,2):
        #codes
    if div == False:
        n += 1

我认为当程序找到素数时,它会向n添加+1并且while循环将处理直到找到第50个素数。但它没有,如果我也使用这个,素数是错误的,没有什么与我想做的相关。

  • 如何制作此算法,显然更改range()函数的最后一个元素不起作用。

  • 有更好/优雅的算法/方法吗?如果我想找到200.000th素数,我需要更快的代码。

编辑:我首先使用列表,但是在使用大数字时我总是得到MemoryError。所以我传递了它并使用一个变量来计算有多少质数cnt

2 个答案:

答案 0 :(得分:3)

这是一个更快的版本

primes = []
primecount = 0

candidate = 2
while primecount<50:
    is_prime = True
    for prime in primes:
        if candidate%prime == 0:
            is_prime = False
            break
        elif candidate < prime**2:
            break
    if is_prime:
        primes.append(candidate)
        primecount += 1

    candidate += 1
print primes[-1]

请注意小编辑添加OP包含的candidate<prime**2测试但我最初忽略了。

由于多种原因,您的代码会非常慢。如果2除以一个数字,你知道它不是素数,但你仍然在检查3或4或5 ......是否将它分开。一旦你知道它不是素数,你就可以爆发。另一个主要问题是如果2不分数,那么就没有理由检查4是否也将它分开。因此,您可以将注意力仅限于检查在它之前是否存在素数。

就运行时间而言:

enter image description here

答案 1 :(得分:-1)

首先,为了向后兼容python 2,我在你的root x舍入周围添加了int()

根据我对你的问题的理解,你正在寻找这样的东西:

cnt = 1
maximum=50 #Specify the number you don't want the primes to exceed
print (2)
n=20 #highest number 
while cnt<maximum: #
    for x in range(3,n,2): #using "n" as you hoped
        div = False
        for y in range(2,int(round(x**0.5)+1)):
            if x%y == 0:
                div = True
        if div == False:
            if x<maximum: #we only want to print those up to the maximum
                print str(x)
            else: #if it is greater than the maximum, break the for loop
                break
            cnt += 1
    break #break the while loop too.
print ("\nThere are {} prime numbers.".format(cnt))

这给了我正确的素数。至于更好/更优雅的解决方案。如果您希望速度更快,请使用具有优化的库,或者查看this以获取快速程序的示例。优雅是主观的,所以我会把它留给互联网的其余部分。