素数筛【埃筛,欧拉筛(线性筛)】
素数筛
转载:https://blog.csdn.net/dy416524/article/details/86431057
枚举所有小于数,看是否它能整除其他自然数,但实际上只需要枚举根号次。
bool Is_prime(int n)
{for(int i=1;i*i<=n;++i){if(n%i==0) return false;}return true;
}
•埃氏筛:做法其实很简单,首先将2到n范围内的整数写下来,其中2是最小的素数。将表中所有的2的倍数划去,表中剩下的最小的数字就是3,他不能被更小的数整除,所以3是素数。再将表中所有的3的倍数划去……以此类推,如果表中剩余的最小的数是m,那么m就是素数。然后将表中所有m的倍数划去,像这样反复操作,就能依次枚举n以内的素数,这样的时间复杂度是O(nloglogn)。
•欧拉筛:欧拉筛法的基本思想 :在埃氏筛法的基础上,让每个合数只被它的最小质因子筛选一次,以达到不重复的目的。其他复杂度(O(n)).
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
bool Is_prime(int n)//普通判断素数
{for(int i=1;i*i<=n;++i){if(n%i==0) return false;}return true;
}
#define maxn 10000000
bool vis[maxn];
int prime[maxn],x;
void isprime(int n) //埃氏筛
{for(int i=2;i<=n;i++){if(!vis[i]) prime[x++]=i;for(int j=2;j*i<=n;j++){vis[i*j]=true;}}
}
void oulasai(int n) //欧拉筛
{for(int i=2;i<=n;i++){if(!vis[i]) prime[x++]=i;for(int j=0;j<x;j++){if(i*prime[j]>n) break;vis[i*prime[j]]=true;if(i%prime[j]==0) break;}}
}
int main()
{int n;scanf("%d",&n);oulasai(n);for(int i=0;i<x;i++)printf("%d\n",prime[i]);return 0;
}
欧拉筛的难点就在于对if (i % prime[j] == 0)这步的理解,当i是prime[j]的整数倍时,记 m = i / prime[j],那么 i * prime[j+1] 就可以变为 (m * prime[j+1]) * prime[j],这说明 i * prime[j+1] 是 prime[j] 的整数倍,不需要再进行标记(在之后会被 prime[j] * 某个数 标记),对于 prime[j+2] 及之后的素数同理,直接跳出循环,这样就避免了重复标记。
比如我们求20以内的素数,
2 是 。排除4,2整除2,跳出;
3是。 排除6,3不整除2,继续,排除9,3整除3,跳出。
4不是,但继续执行,排除8,4整除2,跳出。
5是。 排除10,15,25;
6不是。继续执行,排除12,18,30;
可见如果4处不跳出循环,12就会被筛两次。
————————————————
版权声明:本文为CSDN博主「)NCuyALnA$Ke」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/dy416524/article/details/86431057
素数筛【埃筛,欧拉筛(线性筛)】相关推荐
- 中高级数论 [欧拉函数线性筛,二次剩余]
欧拉函数线性筛 对于素数ppp, φ(p∗i)={p−1i=1p∗φ(i)p∣i(p−1)∗φ(i)p∤i\varphi (p*i)= \begin{cases} p-1& i=1\\ p*\ ...
- 筛质数—(朴素筛法、埃氏筛法、欧拉筛法(线性筛法))
筛质数时首先要了解质数的定理:1~n中有 个质数 下面再来看具体算法: 1.朴素筛法: 直接把2~n-1中质数和合数的倍数都筛一遍,其代码如下所示: int primes[N],cnt=0; boo ...
- AcWing 868. 筛质数(欧拉筛模板)
题目连接 https://www.acwing.com/problem/content/870/ 思路 欧拉筛模板,学习链接:https://acmer.blog.csdn.net/article/d ...
- 素数判定(素数筛法)(欧拉)
这里主要说一下 素数筛法,该方法可以快速的选取出1~N数字中的所有素数.时间复杂度 远小于O(N*sqrt(N)) 方法为:从2开始,往后所有素数的倍数都不是素数.最后剩下的数都是素数. 再说说欧拉公 ...
- 素数筛法(传统普通、朴素筛法、埃式筛法、欧拉筛法(线性筛))
素数筛法(普通.朴素筛法.埃式筛法.欧拉筛法) 1.题目 2.分析 3.代码 传统普通 朴素筛法 朴素筛法(6.14) 埃式筛法 埃式筛法(6.14) 欧拉筛法(线性筛) 欧拉筛法(线性筛 6.14) ...
- 线性筛与欧拉函数、莫比乌斯函数
网上关于素数筛的资料很多,这里只是给出弱鸟整理的几个线性筛和应用. 最朴素的素数筛--埃拉托斯特尼筛法(Sieve of Eratosthenes) 复杂度 Olognlogn int primes[ ...
- UVa-10820 Send a Table 欧拉函数
题意 交表 由于f(k∗x,k∗y)f ( k*x , k* y ) 可以由f(x,y)f ( x , y )递推出来 让我们求 在x,y都不大于n的情况下 计算最少需要计算多少不同的项 n<= ...
- 素数的线性筛法java,埃氏筛 线性筛(欧拉筛) 算法解析
埃氏晒 埃拉托斯特尼筛法,简称埃氏晒,是一种用来求自然数n以内的全部素数. 他的基本原理是,如果我们要获得小于n的所有素数,那就把不大于根号n的所有素数的倍数剔除. 埃氏晒的原理很容易理解,一个合数, ...
- 埃氏筛 线性筛(欧拉筛) 算法解析
埃氏晒 埃拉托斯特尼筛法,简称埃氏晒,是一种用来求自然数n以内的全部素数. 他的基本原理是,如果我们要获得小于n的所有素数,那就把不大于根号n的所有素数的倍数剔除. 埃氏晒的原理很容易理解,一个合数, ...
- 筛选质数,埃氏筛和欧拉筛(线性筛)
求len之内的所有的素数 除了比较常用的开根号的求法,还有两种更好的方法,埃氏筛和线性筛.其中埃氏筛更好理解,而线性筛(欧拉筛)不好理解但是更快. 埃氏筛 #include <bits/stdc ...
最新文章
- Kafka事务特性详解
- 从零开始数据科学与机器学习算法-数据预处理与基准模型-01
- kafka _命令行操作
- ie内核浏览器_[正式版下载] 微软全新 Chrome 内核 Edge 浏览器!原生支持 Chrome 插件扩展...
- android popupwindow 调用方法,Android PopUpWindow使用详解
- c语言赋值运算符左边必须是,C语言运算符入门讲解
- commit是直接提交到远程吗 svn_xcode 把项目代码提交到远程SVN服务器
- netty 支持多种通讯协议
- vs2015移植linux编译,windows平台移植(原linux项目)时,用vs2015开发,碰到的问题及处理方案记录...
- C语言博客作业08,C语言I博客作业08
- ListBox横向绑定数据
- Salesforce 主要发展历史
- Struts2通配符映射的各种情况详情
- python樱花树代码_Python绘图案例:2020年新年画一棵樱花树(源代码)
- 介绍java糊涂Hutool工具
- leecode第一百七十四题(地下城游戏)
- 个人中心(修改密码)
- 在爱情里不会委曲求全,活的非常自我,态度十分坚决的三个生肖
- 软件推荐:Typora -新手上路-夏凌玥
- Vue 使用vue-seo-phantomjs 实现SEO抓取优化方案