ACM数论专题3——素数(质数)
ACM数论专题3——素数
- 素数是什么
- 蛮力算法求素数
- 蛮力算法的实现以及分析
- 时间复杂度
- 蛮力算法的改进
- 时间复杂度
- **埃筛**
- 时间复杂度
- 线筛
- 线筛原理分析
- 线筛实现
素数是什么
质数1 (prime number)又称素数,有无限个。
质数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数。
所以最小的素数是2哦~依次是2,3,5,7,11,13,17,19…
蛮力算法求素数
蛮力算法的实现以及分析
很容易能够想到就是枚举一下所有大于一但是小于它本身的所有数字,看是否有能够被整除的数字。
bool prime1(int n){//判断x是不是质数。如果是,返回true,否则返回false if(n < 2) return false; for(int i = 2; i < n; i++){if(n % i == 0) return false;}return true;
}
时间复杂度
很容易发现是O(n)
蛮力算法的改进
如果一个数不是质数,那么他一定有除了1和他本身之外的两个因子(除了平方数),而且这两个因子一定有一个在[2,n][2,\sqrt{n}][2,n]之间(因为如果两个因子都大于n\sqrt{n}n的话乘起来一定会大于n)。
所以我们只要在[2,n][2,\sqrt{n}][2,n]之间寻找一个因子就行了,如果找不到的话就能说明没有啦~
bool prime2(int n){//判断x是不是质数。如果是,返回true,否则返回false if(n < 2) return false; for(int i = 2; i <= sqrt(n); i++){if(n % i == 0) return false;}return true;
}
如果觉得sqrt有精度问题的话可以用这种方式
bool prime3(int n){//判断x是不是质数。如果是,返回true,否则返回false if(n < 2) return false; for(int i = 2; i*i <= n; i++){if(n % i == 0) return false;}return true;
}
时间复杂度
很容易发现是O(n)O(\sqrt{n})O(n)
那么如果我们要找到m以内的全部素数,就需要nlognnlognnlogn的时间复杂度。
埃筛
埃拉托斯特尼筛法2,或者叫埃氏筛法,也叫素数筛法。
这个方法利用到的一个定理就是:如果找到一个质数,那么这个质数的倍数都不是质数。
举个例子,我们从一开始的2开始,剔除掉2的倍数,即4,6,8,10,…
接下来是3,3没被剔除,也就是说3不能整除所有小于3的素数,3就是素数。接下来剔除6,9,12,…
接下来是4,4已经是合数了。
5没被剔除,所以剔除5的倍数10,15,…
代码实现如下:
bool prime3(int n){//判断x是不是质数。如果是,返回true,否则返回false if(n < 2) return false; for(int i = 2; i*i <= n; i++){if(n % i == 0) return false;}return true;
}
时间复杂度
这样做很直观,我们做的无用功少了。但是时间复杂度具体的计算就是个问题。显然不是线性的,比如6会被2,3,5都标记一次,具体可以看下图(图源维基百科)
那么也就是说对于每个素数p,都要划掉n/pn/pn/p个数(包括重复划掉的)那么我们一共做了多少次运算呢?
很容易想到是n∗∑p=2isprime(p)andp<n1/pn* \sum_{p = 2}^{isprime(p)andp < n}1/pn∗∑p=2isprime(p)andp<n1/p(小于n的素数的倒数之和)
小于n的素数的倒数之和是用 (1−1p)−1(1-\frac{1}{p})^{-1}(1−p1)−1的连乘积看出来的。这个连乘积的 log “=” 小于 n 的素数的倒数和,而它本身大致是 1+1/2+…+1/n,log(n)log(n)log(n). 所以是 loglognloglog nloglogn.
线筛
线筛原理分析
线筛顾名思义,时间复杂度是线性的,也就是O(n)O(n)O(n)。既然是筛法,就要在埃筛的基础上进行。而埃筛接近线性却没达到线性的原因,就是一个合数会被所有小于它的素数筛一次,而不是只被某一个素数筛一次。
如果我们改进这个算法,让一个数字只被它最小的素因子筛掉就结束,那么每个数字都会被筛一次。虽然可能有一些细节是占用时间的,但是总的来说时间是接近线性的。
既然我们要知道一个数最小的素因子是谁,那么我们就要打表。但是我们可以在筛的过程中打表,因为一个合数的素因子一定是小于它的,而小于它的素数一定是先被处理出来之后的。所以我们不需要另外打表。
线筛实现
const int N = 100000 + 10;
bool prime[N];//prime[i]表示i是不是素数
int p[N],num = 0;//p[N]是素数表,num是素数的个数。这里P[n]其实开大了 我忘记小于n的素数有多少了呜呜呜
void prime4(){for(int i = 2; i < N; i ++) prime[i] = true;//初始化为质数 for(int i = 2; i < N; i++){if(prime[i]) p[tot ++] = i;//把质数存起来 for(int j = 0; j < tot && i * p[j] < N; j++){prime[i * p[j]] = false;if(i % p[j] == 0) break;//保证每个合数被它最小的质因数筛去 }}
}
有问题随时提出~~~~
百度百科-质数 ↩︎
百度百科-埃筛 ↩︎
ACM数论专题3——素数(质数)相关推荐
- 数论专题(一)数论基本概念
努力努力再努力x 努力努力再努力x 博客园 首页 新随笔 联系 订阅 管理 数论专题(一)数论基本概念 转载自:https://blog.csdn.net/whereisherofrom/articl ...
- 数学/数论专题:莫比乌斯函数与欧拉函数
数学/数论专题:莫比乌斯函数与欧拉函数(进阶) 0. 前言 1. 前置知识 2. 正文 3. 总结 4. 参考资料 0. 前言 本篇文章会从狄利克雷卷积的角度,讨论莫比乌斯函数与欧拉函数的相关性质. ...
- codeforces数论专题总结
文章目录 codeforces数论专题总结(1300~1800) 1444A Division (1500) 1462D Add to Neighbour and Remove(1400) 1423K ...
- 自然数 素数 质数_在Java中获取素数的无限列表
自然数 素数 质数 一个常见的问题是确定数字的素因式分解. 蛮力方法是审判部门( 维基百科 , 可汗学院 ),但是如果必须考虑多个数字,这需要大量的浪费工作. 一种广泛使用的解决方案是Eratosth ...
- 代码实现:判断101-200之间有多少个素数(质数),并输出所有素数。 程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。...
package com.heima.Coding;/*判断101-200之间有多少个素数(质数),并输出所有素数.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明 ...
- 数学/数论专题-学习笔记:狄利克雷卷积
数学/数论专题-学习笔记:狄利克雷卷积 1. 前言 2. 一些基础函数 3. 积性函数 4. 狄利克雷卷积 5. 总结 6. 参考资料 1. 前言 狄利克雷卷积,是学习与继续探究 μ\muμ 函数和 ...
- C语言:判断一个数是否为素数/质数
素数/质数的概念:一个的自然数,除了1和它自身外,不能被其他自然数整除的数叫素数,否则成为合数. 0和1既不是素数也不是合数,最小的素数是2. 方法1:从2到n - 1判断有没有能整除n的数.如果有, ...
- 自然数 素数 质数_俄罗斯娃娃素数
自然数 素数 质数 As a child, weren't you in wonder of Russian Dolls, and where you learnt how the dolls fit ...
- 自然数 素数 质数_素数列表–最多20,000个素数的图表
自然数 素数 质数 Here's a list of all 2,667 prime numbers between zero and 20,000. 以下是所有0至20,000之间的2,667个质数 ...
最新文章
- 【图像处理opencv】_图像基础
- 两物体的相对速度公式_最全物理公式合集,高考这一份就够了!
- NOI数学:狄利克雷(Dirichlet)卷积
- 一机双平面、TCP半连接攻击——SYN攻击详解
- transformer模型_【预训练模型】万字长文梳理NLP预训练模型!从transformer到albert...
- centos中创建快捷键pycharm
- SpringBoot+Ajax文件上传+FormData表单提交
- 目前最完整的前端框架 Vue.js 全面介绍
- java开发简单BBS论坛系统(源码)
- Dempster证据理论python复现
- 【托业】【新托业TOEIC新题型真题】学习笔记7-题库二-P1~4
- Matlab 工作区变量和 MAT 文件
- 怎么把视频和图片拼在一起?朋友圈会动的拼图视频,快速制作技巧
- 响应式Web设计在跨终端广告创意中的应用
- Linux系统Centos7的虚拟机安装
- iOS- 网络访问JSON数据类型与XML数据类型的实现思路及它们之间的区别
- Java知识点的总结(一)
- 苹果手机升级13无法开机_苹果手机更新时突然断电,手机无法开机,为什么?...
- 关于7Z自解压文件拆分,读取条目,复写,合并的功能
- 【javascript 】组合式继承
热门文章
- keil如何添加STM32系列
- matlab seed函数_MATLAB中 STATE和SEED | 科研软件小站
- DO、DTO、BO、VO、POJO等各种O浅学(总结)
- TP-wr703N TTL刷机以及刷u-boot/breed教程记录
- 详谈4大主流CPU处理器技术架构
- 自动驾驶系统入门(一) - 环境感知
- java1000到十10以内的加减法,【小学】 生成10以内的加减法
- Lockon Logic#1(lockon 逻辑)
- MapReduce学习之概述和设计构思
- 文件服务器怎么限制速度,文件服务器的速度