请教大佬们python3素数筛
  • 板块学术版
  • 楼主ERIC_XIE
  • 当前回复21
  • 已保存回复21
  • 发布时间2023/10/11 12:46
  • 上次更新2023/11/2 14:31:14
查看原帖
请教大佬们python3素数筛
389915
ERIC_XIE楼主2023/10/11 12:46

如题,请看这两个python3代码:

"""
埃氏筛。时间复杂度: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)
"""
欧拉筛。理论时间复杂度为 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代码,难道是翻译时使用的数据结构出了问题吗?

2023/10/11 12:46
加载中...