簡體   English   中英

素數總和

[英]Prime numbers sum

任何簡化此代碼的想法? 花費的時間太長了,但也許這是因為我的限制( 2000000 )非常高。

def is_prime(x):
    for i in range(2, x):
        if x == 2:
            break
        elif x % i == 0:
            return False
            break


total = 0
for num in range(2, 2000000):
    if is_prime(num) != False:
        print(num)
        total += num

print(total)

為了加快速度,將上限設為x平方根。
如果在那之前沒有因素,那么之后也不會有其他因素。

在你的函數is_prime()你使用了一種非常強力的方法來徹底檢查每個可能的數字,看它是否是 x 的除數。 正如評論中提到的,您只能檢查sqrt(x)因為乘法的另一半已經被檢查過。 此外,通過檢查 x 是否只能被 2 整除一次,然后僅迭代奇數,將計算次數減半是很常見的。 僅通過這兩個修改,您就可以獲得很多速度。

import math

def is_prime(x):
    if x == 2: #2 is prime
        return True
    if x % 2 == 0: #divisible by 2
        return False
    for i in range(3,int(math.sqrt(x)),2): #only odd numbers up to sqrt(x) starting from 3
        if x % i == 0: #divisible by i
            return False
    return True #we made it through the loop without finding a divisor

使用素數篩和 numpy 生成最多x所有素數的示例可能如下所示:

import numpy as np

sieve = np.ones(x,bool)
sieve[:2] = False #0 and 1 are not prime
for i in range(2,int(x**.5)):
    if sieve[i]: #`i` is prime therefore mark all multiples of i as not prime
        sieve[i*2::i] = False
primes = np.where(sieve)[0] #extract primes as indices of `primes` that are true

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM