素数筛选之“普通筛选”和“线性筛选”

来源:互联网 发布:制作直方图用什么软件 编辑:程序博客网 时间:2024/06/08 15:51

        作为一个入门者。。。最熟悉的只有素数筛选了。最先掌握的是普通筛选法,然后通过不判断偶数增加了普通筛选法的效率。今天接触了线性筛选法,虽然不是完全明白其中道理,但是相比普通筛选法还是有了(只有)速度的提升。

 下面贴代码:

普通筛选法(去掉偶数的判定)

#include <iostream>#include <cmath>#include <windows.h>#define MAX 100000000                      //prime in [0,10000 0000]using namespace std;long primeNumber[6000000]={2},n=1;               //about 6m prime number in [0,10000 0000]int main(){    static bool prime[MAX/2];              //all value is false(0)    const bool IS=false,NOT=true;    cout<<"start find prime number in [0,"<<MAX<<"]..."<<endl;    double begin=GetTickCount();    for(long i=0;i*2+3<=MAX;i++){if(IS==prime[i]){    primeNumber[n++]=i*2+3;for(long j=3;j*(i*2+3)<=MAX;j+=2){prime[((j*(i*2+3))-3)/2]=NOT;}}}    double end=GetTickCount();    cout<<"runing time: "<<end-begin<<"ms"<<endl;    cout<<endl<<"find "<<n<<" prime numbers in [0,"<<MAX<<"]"<<endl;    cout<<"memeory use: "<<(sizeof prime +sizeof primeNumber)/1000000<<" MB"<<endl;    cout<<"the last 10 prime numbers is"<<endl;    for(int i=n-1;;i--)    {        if(n-i>10) break;        else cout<<primeNumber[i]<<endl;    }}

线性筛选法:

#include <iostream>#include <cmath>#include <windows.h>#define MAX 100000000                      //prime in [0,10000 0000]using namespace std;long primeNumber[6000000],n=0;               //about 6m prime number in [0,10000 0000]int main(){    static bool prime[MAX];              //all value is false(0)    const bool IS=false,NOT=true;    cout<<"start find prime number in [0,"<<MAX<<"]..."<<endl;    double begin=GetTickCount();    for(long i=2;i<MAX;i++){if(IS==prime[i]){    primeNumber[n++]=i;}for(long j=0;j<n&&primeNumber[j]*i<MAX;j++){            prime[primeNumber[j]*i]=NOT;if(i%primeNumber[j]==0) break;}}    double end=GetTickCount();    cout<<"runing time: "<<end-begin<<"ms"<<endl;    cout<<endl<<"find "<<n<<" prime numbers in [0,"<<MAX<<"]"<<endl;    cout<<"memeory use: "<<(sizeof prime +sizeof primeNumber)/1000000<<" MB"<<endl;    cout<<"the last 10 prime numbers is"<<endl;    for(long i=n-1;;i--)    {        if(n-i>10) break;        else cout<<primeNumber[i]<<endl;    }}

运行效果:


0 0