数论——素数筛法

来源:互联网 发布:黑暗之魂剧情分析知乎 编辑:程序博客网 时间:2024/05/29 06:47

1.基本筛法

#define N 16777220bool prime[N];void doprime1(){    int m, n, t;    memset(prime, 1, sizeof(prime));    int e =(int)sqrt(float(N));    prime[0] = prime [1] = false;    for(int i=4; i<=N; i+=2)        prime[i]=false;    for(int i=3; i<=e; i+=2)        if(prime[i])        for(int j=i+i; j<=N; j+=i)            prime[j]=false;}

2.埃拉托色尼筛法

#define N 16777220bool isprime[N];int prime[N], nprime;void doprime(){    nprime = 0;    memset(isprime, true, sizeof(isprime));    isprime[1]=false;    for(int i=2; i<N; i++)        if(isprime[i])        {            prime[++nprime]=i;            for(int j=i*i; j<N; j+=i)                isprime[j]=false;        }

3.6N+1、6N-1法
只有形如6N+1或6N-1的自然数才有可能是素数
在程序上,外循环i按3的倍数递增,内循环j按照0~1的循环,则2(i+j)-1恰好就是形如6N+1或6N-1的自然数

int prime[N], k=0;bool Isprime(int x){    if(k==2)        return true;    if(k%2 == 0)        return false;    for(int i=3; i*i<=k; i+=2)        if(!(k%i))            return false;    return true;}void doprime(){    for(int i=1; i<=N; i+=3)        for(int j=0; j<2; j++)            if(Isprime(2*(i+j)-1)            prime[k++]=2*(i+j)-1;}
原创粉丝点击