【问题标题】:finding prime numbers greater than 10^12 [closed]查找大于 10^12 的素数 [关闭]
【发布时间】:2013-12-26 08:34:16
【问题描述】:

1,000,000,000,000 到 1,000,000,100,000 之间的所有质数之和是多少? 这行得通,但速度很慢。我需要优化它。我是 python 新手。 3614000181007876是正确答案

    A=10 ** 6
N=A+1
B=10 ** 5
prime=[]
sum=0
for i in range(0,N):
    prime.append(0)
for i in range(2,N):
    if(prime[i]==1):
        continue
    for j in range(i*i,N,i):
        prime[j]=1
for i in range((A ** 2)+1,(A ** 2)+B,2):
    for j in range(2,A):
        c=0
        if(prime[j]==1):
            continue
        if(i%j==0):
            c=c+1
            if(c>0):
                break
    if(c==0):
        #print(i)
        sum=sum+i


print(sum)

【问题讨论】:

  • 谷歌“埃拉托色尼筛”
  • 1,000,000,000,000 到 1,000,000,100,000 之间的所有素数之和为 5042000251194180;使用我的bsdgames Debian 软件包中的primes 作为primes 1000000000000 1000000100000|awk '{s += $1}END{print s}' - 计算时间不到百分之一秒
  • @BasileStarynkevitch : 3614000181007876 是正确答案

标签: python algorithm optimization primes


【解决方案1】:

不是最有效的方法,但在我的盒子上 2 秒内得到正确的结果(希望 3614000181007876):

def isPrime(n):
    d = n - 1
    s = 0
    while not d & 1:
        s += 1
        d >>= 1
    for a in (2, 13, 23, 1662803):
        if pow(a, d, n) != 1 and all(pow(a, (1 << r) * d, n) != n - 1 for r in range(0, s)):
            return False
    return True

print(sum(x for x in range(1000000000001, 1000000100000, 2) if isPrime(x)))

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-25
  • 1970-01-01
  • 2017-01-21
  • 2014-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多