素数筛法【Sieve Of Eratosthenes + Sieve Of Euler】
来源:互联网 发布:绩效工资表软件 编辑:程序博客网 时间:2024/05/17 01:34
拖了有段时间,今天来总结下两个常用的素数筛法:
1、sieve of Eratosthenes【埃氏筛法】
这是最简单朴素的素数筛法了,根据wikipedia,时间复杂度为 ,空间复杂度为O(n)。
算法思想:先假定所有的数都是素数,然后从最小的素数2出发,把素数的所有倍数筛出去。又因为一个数的质因数都是成对出现的,比如100 = 1*100 = 2*50 = .....= 10*10,所以筛素数时只用筛到 n的开平方就行了。
伪代码如下:
对于任意的范围n,
设bool prime[ ],初始化 2→n 的元素为false,
for(i=2; i < sqrt(n); i+++)
if (!prime[ i ])
for(j = i*i; j * i < n; j+=i)
prime[ j ] = false
2、sieve of Euler【欧拉线性筛】
尽管把埃氏筛法“优化”到n的开平方,但是还是做了很多重复的工作,比如 合数 6,它就会被2,和3重复筛出。
根据“每个整数都可以分解成它的 质因数之积”,因此每个数只需要被它的最小质因数筛除。
由上可以得到线性时间复杂度的筛法,欧拉筛法。
算法思路:
欧拉筛是个以空间换时间的算法,用prime[ ]数组记录素数,初始bool数组is_prime[ ]为false记录每个数是否是素数,
伪代码如下:
k = 0
for(i = 2; i < n; i++)
if(!is_prime[i])
prime[k++] = i
for(j = 0; j < k&&i * prime[ j ]; j++)
is_prime[i*prime[ j ]] = true;
if(i % prime[ j ]) break; //关键步骤。在此的prime[ j ]一定是i的最小质因子,you can gusse why~0-0
【以下是实现代码,外加两种算法在时间上的比对】
#include<iostream>#include<cstdio>#include<ctime>#include<cstring>using namespace std;const long long maxn = 100000000;bool is_prime[maxn];int EUprime[maxn];bool ERprime[maxn];int euler(int n){ int k = 0; memset(is_prime,false, sizeof(is_prime)); for(int i = 2; i <= n; i++){ if(!is_prime[i]) EUprime[k++] = i; for(int j = 0; j < k&&i * EUprime[j] <= n; j++){ is_prime[i*EUprime[j]] = true; if(i % EUprime[j] == 0) break; } } return k;}int eratosthense(int n){ int k = 0; memset(ERprime,false,sizeof(ERprime)); for(int i = 2; i * i <= n; i++){ if(!ERprime[i]){ for(int j = i*i; j <= n; j+=i){ ERprime[j] = true; } } } for(int i = 2; i <= n; i++) if(!ERprime[i]) {k++;} return k;}int main(){ //int n; clock_t st,ed; double sec; for(int i = 10; i < 1000000000; i *= 10){ cout<<i<<":"<<endl; int res; st = clock(); res = eratosthense(i); ed = clock(); sec = (double)(ed - st) / (double) CLOCKS_PER_SEC; printf("eratosthense :\t\t%8d\t%.8lf\n", res, sec); st = clock(); res = euler(i); ed = clock(); sec = (double)(ed - st) / (double) CLOCKS_PER_SEC; printf("Euler :\t\t%16d\t%.8lf\n", res, sec); }}
【可以看到在小数据上两个算法效率差别不大,在大数据情况下,Euler筛法的效率明显比埃氏筛法高】
- 素数筛法【Sieve Of Eratosthenes + Sieve Of Euler】
- Sieve of Eratosthenes(埃拉托斯尼斯筛法)
- Sieve of Eratosthenes[ZT]
- The Sieve of Eratosthenes
- Sieve of Eratosthenes
- sieve of Eratosthenes 找质素
- the Sieve of Eratosthenes
- 09 Sieve of Eratosthenes
- Sieve of Eratosthenes
- Sieve Of Eratosthenes求素数(埃拉托斯特尼筛法)
- Sieve of Eratosthenes(埃拉托斯特尼素数筛选法)--java实现
- 素数筛法/埃拉托斯特尼筛法(sieve of Eratosthenes)——理解及具体问题
- Sieve of Eratosthenes求质数
- Sieve of Eratosthenes算法实现
- sieve of Eratosthenes——一种寻找素数的方法
- Sieve of Eratosthenes Algorithm算法 JAVA实现
- 找质数算法(Sieve of Eratosthenes筛法)
- 生成质数的好方法:sieve of eratosthenes
- Liferay 6.1开发学习:编译调试修改源码
- instanceof、==、equals 区分和用法 还有return
- linux java vim
- php 正则验证字符串是否为数字
- java学习视频
- 素数筛法【Sieve Of Eratosthenes + Sieve Of Euler】
- PEP8 Python 编码规范整理
- 烙在心底的,始终无法抹去
- 快速排序 Java实现
- 高通CAMERA架构(一)
- Android Wear 设计原则
- 如何过诺顿主动防御
- Do you want to view only the webpage content that was delivered securely?
- 【技术类】【ArcGIS对国产卫星的支持2:高分一号卫星】篇5、实时表观反射率产品生产