小于等于 x 的素数个数

Number of primes less than or equal to x

π(x) = 素数个数≤ x

下面的代码给出了小于或等于 N

的素数个数

它非常适合 N<=100000,

您可以从这个 thread 中读取最快的方法,如下所示,使用此函数 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() returns 是质数时,您的代码才是正确的,而只有当 nums.pop() returns 是集合中的最小元素时,您的代码才是正确的。据我所知,这不能保证是真的。有一个名为 sortedcontainers 的第三方模块提供了一个 SortedSet class,可用于使您的代码只需很少的更改即可工作。

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)