首页 > 其他分享 >质数及其筛法

质数及其筛法

时间:2023-04-25 20:57:25浏览次数:32  
标签:筛法 int 合数 Omicron 复杂度 质数 及其

筛法

质数


质数,又称素数。如果一个数\(a \in \N^+(a\neq 1)\)的因子有且仅有\(1\)和它本身,则称数\(a\)为质数。

普通筛法

过程


  1. 枚举\([2,n-1]\),如果\(n\)在这个范围内有因子,则\(n\)不是因数。
  2. 因为\(n\)的因子成对出现,所以我们可以枚举\([2,\sqrt{n}]\)。

Code


bool isprime(int n)
{
	for(int i=2;i*i<=n;i++)
		if(n%i==0)
            return 0;
	return 1;
}
int main()
{
	scanf("%d",&n);
	for(int i=2;i<=n;i++) //将i=1排除掉。
		if(isprime(i))
        	printf("%d\n",i);
	return 0;
}

时间复杂度


时间复杂度为\(\Omicron(N\sqrt{N})\),因为太慢了,所以有以下两种更快的筛法。

埃式筛法

过程


  1. 循环从\(2\)~\(n\),判断当前的下标\(i\)是否曾经被确认为合数。
  2. 如果\(i\)不是合数,那么将质数\(i\)放进质数集合里并不断成倍增加,再将增加所得的数标记为合数,直至大于\(n\)为止。如果\(i\)为合数,重复找下一个\(i\)。

Code


void getprime(int n)
{
	for(int i=2;i<=n;i++)
	{
		if(flgs[i]==1) // flgs[i]表示i是否为合数
            continue;
		primes[++cnt]=i; // primes[]表示质数集合
		for(int j=i;j<=n/i;j++)
		    flgs[j*i]=1;
	}
}

时间复杂度


时间复杂度为\(\Omicron(N \log N)\)。

欧拉筛法

过程


  1. 循环从\(2\)~\(n\),判断当前的下标\(i\)是否曾经被确认为合数。
  2. 如果\(i\)不是合数,把质数\(i\)放进质数的集合里。
  3. 无论\(i\)是不是合数,都遍历一遍质数集合,并将集合中遍历到的当前元素\(p_j\)乘以\(i\)后标记为合数,直至\(p_j\times i >n\)。
  4. 执行步骤3时,如果\(p_j\mid i\),先将\(p_j\times i\)标记为合数,再重新找下一个\(i\)。

Code


void getprime(int n)
{
    for(int i=2;i<=n;i++)
    {
        if(flgs[i]==0)
            primes[++cnt]=i;
        for(int j=1;j<=cnt;j++)
        {
            if(primes[j]*i>n)
                break;
            flgs[primes[j]*i]=1;
            if(i%primes[j]==0)
                break;
        }
    }
}

时间复杂度


时间复杂度为\(\Omicron(N)\)。

标签:筛法,int,合数,Omicron,复杂度,质数,及其
From: https://www.cnblogs.com/Wang-Holmes/p/17353841.html

相关文章

  • 初等数学瞎扯Ⅲ:数论函数与筛法
    0.前置知识与基本定义\([op]\):值为\(1\)当且仅当方括号内条件为真。记为艾弗森括号唯一分解定理:一个正整数\(x\)可以被唯一分解为\(\prod\limits_{i=1}^mp_i^{c_i}\),其中\(\foralli\in[1,m],p_i\in\mathbb{P}\)。(关于\(\mathbb{P}\),详见初等数学瞎扯Ⅰ:同余相关)。......
  • 101到200的质数
    质数又称素数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数。我们设定一个数为x,根据质数的定义判断x是否为质数,我们看它能否被2、3、4······、x-1整除,如果它不能被其中任何一个整数整除,则这个数就是质数。思路就是先判断一个数是不是质数,再去拓展......
  • 自学大数据第16天~Pig安装与配置及其他
    Pig简介:ApachePig是一个用于分析大型数据集的平台,它由用于表达数据分析程序的高级语言以及用于评估这些程序的基础架构组成。Pig程序的显着特性是它们的结构适合大量的并行化,这反过来使它们能够处理非常大的数据集。基础设施层:目前,Pig的基础设施层由一个编译器组成,该编译器生成......
  • 标签,按钮和输入框及其参数说明
    Toga是一个Python的GUI工具包,提供了多种标准控件,如标签、按钮、输入框等,可以用于创建跨平台的GUI应用程序。以下是几种常用控件及其参数说明:1.标签-toga.Labeltoga.Label用于创建一个标签控件,用于显示静态文本。常用参数:text:标签显示的文本内容。style:标签的样式,如字体、......
  • 音视频通讯QoS技术及其演进
    利用多种算法和策略进行网络传输控制,最大限度满足弱网场景下的音视频用户体验。良逸|技术作者01什么是QoS?音视频通讯QoS是哪一类?QoS(QualityofService)是服务质量的缩写,指一个网络能够利用各种基础技术,为指定的网络通信提供更好的服务能力,是网络的一种安全机制,是用来解决网......
  • 什么是EAN13条码及其如何制作
    EAN13条码是世界通用的条形码,由前缀码、厂商识别码、商品项目代码和校验码组成,总共13位数字,其编码遵循唯一性原则,能够保证在全世界范围内不重复。 EAN13条码由左侧空白区、起始符、左侧数据符、中间分隔符、右侧数据符、校验符、终止符、右侧空白区及供人识别字符组成。我国......
  • 输出100-200之间所有的质数
    输出100-200之间所有的质数<script>lettotal=0;//计数器for(leti=100;i<200;i++){letnum=true;for(letq=2;q<i;q++){if(i%q==0)/*余数为零,能被整除*/{n......
  • 并查集及其扩展(附例题与完整讲解cpp)
    文章目录基础并查集1.P1551亲戚2.P1536村村通种类并查集1.P1892[BOI2003]团伙2.P1525[NOIP2010提高组]关押罪犯3.P2024[NOI2001]食物链带权并查集基础并查集并查集就是用来维护一些元素之间的关系的集合。例如A的亲戚是B,则我们可以把A与B放到同一个集合中,表示AB属......
  • 噪音及其在shader中的应用
    噪声的发明起初是为了解决“非纯色不规则”纹理占用内存太大的问题。噪声可以实现“局部细微渐变,全局差别很大”的效果。随机数无法达到这样的效果,但用随机数可以生产白噪声,再用高斯模糊达到类似的效果。在图形学api中,噪声可以看出是一个函数,用于模糊在网格上生成的随机数。所有......
  • C语言:求正整数的所有质数因子(如:180:2 2 3 3 5)
    #include<stdio.h>#求正整数的所有质数因子(如:180:22335)main(){intm,i;scanf("%d",&m);for(i=2;i<=m;i++){if(m%i==0){printf("%3d",i);m=m/i;......