埃氏晒

埃拉托斯特尼筛法,简称埃氏晒,是一种用来求自然数n以内的全部素数。

他的基本原理是,如果我们要获得小于n的所有素数,那就把不大于根号n的所有素数的倍数剔除。

埃氏晒的原理很容易理解,一个合数,必然可以表示成,一个自然数 i 和一个素数的乘积。因此我们找到一个素数后,把他小于n的倍数全部标记为合数,这就是我们要做的。

void prime(int n) {bool flag[MAX];//0为素数 1为合数memset(flag, 0, sizeof(flag));for (int i = 2; i * i < n; i++) {//i为素数if (flag[i] == false) {for (int j = i * i; j < n; j += i) {//将其倍数标记为合数flag[j] = true;}}}
}

上述代码有几个关键点要注意

1. 外层循环的终止条件是 i * i < n,因为我们是要把不大于根号n的所有素数的倍数剔除。

2. 内层循环,j 可以从 i * i 开始,因为 i * (2 ~ i –1 ),在之前的循环中,已经被筛去。

我们如果观察被筛掉的数据,我们可以发现,一个合数,可能会被筛掉多次,例如,

30 = 2 * 15 = 3 * 10 = 5 * 6,所以30 就至少被2,3,5这三个质数分别筛过了,这个地方就会造成时间的浪费。我们能不能找到一种关系,使得每个合数,只被筛掉一次呢?

线性筛(欧拉筛)

欧拉筛是一种复杂度很低的素数筛选法,原因在于,每一个合数,只被筛选了一次。

void euler_sieve(int n) {//记录当前找到素数的数量int sum = 0;//flag用来记录第i个数字是否为合数  true为合数bool flag[MAX];memset(flag, 0, sizeof(flag));//primes用来记录每一个找到的素数int primes[MAX];memset(primes, 0, sizeof(primes));for (int i = 2; i <= n; i++) {if (!flag[i])primes[sum++] = i;for (int j = 0; i * primes[j] <= n; j++) {flag[i * primes[j]] = true;if (i % primes[j] == 0)break;}}
}

我们要用到的重要的定理:

\[n=Factory_{max} \ast P\]

上式中,n是一个合数,每一个合数都可以唯一的表示成如上的形式。其中

Factory是除了n以外的n的最大因数,而P满足一下两点:

1. P是一个素数

2. P小于等于Factory的所有因数

综上可知,P就是n的最小质因数。

证明如下:

1.假设P为合数,则P = P1 * P2 * ···· * Pn,其中,P1<P2<····<Pn,且Pi都为质数
因此存在一个F = Fatory * P1为n的因数,且F > Fatory,
所以和Factory是n的最大的因数矛盾,故假设不成立
2.假设P大于Factory的某个因数,不妨设P>P1
因为 Factory = P1 * P2 * ···· * Pn
因此 P * P2 * ··· * Pn 必然大于Factory
所以和Factory是n的最大因数矛盾,故假设不成立

上面的定理就是欧拉筛的原理,我们创建一个数组prime[]来存储目前找到的素数,一个数组flag[]用来标记数字是否为合数(合数为1)。我们每次枚举一个数字i(从2开始枚举),如果这个flag[i] == 0,则i为质数,存入prime。然后把由i和目前已找到的素数相乘得到的合数,标记为1(flag[  i * prime[n]] = 1)。

如何保证prime[n]是i * prime[n] 的最小质因数?

由于任一个数字,都可以表示成有限质数的和,所以当 i % prime[n] == 0,时,可以得出,prime[n]是 i 的一个质因数,同时也是i * prime[n]的质因数,而prime[]数组中的素数,是我们从小到大得出的,此时prime[n]是 i * prime[n]的最小质因数(这部分不容易理解),因此,prime[n+1] 等等都必定不是i * prime[n + 1]的最小质因数。

简单举个例子:

i =  77 =  7 * 11,此时prime[]中已经储存了 3 5 7 9 …等素数

1. prime[1] = 3 ,3满足 i * 3的最小质因数的条件

2.prime[2] = 5,5满足i * 5的最小质因数条件

3.prime[3] = 7,7满足 i * 7的最小质因数条件,但此时  i % 7 == 0,因为 i 的一个质因数也是7

4.prime[4] = 11,此时就不满足 是最小质因数的条件了,i 中有比11更小的因数,因此 i * 11 中也有比11更小的因数。

欧拉筛解释思路借鉴 链接

转载于:https://www.cnblogs.com/woxiaosade/p/10638818.html

埃氏筛 线性筛(欧拉筛) 算法解析相关推荐

  1. 【素数问题】整理几种计算素数的算法,包含:两层循环,开根号法,埃氏筛选法,欧拉筛选法

    这篇文章主要介绍素数相关的算法问题,包含:两层循环判断,开根号法,埃氏筛选法,欧拉筛选法. 目录 一.什么是素数 二.素数计算几种方式 2.1.两层循环

  2. 线性筛素数(欧拉筛)

    欧拉筛是O(n)复杂度的筛素数算法,1秒内埃筛能处理1e6的数据,而1e7的数据就必须用欧拉筛了. 埃筛的基本思想是:素数的倍数一定是合数. 欧拉筛基本思想是:任何数与素数的乘积一定是合数 算法概述: ...

  3. AcWing 868. 筛质数(欧拉筛模板)

    题目连接 https://www.acwing.com/problem/content/870/ 思路 欧拉筛模板,学习链接:https://acmer.blog.csdn.net/article/d ...

  4. 线性筛法 欧拉筛c语言,[洛谷P3383][模板]线性筛素数-欧拉筛法

    Hibernate Hql 总结 1.from子句 Hibernate中最简单的查询语句的形式如下: from eg.Cat该子句简单的返回eg.Cat类的所有实例. 通常我们不需要使用类的全限定名, ...

  5. 素数筛法详解:埃氏筛和欧拉筛

    文章目录 摘要 埃式筛 欧拉筛 超级详细的基础算法和数据结构合集: https://blog.csdn.net/GD_ONE/article/details/104061907 摘要 本文主要介绍埃氏 ...

  6. 牛客 华华给月月出题 (积性函数+欧拉筛+快速幂)

    题目描述 华华刚刚帮月月完成了作业.为了展示自己的学习水平之高超,华华还给月月出了一道类似的题: ⊕符号表示异或和,详见样例解释. 虽然月月写了个程序暴力的算出了答案,但是为了确保自己的答案没有错,希 ...

  7. 线性筛法求素数c语言,[算法]素数筛法(埃氏筛法线性筛法)

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

  8. 素数的线性筛法java,埃氏筛 线性筛(欧拉筛) 算法解析

    埃氏晒 埃拉托斯特尼筛法,简称埃氏晒,是一种用来求自然数n以内的全部素数. 他的基本原理是,如果我们要获得小于n的所有素数,那就把不大于根号n的所有素数的倍数剔除. 埃氏晒的原理很容易理解,一个合数, ...

  9. 埃氏筛与欧拉筛(线性筛)

    目录 一.前言 二.埃氏筛与欧拉筛(线性筛) 1.问题描述 2.基本思路 (1)埃氏筛法 (2)欧拉筛法 三.题例 1.上链接 2.简单思路 3.代码 (1)埃氏筛python版 (2)欧拉筛pyth ...

最新文章

  1. zzuliOJ 2536: 绿绿学姐与AI 1
  2. Android使用NDK---函数参数传递-基本类型和数组
  3. P2167 [SDOI2009]Bill的挑战
  4. 201771010118马昕璐
  5. matlab 数值解 期权顶级啊,潮盈期权院高胜率交易技巧系列之二----期权交易策略及基于MATLAB统计套利介绍...
  6. html5和css3书籍推荐,HTML5与CSS3权威指南
  7. Bailian4120 硬币【0-1背包】
  8. 原生html如何发送网络请求,原生JS向服务器发送GET请求
  9. 洛谷P3216 [HNOI2011]数学作业
  10. 19.TCP/IP 详解卷1 --- TCP 的交互数据流
  11. JS正则表达式详解[转]
  12. sqlserver中获取一张表中列的数据
  13. OpenCL编程入门(一)
  14. 计算机毕业设计、实战项目之 [含论文+答辩PPT+任务书+中期检查表+源码等]基于S2SH的医院在线挂号[包运行成功]
  15. win10怎样修改密码及忘记密码了怎么办
  16. 爱快软路由在VMware上安装过程分享,基于多网卡的本机+带多机上网,考研计算机网络实战
  17. 白细胞直方图C语言,白细胞三分群及其直方图
  18. facebook第三方登陆
  19. 武汉理工大学计算机辅助项目管理简答题,武汉理工大学软件项目管理实验报告...
  20. Vue FSC在线编译代码实时预览@vue/repl

热门文章

  1. Java 面向对象编程的三大特性——封装、继承、多态
  2. Vue.js-资料-组件化思想 —上
  3. ueditor chrome bug
  4. 图像编码中的小白问题sps ,pps ,nalu ,frame ,silce ect....
  5. linux修改resolv自动清除,centos 6.2的/etc/resolv.conf自动清空问题
  6. android删除wifi配置,[RK3288][Android6.0] WiFi之无线网络配置的忘记(移除)过程
  7. linux rac 查询ip,你知道RAC怎么增加管理IP地址吗?
  8. (13)ZYNQ AXI总线应用范围(学无止境)
  9. 基于ZYNQ FPGA实现图像采集存储显示
  10. (68)FPGA面试题-使用不同的代码实现2:1 MUX ?使用assign语句