如何固定算法以计算 Python 中的素数

How to fasten algorithm to calculate Prime Numbers in Python

这是我的代码:

import math

n=100

prime=[]
[prime.append(i) for i in range(2,n)]
i=2

"""for i in range(2,int(math.sqrt(n))):"""
while i*i <= n:
    for j in range(2,n+1):
        if i * j in prime:
            prime.remove(i*j)
    i +=1

print(prime)

现在这行得通了,但是当我将 n 从 100 更改为 10000 时,它就崩溃了。我该如何固定它还是应该使用发电机方式?谢谢。

我用过:

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

从旧的 post 那里得到它...我会寻找它并在找到它时记下它,

我们可以只用一个循环来完成:

num = 407
if num > 1:
   for i in range(2,num):
       if (num % i) == 0:
           print(num,"is not a prime number")
           print(i,"times",num//i,"is",num)
           break
   else:
       print(num,"is a prime number")
else:
   print(num,"is not a prime number")

时间激增的原因是您使用的数据结构使其成为 O(n^2) 算法。

使用 set 将允许等效逻辑,同时将其简化为 O(n) 算法:

import math

n=100

prime = set(i for i in range(2,n))
i=2

while i*i <= n:
    for j in range(2,n+1):
        if i * j in prime:
            prime.remove(i*j)
    i +=1

print(prime)

特别昂贵的操作是i * j in prime。如果 prime 是一个列表,它可能必须扫描整个列表。对于集合,它不必扫描所有元素。