一、素数筛的定义

给定一个整数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. Data-independent acquisition mass spectrometry in metaproteomics of gut microbiota - implementation and computational analysis DIA技术在肠道宏蛋白质组研究中的方法实现和数据分析 (解读人:闫克强)

    文献名:Data-independent acquisition mass spectrometry in metaproteomics of gut microbiota - implementat ...

  2. CSS实现垂直居中布局

    垂直居中 每日更新前端基础,如果觉得不错,点个star吧

  3. Shiro RememberMe 1.2.4 反序列化命令执行漏洞复现

    影响版本 Apache Shiro <= 1.2.4 产生原因 shiro默认使用了CookieRememberMeManager,其处理cookie的流程是:得到rememberMe的cook ...

  4. rbac权限(2)

    models.py from django.db import models class User(models.Model): name=models.CharField(max_length=32 ...

  5. CompletableFuture异步编排

    什么是CompletableFuture CompletableFuture是JDK8提供的Future增强类.CompletableFuture异步任务执行线程池,默认是把异步任务都放在ForkJo ...

  6. MFC之创建多级动态菜单

    一开始以我是这样做的,结果是错误的: 这段代码第一次点击时,会在第6个位置创建MFC菜单,我本以为再次点击,menu->GetSubMenu(5)返回的值就不会为空了,但事实是它返回了NULL, ...

  7. 在Centos7下搭建大数据环境,即Zookeeper+Hadoop+HBase

    1. 所需软件下载链接(建议直接复制链接到迅雷下载更快): ①hadoop-2.7.6.tar.gz: wget http://mirrors.tuna.tsinghua.edu.cn/apache/ ...

  8. CSS3新增的选择器

    1. 层次选择器 子元素选择器: 只选择子元素    父选择器 > 子选择器 后面紧相邻的兄弟元素:  选择器1 + 选择器2 后面所有的兄弟元素:   选择器1 ~ 选择器2 2.属性选择器  ...

  9. CentOS下的Docker离线安装

    Linux下离线安装Docker 一.基础环境 1.操作系统:CentOS 7.3 2.Docker版本:18.06.1 官方下载地址(打不开可能很慢) 3.百度云Docker 18.06.1地址:h ...

  10. Pytest系列(9) - 参数化@pytest.mark.parametrize

    如果你还想从头学起Pytest,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1690628.html 前言 pytest允许在多个级别启 ...