簡體   English   中英

小於或等於 x 的素數個數

[英]Number of primes less than or equal to x

π(x) = 素數個數 ≤ x

下面的代碼給出了小於或等於 N 的素數

它適用於 N<=100000,

  • 輸入 - 輸出表

    | Input | Output | |-------------|---------------| | 10 | 4✔ | | 100 | 25✔ | | 1000 | 168✔ | | 10000 | 1229✔ | | 100000 | 9592✔ | | 1000000 | 78521✘ |

    然而,π(1000000) = 78498

     import time def pi(x): nums = set(range(3,x+1,2)) nums.add(2) #print(nums) prm_lst = set([]) while nums: p = nums.pop() prm_lst.add(p) nums.difference_update(set(range(p, x+1, p))) #print(prm_lst) return prm_lst if __name__ == "__main__": N = int(input()) start = time.time() print(len(pi(N))) end= time.time() print(end-start)

您可以像下面這樣以最快的方式從該線程中讀取數據,並使用此函數在n = 1000000正確找到78498素數。 (我在此功能中更改了一行)

從:

return ([2] + [i for i in range(3,n,2) if sieve[i]])

到:

return len([2] + [i for i in range(3,n,2) if sieve[i]])

最后:

def primes(n):
    sieve = [True] * n
    for i in range(3,int(n**0.5)+1,2):
        if sieve[i]:
            sieve[i*i::2*i]=[False]*((n-i*i-1)//(2*i)+1)
    return len([2] + [i for i in range(3,n,2) if sieve[i]])

inp =  [10, 100, 1000, 10000, 100000, 1000000]
for i in inp:
    print(f'{i}:{primes(i)}')

輸出:

10:4
100:25
1000:168
10000:1229
100000:9592
1000000:78498

只有當nums.pop()返回素數時,您的代碼才是正確的,而只有當nums.pop()返回集合中的最小元素時,代碼才是正確的。 據我所知,這不能保證是真的。 有一個名為sortedcontainers的第三方模塊,它提供了一個 SortedSet 類,可用於使您的代碼只需很少的更改即可工作。

import time

import sortedcontainers
from operator import neg


def pi(x):
    nums = sortedcontainers.SortedSet(range(3, x + 1, 2), neg)
    nums.add(2)
    # print(nums)
    prm_lst = set([])
    while nums:
        p = nums.pop()
        prm_lst.add(p)
        nums.difference_update(set(range(p, x + 1, p)))
    # print(prm_lst)
    return prm_lst


if __name__ == "__main__":
    N = int(input())
    start = time.time()
    print(len(pi(N)))
    end = time.time()
    print(end - start)

暫無
暫無

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

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