一、素数筛的定义

给定一个整数n,求出[1,n]之间的所有质数(素数),这样的问题为素数筛(素数的筛选问题)。

二、埃氏筛法(Eratosthenes筛法)

埃氏筛法又叫做Eratosthenes筛法,一般叫做埃氏筛。埃氏筛的思想是:

\(\forall x\in Z\)的倍数\(2x,3x,...\)都不是质数。

因此我们可以从2开始有小到大扫描每个数\(x\),并把\(x\)的倍数\(2x,3x,4x,...\)标记为合数。当这个某个数\(y\)被扫描到的时候,如果\(y\)没有被标记为合数,那么\(y\)就属于质数。

Eratosthenes筛法的复杂度为\(O(NloglogN)\)。效率非常接近线性。

以下为Eratosthenes筛法模板:

inline int Eratosthenes(int n){
for(int i=1;i<=n;i++) is_p[i]=1;
memset(prime,0,sizeof(prime));
is_p[1]=is_p[0]=0;
for(int i=1;i<=n;i++){
if(!is_p[i]) continue;
prime[++tot]=i;//prime[]存储了[1,n]的所有质数
for(int j=i*2;j<=n;j+=i) is_p[j]=0;//j为合数
}
return tot;
}

三、线性筛法

我们知道,一个算法的复杂度组成有一类是因为重复的计算。这就是埃氏筛的问题所在,埃氏筛会重复标记已标记的合数。例如12会被质数2重复标记,同时也会被3标记。如果我们仅能标记一次合数就好了。

线性筛法通过从大到小不断累乘质因子的方法标记合数,即12的标记方式为:\(12=6\times 2=(3\times2)\times2\)。

实现方式为:

1.依次扫描[2,n]的每一个数a

2.若没有被标记为合数,说明a是质数,此时保存起来

3.依次扫描\(a\times prime[x]\leqslant n\)的每一个质数,标记\(a\times prime[x]\)为合数,且保证prime[x]为\(a\times prime[x]\)的最小质因子。

因为每个合数只会被它的最小质因子筛一次,所以线性筛的复杂度为\(O(N)\)。

以下为线性筛法的模板:

int notp[N],prime[N];
inline int get_primes(int n){
int tot=0;
for(int i=2;i<=n;i++){
if(!notp[i]) prime[++tot]=i;
for(int j=1;j<=tot,i*prime[j]<=n;j++){
notp[i*prime[j]]=1;//标记合数,此时prime[j]是合数i*prime[j]的最小素因子
if(i%prime[j]==0) break;
//一个小合数与大质数 可以被 一个大合数与小质数 替代
//3*6=18,同样的,2*9=18。此时我们不如让2*9标记18
}
}
return tot;
}

四、一个性质

  • 任何一个合数n必定包含一个不超过\(\sqrt n\)的质因子。

[算法]素数筛法(埃氏筛法&线性筛法)的更多相关文章

  1. 素数判断-----埃氏筛法&欧拉筛法

    埃氏筛法 /* |埃式筛法| |快速筛选素数| |15-7-26| */ #include <iostream> #include <cstdio> using namespa ...

  2. poj 2689Prime Distance(区间素数)埃氏筛法

    这道题的L和R都很大,所以如果直接开一个1~R的数组明显会超时.但是R-L并不大,所以我们考虑把这个区间(L--R)移动到(1--(R-L+1))这个区间再开数组(就是把每个数减L再加1).接下来先用 ...

  3. GDUFE-OJ 1359校庆素数 埃氏筛法

    Problem Description: 包含33的素数称为校庆素数. 她想知道在L和R之间(包含L和R)有多少个校庆素数. 比如 2333 就是一个校庆素数. Input: 输入的第一行包括一个T( ...

  4. 洛谷P3383 【模板】线性筛素数 (埃拉托斯特尼筛法)

    题目描述 如题,给定一个范围N,你需要处理M个某数字是否为质数的询问(每个数字均在范围1-N内) 输入输出格式 输入格式: 第一行包含两个正整数N.M,分别表示查询的范围和查询的个数. 接下来M行每行 ...

  5. 埃氏筛法求素数&构造素数表求素数

    埃氏筛法求素数和构造素数表求素数是一个道理. 首先,列出从2开始的所有自然数,构造一个序列: 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 1 ...

  6. 埃氏素数筛法(Eratosthenes)

    埃氏筛法: 对于每一个小于n的非负整数p,删去2p,3p,4p......,当处理完所有数后,还没有删除的就是素数. 想法:用a记录素数表,a[i]=1表示不是素数,a[i]=0表示是素数. #inc ...

  7. (第三场) H Diff-prime Pairs 【数论-素数线性筛法+YY】

    题目链接 题目描述 Eddy has solved lots of problem involving calculating the number of coprime pairs within s ...

  8. Codeforces Round #270 A. Design Tutorial: Learn from Math【数论/埃氏筛法】

    time limit per test 1 second memory limit per test 256 megabytes input standard input output standar ...

  9. <转载>一般筛法和快速线性筛法求素数

    素数总是一个比较常涉及到的内容,掌握求素数的方法是一项基本功. 基本原则就是题目如果只需要判断少量数字是否为素数,直接枚举因子2 ..N^(0.5) ,看看能否整除N. 如果需要判断的次数较多,则先用 ...

随机推荐

  1. drf 简介以及部分源码分析

    目录 复习 drf框架 全称:django-rest framework 知识点 接口 restful接口规范 基于restful规范的原生Django接口 主路由:url.py api组件的子路由: ...

  2. excel中存储的icount,赋值完之后

    最近需要实现一个功能,为了确保每次函数运行的时候count是唯一的,所以想读取excel中存储的icount,赋值完之后对其进行+1操作,并存入excel文件,确保下次读取的count是新的,没有出现 ...

  3. OpenCV-Python Canny边缘检测 | 十九

    目标 在本章中,我们将学习 Canny边缘检测的概念 OpenCV函数: cv.Canny() 理论 Canny Edge Detection是一种流行的边缘检测算法.它由John F. Canny发 ...

  4. iOS 图片加载速度优化

    FastImageCache 是 Path 团队开发的一个开源库,用于提升图片的加载和渲染速度,让基于图片的列表滑动起来更顺畅,来看看它是怎么做的. 一.优化点 iOS 从磁盘加载一张图片,使用 UI ...

  5. 《java编程思想》操作符

    1. 自动递增和递减 递增和递减运算是两种相当不错的快捷运算,递减操作符是 "--",意为减少一个单位,递增操作符是 "++",意为增加一个单位.这两个操作符各 ...

  6. spring中BeanPostProcessor之一:InstantiationAwareBeanPostProcessor(01)

    在spring中beanPostProcessor绝对是开天辟地的产物,给了程序员很多自主权,beanPostProcessor即常说的bean后置处理器. 一.概览 先来说下Instantiatio ...

  7. B 外地比赛

    时间限制 : - MS   空间限制 : - KB  评测说明 : 1s,256m 问题描述 何老板带着信竞队的k个同学出去外地打比赛.到达目的地后,何老板就找了一家酒店,准备住下.酒店工作人员告诉何 ...

  8. 使用 Spring data redis 结合 Spring cache 缓存数据配置

    使用 JavaConfig 方式配置 依赖 jar 包: jedis.spring-data-redis 首先需要进行 Redis 相关配置 @Configuration public class R ...

  9. Zabbix监控平台

                                                                     Zabbix监控平台 案例1:常用系统监控命令 案例2:部署Zabbi ...

  10. MTK Android Driver :Battery电池曲线

    MTK Android Driver :battery电池曲线 1.配置文件位置: CUSTOM_KERNEL_BATTERY= battery mediatek\custom\\kernel\bat ...