社区讨论
请教大佬们python3素数筛
学术版参与者 7已保存回复 21
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 21 条
- 当前快照
- 1 份
- 快照标识符
- @lo14ce0m
- 此快照首次捕获于
- 2023/10/22 14:59 2 年前
- 此快照最后确认于
- 2023/11/02 14:31 2 年前
如题,请看这两个python3代码:
PYTHON"""
埃氏筛。时间复杂度:n logn
以下筛法存在一个问题:用下标储存素数信息,有可能导致MLE。
解决方法:?
"""
import math
import time
start_time = time.time() # 监控运行时间
# n = int(input('Please input a range:'))
n = 10 ** 8
list_prime = [True] * (n + 3)
end = math.floor(math.sqrt(n)) + 1
for i in range(2, end): # 从2开始,将已知的素数作为1~n各数的质因数,筛去这些合数
if list_prime[i]:
for j in range(i ** 2, n + 1, i): # 因为是最小质因数,所以对于某个质数i,它所筛去的合数不可能小于 i ** 2
list_prime[j] = False
for i in range(2, n+1):
if list_prime[i]:
print(i)
end_time = time.time()
run_time = end_time - start_time # 监控运行时间
print('%.10f' % run_time)
PYTHON"""
欧拉筛。理论时间复杂度为 n
"""
import time
start_time = time.time()
# n = int(input('Please input a range:'))
n = 10 ** 8
num_list = [True] * (n + 3)
prime_list = []
for i in range(2, n + 1):
if num_list[i]:
prime_list.append(i)
for j in range(0, len(prime_list)):
if prime_list[j] * i > n:
break
num_list[prime_list[j] * i] = False
if i % prime_list[j] == 0:
break
for i in prime_list:
print(i)
end_time = time.time()
run_time = end_time - start_time
print('%.10f' % run_time)
实际运行,在数据量为10**8量级时,埃氏筛的速度为25s左右,而欧拉筛为40s。
这几乎是我对着c++欧拉筛模板翻译的python代码,难道是翻译时使用的数据结构出了问题吗?
回复
共 21 条回复,欢迎继续交流。
正在加载回复...