[原]素数筛法【Sieve Of Eratosthenes + Sieve Of Euler】
拖了有段时间,今天来总结下两个常用的素数筛法:
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时间复杂度的感性证明
上代码. #include<cstdio> #include<cstdlib> #include<cstring> #define reg register con ...
- 埃拉托色尼筛法(Sieve of Eratosthenes)求素数。
埃拉托色尼筛法(Sieve of Eratosthenes)是一种用来求所有小于N的素数的方法.从建立一个整数2~N的表着手,寻找i? 的整数,编程实现此算法,并讨论运算时间. 由于是通过删除来实现, ...
- 使用埃拉托色尼筛选法(the Sieve of Eratosthenes)在一定范围内求素数及反素数(Emirp)
Programming 1.3 In this problem, you'll be asked to find all the prime numbers from 1 to 1000. Prime ...
- algorithm@ Sieve of Eratosthenes (素数筛选算法) & Related Problem (Return two prime numbers )
Sieve of Eratosthenes (素数筛选算法) Given a number n, print all primes smaller than or equal to n. It is ...
- 利用OpenMP实现埃拉托斯特尼(Eratosthenes)素数筛法并行化 分类: 算法与数据结构 2015-05-09 12:24 157人阅读 评论(0) 收藏
1.算法简介 1.1筛法起源 筛法是一种简单检定素数的算法.据说是古希腊的埃拉托斯特尼(Eratosthenes,约公元前274-194年)发明的,又称埃拉托斯特尼筛法(sieve of Eratos ...
- “计数质数”问题的常规思路和Sieve of Eratosthenes算法分析
题目描述 题目来源于 LeetCode 204.计数质数,简单来讲就是求"不超过整数 n 的所有素数个数". 常规思路 一般来讲,我们会先写一个判断 a 是否为素数的 isPrim ...
- hdu-2136 Largest prime factor---巧用素数筛法
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2136 题目大意: 每个素数在素数表中都有一个序号,设1的序号为0,则2的序号为1,3的序号为2,5的 ...
- codeforces-473D Mahmoud and Ehab and another array construction task (素数筛法+贪心)
题目传送门 题目大意:先提供一个数组,让你造一个数组,这个数组的要求是 1 各元素之间都互质 2 字典序大于等于原数组 3 每一个元素都大于2 思路: 1.两个数互质的意思就是没有公因子.所以每 ...
- [算法]素数筛法(埃氏筛法&线性筛法)
目录 一.素数筛的定义 二.埃氏筛法(Eratosthenes筛法) 三.线性筛法 四.一个性质 一.素数筛的定义 给定一个整数n,求出[1,n]之间的所有质数(素数),这样的问题为素数筛(素数的筛选 ...
随机推荐
- FullPage.js全屏滚动插件学习总结
如今我们经常能见到全屏网站,尤其是国外网站.这些网站用几幅很大的图片或色块做背景,再添加一些简单的内容,显得格外的高端大气上档次.比如 iPhone 5C 的介绍页面(查看),QQ浏览器的官网站.如果 ...
- ObjectStore onFetch方法获取记录总数
转自:http://blog.csdn.net/earthhour/article/details/38686029 ObjectStore onFetch方法获取记录总数 require(['doj ...
- EditorWindow edit ScriptableObject
using UnityEngine; [System.Serializable] public class Weapon { //[SerializeField] public string weap ...
- Firefly卡牌手游《暗黑世界V1.5》服务器端源码+GM管理后台源码
http://www.9miao.com/content-6-304.html Firefly卡牌手游<暗黑世界V1.5>服务器端源码+GM管理后台源码 关于<暗黑世界V1.5> ...
- 数据分页 THINKPHP3.2 分页 三种分页方法
数据分页 复制本页链接 opensns 通常在数据查询后都会对数据集进行分页操作,ThinkPHP也提供了分页类来对数据分页提供支持. 下面是数据分页的两种示例. 第一种:利用Page类和limit方 ...
- ASP.NET Session的七点认识
原文:http://kb.cnblogs.com/page/108689/ ASP.NET Session的使用当中我们会遇到很多的问题,那么这里我们来谈下经常出现的一些常用ASP.NET Sessi ...
- 机器学习在 IT 运维管理中的必要性!
机器学习技术在监控工具中的应用已经成为 IT 运维与 DevOps 团队的一大热点话题.尽管相关的使用案例很多,对 IT 团队而已真正的「杀手级应用」是机器学习如何提高实时事件管理能力,从而帮助较大规 ...
- codeforces 459C Pashmak and Buses(模拟,组合数A)
题目 跑个案例看看结果就知道了:8 2 3 题目给的数据是 n,k,d 相当于高中数学题:k个人中选择d个人排成一列,有多少种不同的方案数,列出其中n中就可以了. #include<iostre ...
- codeforces 425B Sereja and Table(状态压缩,也可以数组模拟)
题目 给出一个n*m的01矩阵, 让你最多改变k个里面的值(0变1,1变0), 使得0.1的连通分量是矩阵.输出最少步数 1 ≤ n, m ≤ 100; 1 ≤ k ≤ 10 题解: 如果01连通分量 ...
- zoj 2358,poj 1775 Sum of Factorials(数学题)
题目poj 题目zoj //我感觉是题目表述不确切,比如他没规定xi能不能重复,比如都用1,那么除了0,都是YES了 //算了,这种题目,百度来的过程,多看看记住就好 //题目意思:判断一个非负整数n ...