[原]素数筛法【Sieve Of Eratosthenes + Sieve Of Euler】

时间:2022-05-03 10:31:16

拖了有段时间,今天来总结下两个常用的素数筛法:

1、sieve of Eratosthenes【埃氏筛法】

这是最简单朴素的素数筛法了,根据wikipedia,时间复杂度为 [原]素数筛法【Sieve Of Eratosthenes + Sieve Of Euler】,空间复杂度为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); }
}

[原]素数筛法【Sieve Of Eratosthenes + Sieve Of Euler】

【可以看到在小数据上两个算法效率差别不大,在大数据情况下,Euler筛法的效率明显比埃氏筛法高】

作者:u011652573 发表于2014-3-25 16:55:24 原文链接
阅读:44 评论:0 查看评论

[原]素数筛法【Sieve Of Eratosthenes + Sieve Of Euler】的更多相关文章

  1. Sieve of Eratosthenes时间复杂度的感性证明

    上代码. #include<cstdio> #include<cstdlib> #include<cstring> #define reg register con ...

  2. 埃拉托色尼筛法(Sieve of Eratosthenes)求素数。

    埃拉托色尼筛法(Sieve of Eratosthenes)是一种用来求所有小于N的素数的方法.从建立一个整数2~N的表着手,寻找i? 的整数,编程实现此算法,并讨论运算时间. 由于是通过删除来实现, ...

  3. 使用埃拉托色尼筛选法&lpar;the Sieve of Eratosthenes&rpar;在一定范围内求素数及反素数&lpar;Emirp&rpar;

    Programming 1.3 In this problem, you'll be asked to find all the prime numbers from 1 to 1000. Prime ...

  4. algorithm&commat; Sieve of Eratosthenes &lpar;素数筛选算法&rpar; &amp&semi; Related Problem &lpar;Return two prime numbers &rpar;

    Sieve of Eratosthenes (素数筛选算法) Given a number n, print all primes smaller than or equal to n. It is ...

  5. 利用OpenMP实现埃拉托斯特尼(Eratosthenes)素数筛法并行化 分类: 算法与数据结构 2015-05-09 12&colon;24 157人阅读 评论&lpar;0&rpar; 收藏

    1.算法简介 1.1筛法起源 筛法是一种简单检定素数的算法.据说是古希腊的埃拉托斯特尼(Eratosthenes,约公元前274-194年)发明的,又称埃拉托斯特尼筛法(sieve of Eratos ...

  6. &OpenCurlyDoubleQuote;计数质数”问题的常规思路和Sieve of Eratosthenes算法分析

    题目描述 题目来源于 LeetCode 204.计数质数,简单来讲就是求"不超过整数 n 的所有素数个数". 常规思路 一般来讲,我们会先写一个判断 a 是否为素数的 isPrim ...

  7. hdu-2136 Largest prime factor---巧用素数筛法

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2136 题目大意: 每个素数在素数表中都有一个序号,设1的序号为0,则2的序号为1,3的序号为2,5的 ...

  8. codeforces-473D Mahmoud and Ehab and another array construction task (素数筛法&plus;贪心)

    题目传送门 题目大意:先提供一个数组,让你造一个数组,这个数组的要求是 1 各元素之间都互质  2  字典序大于等于原数组  3 每一个元素都大于2 思路: 1.两个数互质的意思就是没有公因子.所以每 ...

  9. &lbrack;算法&rsqb;素数筛法&lpar;埃氏筛法&amp&semi;线性筛法&rpar;

    目录 一.素数筛的定义 二.埃氏筛法(Eratosthenes筛法) 三.线性筛法 四.一个性质 一.素数筛的定义 给定一个整数n,求出[1,n]之间的所有质数(素数),这样的问题为素数筛(素数的筛选 ...

随机推荐

  1. linux源码阅读笔记 数组定义

    在阅读linux源码的过程中遇到了下面的略显奇怪的结构体数组定义. static struct hd_struct{ long start_sect; long nr_sects; }hd[10]={ ...

  2. Java拾遗&lpar;一&rpar;&colon;浅析Java子类和父类的实例化顺序 及 陷阱

    本文主要介绍Java里经常使用的子类和父类的变量实例化顺序及陷阱,并结合一个Android实例来探讨此问题.日后编程中应尽量避免此陷阱. 首先看以下一段代码: 定义一个虚类Server.java pa ...

  3. Top 20 JavaScript Projects of 2017

    https://www.youtube.com/watch?v=SUMn8y3pi28 20. AngularJS 1 19. Passport 18. Pug 17. Socket.IO 16. J ...

  4. 20190326-HTML5标签、CSS的引用

    目录 1.HTML5标签 H5前的DIV+CSS布局 H5解决的问题 H5新标签header.footer.nav.aside.article.address.main.figure.figcapti ...

  5. redis状态监控与性能调优

    本文主要介绍及演示一些Redis相关的状态监控和性能调优的命令及使用方法: 1.redis-benchmark redis基准信息,redis服务器性能检测 例如: 检测redis服务器性能,本机63 ...

  6. GameObject&period;Active

    [GameObject.Active] 用于控制一个对象是否激活,一个对象激活当且本身active=true,并且它的父结点也都active.相当API有: 1)GameObject.SetActiv ...

  7. with优化妙用

    --语法: /*with   alias_name1 as    (subquery1),  alias_name2 as    (subQuery2),  ……  alias_nameN as   ...

  8. Socket网络编程实例2

    两个程序通过“网络”交互数据就使用socket,它只负责两件事:建立连接,传递数据. 所有的数据传输接收,必须都使用byte格式 1.简单实例: #客户端 import socket client=s ...

  9. Jetty - Connector源码分析

    1. 描述 基于Jetty-9.4.8.v20171121. Connector接受远程机器的连接和数据,允许应用向远程机器发送数据. 1.2 类图 从类图看出AbstractConnector继承C ...

  10. umask码和文件权限

    umask是chmod配套的,总共为4位(gid/uid,属主,组权,其它用户的权限),不过通常用到的是后3个,例如你用chmod 755 file(此时这文件的权限是属主读(4)+写(2)+执行(1 ...