总所周知,质数(prime number)又称素数,除了1
和自身
外,不能被其他的自然数整除。
那么我们今天就来看看一个简单的寻找素数的算法,欧拉筛。欧拉筛是在埃氏筛的基础上做了一定的改进,大幅降低时间复杂度。
输入
输出
思想
n
个元素,包括素数和合数过程
n
的列表isPrime
,元素值代表是否为素数。prime
,元素值代表素数isPrime
,若元素值为1
,则将其加入prime
列表。prime
中的所有素数相乘:
prime
列表,得到的结果是最小素数相乘的合数算法
n=int(1e5+1)
prime=[]
isPrime=[1 for i in range(n+1)]
# 欧拉筛构建1-n的所有质数
for i in range(2,n+1):
if isPrime[i]==1:
# 质数加入队列
prime.append(i)
# 删除质数集构成的合数
for j in range(len(prime)):
if prime[j]*i<n:
# 合数去掉了
isPrime[prime[j]*i]=0
else:
break
# 通过最小质数来构建即可
if i%prime[j]==0:
# 当然第一次遇到还是要乘上去的,这样才会倍增
break
print(prime)
len(prime) # 664579
复杂度
时间复杂度约等于 O ( N ) O(N) O(N),它只对每个元素遍历一次。