素数筛选

Posted shallow-dream

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了素数筛选相关的知识,希望对你有一定的参考价值。

简单的引入一下欧拉函数


 

技术图片

 

 

 


 

素数筛选知道4种,暴力筛(逐个判断),埃拉特斯特尼筛 ,欧拉线性筛 ,一个大于5的素数一定在6的倍数周围(PS:不知道官方名是什么)


埃拉特斯特尼筛法。时间复杂度为O(n loglog n)

//倍数筛除 时间复杂度(o(nloglogn)
//一个素数的倍数一定不是素数
int vis[1000] , prime[1000];
void judge()

    memset(vis,1,sizeof(vis));
    int cnt=0;
    prime[0] = prime[1] = 0;
    for(int i=2;i<1000;i++)
    
        if(vis[i])
        
            prime[cnt++] = i;  //cout<<prime[cnt-1]<<endl;
            for(int j=i*i;j<1000;j+=i)
                vis[j] = 0;
        
    
    

欧拉线性筛法 时间复杂度(o(n) )

//欧拉线性筛法 时间复杂度(o(n))
const int MAXN=3000001;
int prime[MAXN];//保存素数
bool vis[MAXN];//初始化
void Prime(int n)

    int cnt=0;
    memset(vis,1,sizeof(vis));
    for(int i=2;i<=n;i++)
    
        if(vis[i])  prime[cnt++] = i; /* cout<<prime[cnt-1]<<endl;  */ 
        for(int j=0 ; j<cnt && i*prime[j]<n;j++)
           //  i*prime[j]<=n  容易将最后一个筛出
            vis[ i*prime[j] ] = 0;
            if(i%prime[j]==0) break;//避免重复筛
        
    
    cout<<cnt<<endl;

一个大于5的素数一定在6的倍数周围

//一个大于5的素数一定在6的倍数周围(时间复杂度小于sqrt(n))
// 判断素数  
typedef long long ll;
ll n,m;
ll prime(ll n)

    if(n < 2)return 0;
    if(n ==2 || n == 3)return 1;
    if(n % 6 != 1 && n % 6 != 5)return 0;
    for(ll i = 5; i * i <= n; i += 6)
    
        if(n % i == 0 || n % (i + 2) == 0)
        return 0;
    
    return 1;

 

 

证明:


技术图片

 

以上是关于素数筛选的主要内容,如果未能解决你的问题,请参考以下文章

素数筛选法

c语言中用筛选法求素数

小航的算法日记素数筛选

素数筛(筛选出一定范围内的所有素数)

素数筛时间空间优化

素数筛时间空间优化