【Python 百练成钢】Python语言解决素数筛选问题的几种方式【朴素素数筛、埃氏筛、欧拉筛】

简介: 【Python 百练成钢】Python语言解决素数筛选问题的几种方式【朴素素数筛、埃氏筛、欧拉筛】

🤡前言🤡


素数是我们中学时代就接触过的概念,今天呢我们又提起了他足以见到了他对我们的重要性😻

我们再来重温一下素数(质数)的概念:

素数:只有两个正因数(1和它本身)的自然数即为质数。比1大但不是素数的数称为合数。

合数:合数是指在大于1的整数中除了能被1和本身整除外,还能被其他数(0除外)整除的数

你可能会说不就是求解质数吗?有什么难的,我三下五除二就给你解决了。只能说雀食是,对

于数据量较小的质数求解,我们分分钟搞定。但是如果我要求对于2-107以内的素数呢?这可

怎么办107的数据量特定要超时了呀。唉好不容易有一道会写的题还给超时了,真气人😈。

今天呢咱们就带大家学习一下,如何优美的求解出大数据量下的素数。


bd4c03e15bf94c6dabbac7dcff3df4c3.gif


💟素数筛问题描述💞


将2~n之间所有的素数筛选出来,其中n<=10^6

样例输入:n 一个整数,作为筛选区间的右边界

样例输出:2-n之间的素数个数(包括n)

使用常规方法进行筛选的话会,如果数据规模较小还可以

如果数据规模较大就会很耗费时间。

可以大致分为一下几类:


新手筛(朴素筛)

新手优化筛

埃拉托斯特尼算法(常称为埃氏筛)

欧拉筛

测试数据分别为

新手筛 测试数据10^5 阶乘结果9592用时21.401952028274536s

新手优化筛 测试数据10^6 阶乘结果78498用时3.4318480491638184s

埃氏筛

测试数据10^6 阶乘结果78498用时0.27430033683776855s

测试数据10^7 阶乘结果664579用时2.836449384689331s

欧拉筛

测试数据10^6 阶乘结果78498 用时0.6881604194641113s

测试数据10^7 阶乘结果664579用时6.959389925003052s

由此间得,使用筛法可以大大的节约我们的时间,为什么一定要节约时间呢?

通常素数在问题求解中并不是核心算法,所以我们必须对其进行优化,以给核心算法争取更多的时间。🤤


💟新手筛💞



💙问题分析💙


入门的程序员就应该会,主要考察我们的编程小技巧。以及对素数的理解。😵‍💫


💙代码实现💙


import time
n=int(1e6)
ans=0
def sieve(n):
    for i in range(2,n):
        if n%i==0:
            return False
    return True
start=time.time()
for i in range(2,n):
    if sieve(i):
        ans+=1
end=time.time()
print(f"阶乘结果{ans}用时{end-start}")


💟新手优化筛💞



💜问题分析💜


优化了一下代码,也就是对循环变量的终止条件开了个方。🥳


💜代码实现💜


import time
n=int(1e6)
ans=0
def sieve(n):
    for i in range(2,int(math.sqrt(n))+1):
        if n%i==0:
            return False
    return True
start=time.time()
for i in range(2,n):
    if sieve(i):
        ans+=1
end=time.time()
print(f"阶乘结果{ans}用时{end-start}")


💟埃氏筛💞


🤍问题分析🤍


这里内层循环从ii开始是因为i~ii之间的合数总会被i之前的数筛选掉,剩余的都是质数。

没有必要对筛选过的再进行一遍筛选。利用这个性质可以知道当外层循环条件达到n的开方后

就可以筛选到整个序列2~n了,所以外层循环写到int(math.sqrt(n+1)即可,为了安全起见进行加1

不加总感觉可能会错,加了并不影响效率🧐


🤍代码实现🤍


import time
n=int(1e6)
ans=0
start=time.time()
ans=[False]*(n+1)
ans[0]=False
ans[1]=True
for i in range(2,int(math.sqrt(n+1)+1)):
    if not ans[i]:
        for j in range(i*i,n+1,i):
            ans[j]=True
end=time.time()
print(f"阶乘结果{n-sum(ans)}用时{end-start}")

💟欧拉筛(线性筛)💞



💗问题分析💗


埃氏筛重复筛到的数据比如30,既要被3进行筛掉,又要被5筛掉显然筛选重复了

欧拉筛加了一个判断条件,免去了筛除重复数据的步骤。👋


💗代码实现💗


import time
n=int(1e6)
ans=0
start=time.time()
ans=[False]*(n+1)
ls=[]
ans[1]=True
s=0
for i in range(2,n+1):
    if not ans[i]:
        ls.append(i)
    s=len(ls)
    for j in range(s):
        if i*ls[j] >n:
            break
        ans[i*ls[j]]=True
        if i%ls[j]==0:
            break
end=time.time()
print(len(ls),end-start)


相关文章
|
21天前
|
数据采集 机器学习/深度学习 人工智能
Python:现代编程的首选语言
Python:现代编程的首选语言
191 102
|
21天前
|
人工智能 自然语言处理 算法框架/工具
Python:现代编程的首选语言
Python:现代编程的首选语言
185 103
|
21天前
|
机器学习/深度学习 人工智能 数据挖掘
Python:现代编程的首选语言
Python:现代编程的首选语言
130 82
|
7月前
|
机器学习/深度学习 算法 Python
机器学习特征筛选:向后淘汰法原理与Python实现
向后淘汰法(Backward Elimination)是机器学习中一种重要的特征选择技术,通过系统性地移除对模型贡献较小的特征,以提高模型性能和可解释性。该方法从完整特征集出发,逐步剔除不重要的特征,最终保留最具影响力的变量子集。其优势包括提升模型简洁性和性能,减少过拟合,降低计算复杂度。然而,该方法在高维特征空间中计算成本较高,且可能陷入局部最优解。适用于线性回归、逻辑回归等统计学习模型。
260 7
|
2月前
|
机器学习/深度学习 自然语言处理 数据可视化
Python:简洁而强大的通用语言
Python:简洁而强大的通用语言
|
2月前
|
机器学习/深度学习 人工智能 运维
Python:简洁高效的万能语言
Python:简洁高效的万能语言
|
2月前
|
机器学习/深度学习 人工智能 数据可视化
Python:简洁高效的万能“胶水语言”
Python:简洁高效的万能“胶水语言”
|
3月前
|
JavaScript Java Go
Go、Node.js、Python、PHP、Java五种语言的直播推流RTMP协议技术实施方案和思路-优雅草卓伊凡
Go、Node.js、Python、PHP、Java五种语言的直播推流RTMP协议技术实施方案和思路-优雅草卓伊凡
178 0
|
3月前
|
JSON JavaScript 前端开发
Python+JAVA+PHP语言,苏宁商品详情API
调用苏宁商品详情API,可通过HTTP/HTTPS发送请求并解析响应数据,支持多种编程语言,如JavaScript、Java、PHP、C#、Ruby等。核心步骤包括构造请求URL、发送GET/POST请求及解析JSON/XML响应。不同语言示例展示了如何获取商品名称与价格等信息,实际使用时请参考苏宁开放平台最新文档以确保兼容性。
|
8月前
|
JavaScript 搜索推荐 Android开发
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
270 8
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡

热门文章

最新文章

推荐镜像

更多