python 高效求解质数-- 埃氏筛法

简介: python 高效求解质数-- 埃氏筛法

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(z)
print(k) # 个数
print(z) # 质数


埃氏筛


如果 x是质数,那么大于 x 的 n 的倍数 2x,3x,… 一定不是质数,

首先生成一个数组用来储存数字是否是质数,默认都是质数,出现一次质数就将它的倍数全部标记为不是质数,


埃氏筛刚开始的运行时间较长,因为要不断的对质数倍数的标记,后面的运行就会越来越快

一亿个数大概不到3分钟就可以找出来所有的质数


结合这个图能够更好的理解


c6339f8843464dc88d75dfd6b02db41c.gif

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(z)
        for j in range(i+i,n,i):   # 将是指数的倍数的数都改为False
            s[j] = False
print(k) # 个数
print(z) # 质数

时间复杂度 O(nloglogn)

质数筛最少需要一个长度为n的数组进行存储标识

相关文章
|
8月前
|
Python
Python质数判断
Python质数判断
|
8月前
|
算法 Python
python:判断一个数是否为质数
python:判断一个数是否为质数
|
算法 安全 机器人
Python语言如何使用MindOpt建模并求解二次规划问题
MindOpt是一款高效的优化算法软件包,求解算法实现了线性规划(LP)、混合整数线性规划(MILP)、二次规划(QP),可以支持命令行、c、c++、java和python调用。接下来我们将发布一系列文章,讲述各个语言如何使用 MindOpt 来求解数学规划问题。
Python语言如何使用MindOpt建模并求解二次规划问题
|
3月前
|
Python
Python - 获取 100 以内的质数
Python - 获取 100 以内的质数
|
8月前
|
Python
如何判断一个数是质数? 要求:编写一个Python函数,输入一个整数,输出该整数是否为质数。质数是指大于1的自然数中,除了1和它本身以外不再有其他因数的数。
如何判断一个数是质数? 要求:编写一个Python函数,输入一个整数,输出该整数是否为质数。质数是指大于1的自然数中,除了1和它本身以外不再有其他因数的数。
403 1
|
8月前
|
Python
用python打印前100个最小的质数
用python打印前100个最小的质数
128 1
|
8月前
|
Python
python打印质数
python打印质数
85 2
|
8月前
|
Python
用python打印前100个最小的质数
用python打印前100个最小的质数
111 2
|
8月前
|
Go Python Java
Python每日一练(20230413) 最后一个单词长度、全排列、计数质数
Python每日一练(20230413) 最后一个单词长度、全排列、计数质数
69 0
Python每日一练(20230413) 最后一个单词长度、全排列、计数质数
Python语言如何使用MindOpt建模并求解混合整数线性规划问题
MindOpt是一款高效的优化算法软件包,求解算法实现了线性规划(LP)、混合整数线性规划(MILP)、二次规划(QP),可以支持命令行、c、c++、java和python调用。接下来我们将发布一系列文章,讲述各个语言如何使用 MindOpt 来求解数学规划问题。
Python语言如何使用MindOpt建模并求解混合整数线性规划问题