社区讨论

请教大佬们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 条回复,欢迎继续交流。

正在加载回复...