码迷,mamicode.com
首页 > 其他好文 > 详细

素数筛选

时间:2019-08-29 13:38:26      阅读:101      评论:0      收藏:0      [点我收藏+]

标签:img   for   http   inf   eof   memset   复杂度   break   set   

简单的引入一下欧拉函数


 

技术图片

 

 

 


 

素数筛选知道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;
}

 

 

证明:


技术图片

 

素数筛选

标签:img   for   http   inf   eof   memset   复杂度   break   set   

原文地址:https://www.cnblogs.com/Shallow-dream/p/11429071.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!