素数总和 - 用于循环和大数字

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了素数总和 - 用于循环和大数字相关的知识,希望对你有一定的参考价值。

我正在运行以下代码来查找前10,000,000个素数的总和。我如何优化它,以便不需要永远获得结果(素数之和)?

sum=0
num=2
iterator=0

while iterator<10000000:
    prime = True

    for i in range(2,num):
        if (num%i==0):
            prime = False

    if prime:
        sum=sum+num
         # print (num, sum, iterator)
        iterator=iterator+1
    num=num+1

print(sum)
答案

10,000,000个素数大约是n * ln(n) + n * ln( ln(n) )~188980383 ...然后你可以用筛子找到该值下的所有素数(丢弃任何额外的......)(即使用1000万时你会得到大约5万个额外素数,注意这大约需要我8秒))

另见:Finding first n primes?

另见:Fastest way to list all primes below N

另一答案

你可以使用Sieve of Eratosthenes。找到前n个素数是一种快得多的方法。

另一答案

事实证明,使用正确的切片,在Python中实现Sieve of Eratosthenes相当简单。因此,您可以使用它来恢复n个第一个素数并求它们。

在Joran Beasley的回答中指出,第n个素数的上限是n * ln(n) + n * ln( ln(n) ),我们可以使用它然后去掉额外的素数。请注意,此边界不适用于小于6的n。

from math import log

def sum_n_primes(n):
    # Calculate the upper bound
    upper = int(n * ( log(n) + log(log(n))))

    # Prepare our Sieve, for readability we make index match the number by adding 0 and 1
    primes = [False] * 2 + [True] * (upper - 1)

    # Remove non-primes
    for x in range(2, int(upper**(1/2) + 1)):
        if primes[x]:
            primes[2*x::x] = [False] * (upper // x - 1) # Replace // by / in Python2

    # Sum the n first primes
    return sum([x for x, is_prime in enumerate(primes) if is_prime][:n])

它需要几秒钟,但输出10,000,000个第一个素数的总和是870530414842019

如果你需要n更高,一个解决方案将是improve your upper bound

以上是关于素数总和 - 用于循环和大数字的主要内容,如果未能解决你的问题,请参考以下文章

在具有限制和大数据的熊猫中运行总和

for循环找出2到100的质数(素数)

project euler之素数的总和

ACM_素数环

非常简单的素数测试 - 我想我不理解for循环

c语言求1-1000素数的算法问题