素数筛选

简单的引入一下欧拉函数


 

 

 

 


 

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

 

 

证明:


 

posted @ 2019-08-29 12:42  __MEET  阅读(196)  评论(0编辑  收藏  举报