快速求素数表——埃氏筛法与欧拉筛法

来源:互联网 发布:郭敬明作品集软件下载 编辑:程序博客网 时间:2024/06/05 03:07

原文地址:http://blog.csdn.net/hzeuhjejnj/article/details/78658865


快速求素数表——埃氏筛法与欧拉筛法

  • 快速求素数表埃氏筛法与欧拉筛法
    • 埃氏筛法
      • 埃氏筛法原理
      • 埃氏筛法时间复杂度
      • 埃氏筛法代码求出1000000以内的素数并且输出n个素数
    • 欧拉筛法
      • 欧拉筛法原理
      • 欧拉筛法时间复杂度
      • 埃欧拉筛法代码求出1000000以内的素数并且输出n个素数

埃氏筛法

埃氏筛法原理

素数的定义:素数就是除了1和本身之外没有其他的约数,所以有约数的都不是素数。 
因此,埃氏筛法的思想就是:先去掉2的倍数,再去掉3的倍数,再去掉4的倍数,……依此类推,直到最大数小于最后一个标出的素数的平方,那么剩下的序列中所有的数都是素数。

埃氏筛法时间复杂度

O(nloglogn)

时间复杂度的证明戳此链接

埃氏筛法代码【求出1000000以内的素数并且输出n个素数】

#include<iostream>#include<cstring>using namespace std;#define LENGTH 1000000int is_prime[LENGTH];int prime[LENGTH];int main(){    int n,p=1,i;     memset(is_prime,0,sizeof(int)*LENGTH);    is_prime[2]=0;    for(i=2;i<=1000;i++){        if(is_prime[i]==0){            prime[p++]=i;            for(int j=2*i;j<=1000000;j+=i)                is_prime[j]=1;            }    }    for(;i<=1000000;i++)        if(is_prime[i]==0)            prime[p++]=i;    while(cin>>n){        for(int i=1;i<=n;i++)        cout<<prime[i]<<endl;    }    return 0;} 

欧拉筛法

欧拉筛法原理

欧拉筛法的原理同埃氏筛法,只不过多了一个判断删除的过程。 
首先,任何合数都能表示成多个素数的积。所以,任何的合数肯定有一个最小质因子。我们通过这个最小质因子就可以判断什么时候不用继续筛下去了。 
当i是prime[j]的整数倍时(i % prime[j] == 0),i*prime[j+1]肯定被筛过,跳出循环。 
因为i可以看做prime[j]某个数, i*prime[j+1]就可以看做 prime[j]某个数*prime[j+1] 。而 prime[j] 必定小于 prime[j+1], 
所以 i*prime[j+1] 必定已经被 prime[j]*某个数 筛掉,就不用再做了

欧拉筛法时间复杂度

O(n)

埃欧拉筛法代码【求出1000000以内的素数并且输出n个素数】

#include<iostream>#include<cstring>#include<cmath>using namespace std;#define LENGTH 700001int is_prime[LENGTH];//是否是素数 int prime[LENGTH];//素数表 int pri[LENGTH];//欧拉函数表 int main() {    int a, b;    memset(is_prime, 0, sizeof(int)*LENGTH);    memset(prime, 0, sizeof(int)*LENGTH);    memset(pri, 0, sizeof(int)*LENGTH);    for (int i = 2, t = 0, p = 0; i <= LENGTH; i++) {        pri[i] = pri[i - 1];        if (is_prime[i] == 0)        {            prime[p++] = i;            pri[i]++;        }        for (int j = 0; j<p&&i*prime[j] <= LENGTH; j++) {            is_prime[i*prime[j]] = 1;            if (i%prime[j] == 0)                break;        }    }    return 0;}


原创粉丝点击