首页 > 编程语言 >素数筛法算法

素数筛法算法

时间:2024-10-15 10:19:22浏览次数:3  
标签:筛法 int 合数 算法 素数 maxn isprime

素数定义:

素数是指在大于 1 的自然数中,除了 1 和它本身外,没有其他因数的数。换句话说,素数只有两个正因数:1 和它本身。

注意:0和1既不是质数也不是合数。

inline bool isprime(int x)
{
    for(int i=2;i<=x-1;++i)
    {
        if(x%i==0)return 0;
    return 1;
    }
}
int main()
{
    int N;
    scanf("%d",&N);
    for(int i=2;i<=N;++i)
        if(isprime(i))printf("%d",i);
    return 0;
}

这段带代码为了找出2--N以内的素数,所以在函数isprime函数内进行筛选,通过素数定义很容易理解这串代码,但是在时间上的优化还远远不够。

eg :13

如果按照上面的代码,我们需要判断2——12。

inline bool isprime(int x)
{
    int sq=sqrt(x);
    for(int i=2;i<=sq&&i<sq;++i)
    {
        if(x%i==0)return 0;
    return 1;
    }
}


优化一下,将这个数开一下平方,缩小一下范围,虽然提高了运行速度,但还远远不够。

i<=sqrt(x)将两边平方:i*i<=x,但是如果i太大的话i*i就会溢出,改写一下变成i<=x/i,代码为:

inline bool isprime(int x)
{
    int sq=sqrt(x);
    for(int i=2;i<=x/i;++i)
    {
        if(x%i==0)return 0;
    return 1;
    }
}

朴素筛法

一个合数,一定存在非1非本身质因子,意思就是,例如合数4,它一定是2*2,当我们得到2时,把2的倍数都筛掉,留下来的就是素数。

const int maxn=1e6+18;
bitset<maxn> pri; //默认全为0
inline bool isprime(int x)
{
    for(int i=2;i<=x/i;++i)
        {
        if(x%i==0)return 0;
     return 1;   
        }
}

int main()
{
    int N=1e6,cnt=0;
    for(int i=2;i<=N;++i)
    {
        if(isprime(i))
            for(int j=2*i;j<=N;j+=1)pri[j]=1;
    }
        for(int i=2;i<=N;++i)if(!pri[i])cnt++;
}

这里就已经构成了筛法,但是思考一下可以发现,代码中可以不需要素数判断。

const int maxn=1e6+18;
bitset<maxn> pri; //默认全为0


int main()
{
    int N=1e6,cnt=0;
    for(int i=2;i<=N;++i)
    {
        if(!pri[i])
            for(int j=2*i;j<=N;j+=1)pri[j]=1;
    }
        for(int i=2;i<=N;++i)if(!pri[i])cnt++;
}

欧拉筛法

原理:欧拉筛法的核心思想是通过排除法,逐一标记合数,同时确保每个合数只被其最小的质因数标记一次。具体步骤如下:

const int maxn=1e7+10;
bistset<maxn> pri;0为素数,1为合数(被筛除)
int primes[maxn],pp=0;
int main()
{
    int N=1e7,cnt=0;
    for(int i=2;i<=N;++i)
    {
        if(!pri[i])primes[++pp]=i,cnt++;
        for(int j=1;primes[j]*i<=N;++j)
            {
                pri[primes[j]*i]=1;
                if(i%primes[j]==0)break;
            }
    }
}

标签:筛法,int,合数,算法,素数,maxn,isprime
From: https://blog.csdn.net/2301_81188158/article/details/142766626

相关文章

  • (递归)算法
    递归条件:1.终止条件,当满足这个条件时,递归将停止并返回一个值,这个条件是为了防止函数无限递归,导致栈溢出。2.递归条件,这个是函数调用自身的地方,通常是通过将问题分解为更小的子问题来解决。例如求n的阶乘:deffactorial(n):#基线条件ifn==0:return1......
  • 【机器学习(五)】分类和回归任务-AdaBoost算法-Sentosa_DSML社区版
    @目录一、算法概念一、算法原理(一)分类算法基本思路1、训练集和权重初始化2、弱分类器的加权误差3、弱分类器的权重4、Adaboost分类损失函数5、样本权重更新6、AdaBoost的强分类器(二)回归算法基本思路1、最大误差的计算2、相对误差计算3、误差损失调整4、权重系数计算5、更新样本......
  • 【机器学习(七)】分类和回归任务-K-近邻 (KNN)算法-Sentosa_DSML社区版
    @目录一、算法概念二、算法原理(一)K值选择(二)距离度量1、欧式距离2、曼哈顿距离3、闵可夫斯基距离(三)决策规则1、分类决策规则2、回归决策规则三、算法优缺点优点缺点四、KNN分类任务实现对比(一)数据加载和样本分区1、Python代码2、Sentosa_DSML社区版(二)训练模型1、Python代码2、Sento......
  • 【机器学习(六)】分类和回归任务-LightGBM算法-Sentosa_DSML社区版
    @目录一、算法概念二、算法原理(一)Histogram(二)GOSS1、信息增益2、近似误差(三)EFB三、算法优缺点(一)优点(二)缺点四、LightGBM分类任务实现对比(一)数据加载和样本分区1、Python代码2、Sentosa_DSML社区版(二)模型训练1、Python代码2、Sentosa_DSML社区版(三)模型评估和模型可视化1、Python代......
  • 【机器学习(十一)】糖尿病数据集分类预测案例分析—XGBoost分类算法—Sentosa_DSML社
    @目录一、XGBoost算法二、Python代码和Sentosa_DSML社区版算法实现对比(一)数据读入和统计分析(二)数据预处理(三)模型训练与评估(四)模型可视化三、总结一、XGBoost算法  关于集成学习中的XGBoost算法原理,已经进行了介绍与总结,相关内容可参考【机器学习(一)】分类和回归任务......
  • 【机器学习(十二)】机器学习回归案例之二手汽车价格预测—XGBoost回归算法—Sentosa_D
    @目录一、算法和背景介绍二、Python代码和Sentosa_DSML社区版算法实现对比(一)数据读入与统计分析(二)数据处理(三)特征选择与相关性分析(四)样本分区与模型训练(五)模型评估和模型可视化三、总结一、算法和背景介绍  关于XGBoost的算法原理,已经进行了介绍与总结,相关内容......
  • 计算机视觉与机器学习 | 目标检测 - 主流算法介绍 - 从RCNN到DETR(建议收藏 !)
    本文来源公众号“计算机视觉与机器学习”,仅用于学术分享,侵权删,干货满满。原文链接:目标检测-主流算法介绍-从RCNN到DETR1前言目标检测是计算机视觉的一个非常重要的核心方向,它的主要任务是目标定位和目标分类。让我们跟随文章的介绍一起来回顾一下这些年目标检测的发展......
  • Java常见排序算法-插入排序
    一、算法介绍 插入排序是一种简单且常用的排序算法,它的实现思路是将列表分为已排序和未排序两部分,每次从未排序部分取出一个元素,将它插入到已排序部分的适当位置,最终将列表排序完成。即将未排序的数值直接插入有序的一组数中,使得插入后的这组数还是有序的。二、算法示意图......
  • 基于人工智能的图像分类算法研究与实现 - 深度学习卷积神经网络图像分类
    毕业设计-基于人工智能的图像分类算法研究与实现-深度学习卷积神经网络图像分类文章目录0简介深度学习作为机器学习领域内新兴并且蓬勃发展的一门学科,它不仅改变着传统的机器学习方法,也影响着我们对人类感知的理解,已经在图像识别和语音识别等领域取得广泛的应用......
  • DeepSORT算法实现车辆和行人跟踪计数和是否道路违规检测(代码+教程)
    DeepSORT算法实现车辆和行人跟踪计数和是否道路违规检测(代码+教程)特征提取此处面对的场景是是交通摄像头下的马路场景,数据格式为视频流或者视频,所以我们要提取视频的第一帧作为背景来进行车道线的标定,运行extra.py文件即可提取第一帧背景图片。✍......