ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

欧拉筛法求素数

2021-07-13 08:01:23  阅读:227  来源: 互联网

标签:筛法 int 合数 break 素数 primes include 质数 欧拉


原文发布地址:https://www.acwing.com/blog/content/1725/

欧拉线性筛法求素数

时间复杂度:O(N)

先看代码,再进行解释


#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>

using namespace std;

const int N=1e6+10;
int primes[N];
bool st[N];

void get_primes()
{
    int cnt=0;
    //1不是质数也不是合数
    for(int i=2;i<=N;i++){
        if(!st[i]) primes[++cnt]=i;//没有被筛去,说明是质数
        for(int j=1;i*primes[j]<=N;j++){
            st[i*primes[j]]=true;//筛去合数
            if(i%primes[j]==0) break;//核心操作,保证了O(n)的复杂度
        }
    }
}

int main()
{
    //n以内的所有质数
    int n,cnt;
    cin >> n;
    get_primes();
    for(int i=1;primes[i]<=n;i++){
        cnt++;
    }
    cout << cnt << endl;
    return 0;
}

引理:算术基本定理——任何一个大于1的自然数N,如果N不为质数,那么N可以唯一分解成有限个质数的乘积

非常重要:1既不是质数也不是合数

显然,在所有大于0的自然数中,除了质数就是合数.要求质数,只需要"筛"去所有的合数即可.如何筛去合数,这里就应用到了算术基本定理.关于合数,这里我们需要注意两点:
(1).所有合数都要筛到
(2).不能有重复筛选,否则无法达到在线性时间内的运行了
要做到第一点,根据算术基本定理:n=q*m(q表示最小质数,m=N/q,显然m>=q),对N内的m和q进行枚举

for(某个数m;m<=N;m++){
    for(小于或等于m的质数q;q*m<=N;){...}
}

这样我们就保证了能枚举N以内的所有整数,然而我们还不能保证枚举的合数不重复。
先来思考一下为什么会有重复,由于对于任意一个n=m*q,m和q是相对的两个状态,m大了q就变小,m小了q就变大。
设n=m1*q1=m2*q2,q1<=q2<=m2<=m1我们这里需要保证当且仅当在q1是最小质因数时能求解,也就是去除q2和m2的情况.因为q1与q2互质,且q1<q2,则有m2%q1=0;
所以关键步骤来了: if(i%peimes[j]==0) break;
当i是primes[j]的倍数时直接跳出循环,设i=primes[j]*t,此时有i*primes[j+1]=primes[j]*t*primes[j+1]
可以看到此时的最小质数时primes[j],为了避免与当m=primes[j+1]*t时有重复,这里可以通过break跳过计算
此外还需注意:要保证m从2开始,因为1*q=1i%1==0;

补充注释:

3.3
第二个for循环的判断条件不需要的j<cnt:
(1).i是质数,那么当j=cnt时break
(2).i是合数,那么必然在最下素数处也会break

标签:筛法,int,合数,break,素数,primes,include,质数,欧拉
来源: https://www.cnblogs.com/Arno-vc/p/15004786.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有