小于等于 x 的素数个数
Number of primes less than or equal to x
π(x) = 素数个数≤ x
下面的代码给出了小于或等于 N
的素数个数
它非常适合 N<=100000,
输入-输出Table
| 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)
您可以从这个 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)
π(x) = 素数个数≤ x
下面的代码给出了小于或等于 N
的素数个数它非常适合 N<=100000,
输入-输出Table
| 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)
您可以从这个 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)