质数相关知识点详解

质数相关知识

本篇随笔讲解信息学奥林匹克竞赛相关数学知识中质数的相关内容,大体包括质数的筛选和判定方法。需要读者具有不低于高中一年级的数学基础知识素养,本篇随笔将不再对数学基本知识、概念及符号等进行讲解。请有需要的同学自行补习。

上课!!

1、质数的定义及基本概念

定义:若一个正整数无法被除了1和它自身之外的任何数整除,则称该数为质数(或素数)。否则称该数为合数。

我们需要明确,整个自然数集合中,质数的分布比较稀疏,对于一个足够大的整数\(N\),不超过它的质数大约有\(\frac{N}{ln N}\)个,换句话说,就是每\(ln N\)个数中大约有1个质数。

2、质数的判定(试除法)

我们需要明确,计算机最优秀的地方在于机械地重复同一件事,针对质数的判定,正好是它的“强项”,我们只需要按照定义入手,枚举从2到n的所有数,如果能整除,就返回false,试到最后还不能的话就返回true。

模板:

bool prime(int n)
{
    for(int i=2;i<n;i++)
        if(n%i==0)
            return false;
    return true;
}

但是这种方法会浪费大量的时间,假如程序需要多次调用这个函数判质数,就会大大增加算法的时间复杂度。所以我们常用的模板是一种优化版本(想不到吧)

我们这样来想,如果这个数\(N\)能够被一个数\(a\)整除(这个数当然会小于它),那一定还会有另外一个数\(b\)能整除它,而且\(b\cdot a\)一定等于\(N\)
所以,我们只需要枚举从2到\(\sqrt{N}\)即可。
模板:

bool prime(int n)
{
    for(int i=2;i<=sqrt(n);i++)
        if(n%i==0)
            return false;
    return true;
}

3、质数的筛选

质数的筛选就是给定数\(N\),要求找出从1到\(N\)的所有质数。质数的筛选是信竞中很重要的研究课题,也是一些基础数学题的重要解题模型。

(1)Eratosthenes筛法

Eratosthenes筛法即埃斯托拉特尼筛法,简称埃氏筛法。它基于这样的思路:
任意整数的倍数都不是质数
基于这样的想法,我们就从2开始从小到大枚举每个数\(x\),并把它小于\(N\)的倍数全部打上标记,当我们扫描到一个数的时候,如果它还未被标记,它就是个质数。
这种筛法极好理解,但是效率较低,我们可以拿纸笔模拟,然后就能够发现,有一些数是多个质数的倍数,这样的话它就会被反复筛好几遍(比如说6),这样虽然对正确答案不会造成影响,但却影响程序运行的效率。所以我们对埃氏筛法进行优化:
对于每个数\(x\),我们从\({x^2}\)开始标记,把\({x^2}\),\((x+1)\cdot x\),\(\cdots\),\(\frac{N}{x}\cdot x\)打标记即可。

优化后模板:

void Estorathenes(int n)
{
    memset(v,0,sizeof(v));
    cnt=0;
    for(int i=2;i<=n;i++)
    {
        if(v[i])
            continue;
        prime[++cnt]=i;
        for(int j=i;j<=n/i;j++)
            v[i*j]=1;
    }
}

(2)Euler筛法

Euler筛法即欧拉筛法,也叫快筛,线性筛法。是信竞中最常用的质数筛法,以伟大的数学家欧拉的名字命名,建议大家熟练掌握。
上述的埃氏筛法即便在优化后也会重复标记,虽然已经少了很多重复,但还是不够快速。比如,12既会被2标记也会被3标记,因为12=62=43.为什么会出现这种情况呢?因为我们在按照埃氏筛法筛选的时候,并没有找出确定12的唯一方式,导致12的重复遍历不可避免。
按照这个基础,出现了快筛算法,它的基本思想是这样:我们在生成一个需要被标记的合数的时候,每次只向现有的数中乘上这个合数的最小质因子,这样一来,合数的质因子便被从小到大地累计起来,那刚才的12来说,它就被唯一分解成322。
这个算法的时间复杂度是\(O(N)\)的。

欧氏筛法模板:

void Euler(int n)
{
    memset(v,0,sizeof(v));//v[i]表示i的最小质因子
    cnt=0;
    for(int i=2;i<=n;i++)
    {
        if(!v[i])
            v[i]=prime[++cnt]=i;
        for(int j=1;j<=cnt;j++)
        {
            if(prime[j]>v[i] || prime[j]>n/i)
                break;
            v[i*prime[j]]=prime[j];
        }
    }
}

4、质因数分解

整数的唯一分解定理

这个定理hin重要!!!

整数的唯一分解定理:任何一个大于1的整数都可表示为若干个质数的乘积,表示如下:
\[ {N}={{p_1}^{c_1}}\cdot{{p_2}^{c_2}}\cdot \cdots \cdot{{p_m}^{c_m}} \]

即:
\[ {N}=\prod_{i=1}^{i=k}{p_i}^{c_i} \]

所以我们通过如上定理分析出质因数分解在计算机上的实现:
先从2到\(\sqrt{N}\)扫描所有整数\(x\),如果\(x\)能整除\(N\),那么就在因子表上加上它,并用\(N\)一直除\(x\),每次除就在指数表c数组中++,一直到除不尽为止。

代码实现:

void divide(int n)
{
    cnt=0;
    for(int i=2;i<=sqrt(n);i++)
    {
        if(n%i==0)
        {
            prime[++cnt]=i;
            c[cnt]=0;
        }
        while(n%i==0)
            n/=i,c[cnt]++;
    }
    if(n>1)
        prime[++cnt]=n,c[cnt]=1;
}

转载于:https://www.cnblogs.com/fusiwei/p/11354110.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值