python高效求解质数
质数的定义:在大于 1 的自然数中,除了 1 和它本身以外不再有其他因数的自然数。因此对于每个数 x,我们可以从小到大枚举 [2,x−1] 中的每个数 y,判断 y 是否为 xx 的因数。
暴力穷举
n = 151100
k = 0
z = []
for i in range(2,n):
for j in range(2,int(i**0.5)+1): # 开方,减少循环的次数
if i%j == 0:
break
else:
k+=1
z.append(i)
print(k) # 个数
print(z) # 质数
埃氏筛
如果 x是质数,那么大于 x 的 n 的倍数 2x,3x,… 一定不是质数,
首先生成一个数组用来储存数字是否是质数,默认都是质数,出现一次质数就将它的倍数全部标记为不是质数,
埃氏筛刚开始的运行时间较长,因为要不断的对质数倍数的标记,后面的运行就会越来越快
一亿个数大概不到3分钟就可以找出来所有的质数
结合这个图能够更好的理解
n = 10**8 # 代求的范围中的最大值
k = 0
s = [True for i in range(n)] # 首先默认所有数都是质数
z = []
for i in range(2,n):
if s[i]: # 判断是否为质数,如果没有被标记过,就是质数
k+=1
z.append(i) #添加质数
for j in range(i+i,n,i): # 将是指数的倍数的数都改为False
s[j] = False
print(k) # 个数
print(z) # 质数
时间复杂度 O(nloglogn)
质数筛最少需要一个长度为n的数组进行存储标识