介绍几种常见的质数筛选法
质数筛选法
- 1.暴力筛选法 :smirk:
- 2.普通优化 :rofl:
- 3.埃氏筛法:cold_sweat:
- 4.线性筛选法:scream:
质数
:除了1和他本身没有其它因数的正整数就是质数。1不是质数,2是质数。
1.暴力筛选法 😏
- 原理
求x
的质数,令y从2到 x \sqrt[]{x} x(向下取整,比如2.4=2)依次尝试 ,如果x%y=0,那么x不是质数。(2要单独讨论,否则按照这个逻辑2不是质数)。- 为什么取 x \sqrt[]{x} x?
答
:如果取到 x \sqrt[]{x} x还没有找到x的约数,那么就可以断定x一定是质数!!。 x \sqrt[]{x} x* x \sqrt[]{x} x=x,这是一个特殊的位置。可以将这个等式抽象为a * b=x。a和b的关系是你消我涨,即a= x b {x \over b} bx。 x \sqrt[]{x} x是a=b的特殊情况,如果a小于等于 x \sqrt[]{x} x的数里没有x的约数,那么当a大于 x \sqrt[]{x} x的时候一样没有,因为a小于等于 x \sqrt[]{x} x的时候,b是大于等于 x \sqrt[]{x} x的。排除a不是x的约数的同时将b也排除了,因为约数是成对出现的。所以当a大于 x \sqrt[]{x} x的时候实际上在做重复的计算,相当于把a,b交换了一个位置,实际上当a取值小于等于 x \sqrt[]{x} x的时候已经把所有可能的约数排除了。 - 为什么 x \sqrt[]{x} x要向下取整而不是向上取整?
答
:第一个问题解释了,约数是成对出现的,只需要枚举a从2到 x \sqrt[]{x} x即可,那么b= x a {x \over a} ax同时被考虑到了。如果 x \sqrt[]{x} x不是整数,那么就向下取整,去掉小数部分,这样可以保证a的枚举没有遗漏(a小于等于 x \sqrt[]{x} x)。如果向上取整,那么a的取值大于 x \sqrt[]{x} x,b小于 x \sqrt[]{x} x。这个组合实际上之前可能已经被排除了,所以重复计算了一对约数。可能会遗漏约数导致判断错误。 - 为什么2要单独考虑?
答
:代码的逻辑是:从2到 x \sqrt[]{x} x依次找x的约数,但是2本身可以被2整除,这样就会误判2有约数,所以2要特判一下。
- 为什么取 x \sqrt[]{x} x?
- 代码
#include<iostream>
#include<cmath>
using namespace std;bool violence(int n) //violence 暴力
{if (n == 1)return false;if (n == 2)return true;for (int i = 2; i <= sqrt(n); i++) //sqrt函数向下取整的{if (n % i == 0)return false; //可以被i整除,不是质数}return true;
}int main()
{for (int i = 1; i <= 100; i++) // 找到1-100内的质数{if (violence(i))cout << i << " ";}return 0;
}
- 运行结果
2.普通优化 🤣
- 优化原理
- 先贴上代码好理解,否则讲半天不知道在说什么。(看完回到这里😊😊)
- 如果看懂了跳过,否则看下一行
- 唯一的难点🙁:为什么当 st[i] == false,则 i 一定是质数呢?
答
:当遍历到 i 的时候,2~i-1的所有倍数都被标记成合数了,如果此时i没有被标记,说明i一定是质数。因为i的约数一定是在[2,i-1]的区间内的,而这个区间的所有数的倍数都不能构成i,说明这些数都不是i的约数,那么i就是质数。
int primes[N], cnt; // primes[]存储所有质数,cnt记录质数的下标
bool st[N]; // st[i]==true表示i不是质数void get_prime(int n) //挑选2到n中所有的质数
{for(int i = 2; i <= n; i ++){if(!st[i]) //当前的数是i,如果st[i]==false,那么说明i这个数一定是质数(理解不了先不解释,看后面的代码)primes[cnt ++] = i; //存储当前的质数for(int j = i + i; j <= n; j += i) //将i的所有倍数都标记为true,因为i的倍数一定不是质数。st[j] = true; }
}
3.埃氏筛法😰
-
数的公理( 两种形式)
( 1 ) 任意一个正整数(大于等于 2 ) = x 1 k 1 ∗ x 2 k 2 ∗ . . . . ∗ x n k n (1)任意一个正整数(大于等于2)=x_1^{k_1}*x_2^{k_2}*....*x_n^{k_n} (1)任意一个正整数(大于等于2)=x1k1∗x2k2∗....∗xnkn
( 2 ) 任意一个正整数(大于等于 2 ) = x 1 k 1 ∗ ( x 2 k 2 ∗ . . . . ∗ x n k n ) (2)任意一个正整数(大于等于2)=x_1^{k_1}*(x_2^{k_2}*....*x_n^{k_n}) (2)任意一个正整数(大于等于2)=x1k1∗(x2k2∗....∗xnkn)
其中 x n x_n xn都是质因数, k n k_n kn是大于等于0的正整数- 用人话说就是一个数分解开来,一定是若干个质数相乘,这些分开的数一定是质数😡,如果发现分解的数有合数,那么就没有分解彻底,再把合数分解成质数😡
-
优化原理
普通优化是将 i 之前的所有数的倍数都标记,以此判断i是不是合数。但是数的公理第2个形式说明了,一个数必然是由若干个质数的乘积构成的,那么就不需要取将i之前所有数的倍数标记,只需要将i之前的所有质数的乘积标记就可以了。
int primes[N], cnt; // primes[]存储所有质数,cnt记录质数的下标
bool st[N]; // st[i]==true表示i不是质数void get_primes(int n)//挑选2到n中所有的质数
{for (int i = 2; i <= n; i ++ ){if (st[i]) //如果st[i]==true,说明i不是质数continue; primes[cnt ++ ] = i;for (int j = i + i; j <= n; j += i) //只要把质数的倍数筛选掉就可以了。st[j] = true;}
}
4.线性筛选法😱
-
前集回顾
埃式筛选法有一个很明显的缺陷,即筛选(标记)合数的时候有大量重复的步骤。比如:
当 i = 3的时候,将6,9,,,51,,都标记了。当 i = 17 的时候,会标记,34,51,,,发现有重复的项51。 -
目的和公理
- 目的
让每个合数只会被筛选一次。 - 数学公理
每个数都有一个最小质因数,比如2的最小质因数是2,4的最小质因数是2,5的最小质因数是5,6的最小质因数是2,7的是7,8的是2,9的是3,10的是2,11的是11,12的是2…
- 目的
-
原理
任何数只有一个最小质因数,只要保证每个合数都是最小质因数筛选的,就可以保证不会重复筛选。(有点难以理解)
int primes[N], cnt; // primes[]存储所有质数,cnt记录质数的下标
bool st[N]; // st[i]==true表示i不是质数void get_primes(int n)
{for (int i = 2; i <= n; i ++ ){if (!st[i]) primes[cnt ++ ] = i; //合理性证明最底下for (int j = 0; primes[j] <= n/i; j ++ ){st[primes[j] * i] = true; //筛选的合数primes[j] * i的最小质因数一定是primes[j],就用primes[j]去筛选它if (i % primes[j] == 0) //为了避免重复筛选合数。//如果i % primes[j] == 0,则primes[j]是i的最小质因数,同时说明primes[j]是i*primes[j]的最小质因数(因为primes[j]是递增的),//如果继续循环,下一步就是st[primes[j+1]*i]=true,因为primes[j+1]>primes[j],primes[j+1]<=i,所以primes[j+1]*i的最小质因数仍然是primes[j],//但是根据原理,一个数需要被他的最小质因数筛选才不会重复,这里却用primes[j+1]筛选了primes[j+1]*i。重复筛选了。break;}}
}
i | 筛掉的数 |
---|---|
2 | 4 |
3 | 6,9 |
4 | 8 |
5 | 10,15,25 |
6 | 12 |
7 | 14,21,35,49 |
8 | 16 |
9 | 19,27 |
10 | 20 |
11 | 22,33,55,77,121 |
Question区:
1.为什么st[i]=false可以表示是质数(明明下面的for循环和埃式筛选法不一样)
答
:i= x 1 x_1 x1* x 2 x_2 x2, x 1 x_1 x1表示x的最小质因数, x 1 x_1 x1是[2,i-1]里面的一个质数, x 2 x_2 x2可以是质数也可以是合数。(1) x 2 x_2 x2是质数:我们从代码可以归纳出,当k(2~i-1)是质数的时候,它会筛掉所有的k * primes[j](j从0到cnt-1), 所以i会被[2,i-1]内的某一个质数筛掉。(2) x 2 x_2 x2是合数:我们从代码归纳出,当k是合数的时候,会筛选出[2,k的最小质因子] * primes[j], 而 x 1 x_1 x1是最小质因数,那么一定有一个k会筛选出 x 2 x_2 x2.
2.为什么要if (i % primes[j] == 0)break;
答
:按照原理来的,每个数都要由他的最小质因数来更新,如果说这一步不退出而是继续循环,那么下一步i * primes[j+1]将被筛选掉,但是i * primes[j+1]的最小质因数是primes[j](因为i不变,上一步i%primes[j]==0且primes[j+1]>primes[j]),而现在i * primes[j+1]由primes[j+1]来筛选了,这样导致筛选过程提前了,后面又会筛选导致重复(当i变大的时候会再次筛选一次)。
线性筛选法还是很难理解的。本质在于:每个数只被筛选一次,且是被去最小质因数筛选的。
相关文章:
介绍几种常见的质数筛选法
质数筛选法 1.暴力筛选法 :smirk:2.普通优化 :rofl:3.埃氏筛法:cold_sweat:4.线性筛选法:scream: 质数:除了1和他本身没有其它因数的正整数就是质数。1不是质数,2是质数。 1.暴力筛选法 😏 原理 求x的质数,令y从2到 x \sqrt[]{x…...
Qt/QML编程学习之心得:Linux下读写GPIO(23)
在linux嵌入式系统中,经常需要一些底层操作,Linux就如window一样,也对底层BSP进行了封装,对device driver进行了封装,使用的话基本就是文件读写的方式来读取,所以也大大简化了上层应用对底层硬件的访问难度。 比如要对GPIO口进行访问,在Qt中有几种方法: 使用命令行方…...
Unity中URP下深度图的线性转化
文章目录 前言一、_ZBufferParams参数有两组值二、LinearEyeDepth1、使用2、Unity源码推导:3、使用矩阵推导: 三、Linear01Depth1、使用2、Unity源码推导3、数学推导: 前言 在之前的文章中,我们实现了对深度图的使用。因为&#…...
Low Poly Cartoon House Interiors
400个独特的低多边形预制件的集合,可以轻松创建高质量的室内场景。所有模型都已准备好放入场景中,并使用一个纹理创建,以提高性能!包含演示场景! 模型分类: - 墙壁(79件) - 地板(28块) - 浴室(33个) - 厨房(36件) - 厨房道具(68件) - 房间道具(85件) - 灯具(…...
[算法与数据结构][c++]:左值、右值、左值引用、右值引用和std::move()
左值、右值、左值引用、右值引用和std::move 1. 什么是左值、右值2. 什么是左值引用、右值引用3. **右值引用和std::move的应用场景**3.1 实现移动语义3.2 **实例:vector::push_back使用std::move提高性能** **4. 完美转发 std::forward**5. Reference 写在前面&…...
【QT】day3
1.登陆界面 2.登陆失败 3.登陆成功弹窗 4.点击OK后跳转 #include "mainwindow.h" #include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupUi(this); }MainWindow::~MainWindow…...
c++ fork, execl 参数 logcat | grep
Linux进程编程(PS: exec族函数、system、popen函数)_linux popen函数会新建进程吗-CSDN博客 execvp函数详解_如何在C / C 中使用execvp()函数-CSDN博客 C语言的多进程fork()、函数exec*()、system()与popen()函数_c语言 多进程-CSDN博客 Linux---fork…...
QT:单例
单例的定义 官方定义:单例是指确保一个类在任何情况下都绝对只有一个实例,并提供一个全局访问点。 单例的写法 抓住3点: 构造函数私有化(确保只有一个实例)提供一个可以获取构造实例的接口(提供唯一的实…...
IPv6路由协议---IPv6动态路由(OSPFv3-4)
OSPFv3的链路状态通告LSA类型 链路状态通告是OSPFv3进行路由计算的关键依据,链路状态通告包含链路状态类型、链路状态ID、通告路由器三元组唯一地标识了一个LSA。 OSPFv3的LSA头仍然保持20字节,但是内容变化了。在LSA头中,OSPFv2的LS age、Advertising Router、LS Sequence…...
移动通信原理与关键技术学习(4)
1.小尺度衰落 Small-Scale Fading 由于收到的信号是由通过不同的多径到达的信号的总和,接收信号的增强有一定的减小。 小尺度衰落的特点: 信号强度在很小的传播距离或时间间隔内的快速变化;不同多径信号多普勒频移引起的随机调频ÿ…...
第二百五十八回
文章目录 1. 概念介绍2. 思路与方法2.1 实现思路2.2 实现方法 3. 示例代码4. 内容总结 我们在上一章回中介绍了"模拟对话窗口的页面"相关的内容,本章回中将介绍如何创建一个可以输入内容的对话框.闲话休提,让我们一起Talk Flutter吧。 1. 概念…...
freesurfer-reconall后批量提取TIV(颅内总体积)
#提取TIV #singleline=$(grep Estimated Total Intracranial Volume /usr/local/freesurfer/subjects/bect-3d+bold-wangjingchen-4.9y-2/stats/aseg.sta...
【GO】如何用 Golang 的 os/exec 执行 pipe 替换文件
背景 主要记录一下怎么用 Golang 的 os/exec 去执行一个 cmd 的 pipeline,就是拿 cmdA 的输出作为 cmdB 的输入,这里记录了两种方法去替换文件里面的字符串。 pipe 那个逻辑在 demo1 里。 另外一种是直接读文件做替换,一不小心两个都放进来了…...
基于Spring-boot-websocket的聊天应用开发总结
目录 1.概述 1.1 Websocket 1.2 STOMP 1.3 源码 2.Springboot集成WS 2.1 添加依赖 2.2 ws配置 2.2.1 WebSocketMessageBrokerConfigurer 2.2.2 ChatController 2.2.3 ChatInRoomController 2.2.4 ChatToUserController 2.3 前端聊天配置 2.3.1 index.html和main.j…...
2023年度总结 - 职业生涯第一个十年
2023年只剩下最后一周,又到了一年一度该做年末总结的时候了。 回想起去年,还有人专门建立了一个关于年度总结文章汇总的仓库。读了很多篇别人写的,给了我很多的触动和感想。这里的每篇文章都是关于某个人这一整年的生活和工作的轨迹啊。即使你…...
setup 语法糖
只有vue3.2以上版本可以使用 优点: 更少的样板内容,更简洁的代码 能够使用纯 Typescript 声明props 和抛出事件 更好的运行时性能 更好的IDE类型推断性能 在sciprt标识上加上setup 顶层绑定都可以使用 不需要return ,可以直接使用 使用组件…...
Javaweb之Mybatis的基础操作的详细解析
1. Mybatis基础操作 学习完mybatis入门后,我们继续学习mybatis基础操作。 1.1 需求 需求说明 通过分析以上的页面原型和需求,我们确定了功能列表: 查询 根据主键ID查询 条件查询 新增 更新 删除 根据主键ID删除 根据主键ID批量删除 …...
知名开发者社区Stack Overflow发布《2023 年开发者调查报告》
Stack Overflow成立于2008年,最知名的是它的公共问答平台,每月有超过 1 亿人访问该平台来提问、学习和分享技术知识。是世界上最受欢迎的开发者社区之一。每年都会发布一份关于开发者的调查报告,来了解不断变化的开发人员现状、正在兴起或衰落…...
vue element plus Form 表单
表单包含 输入框, 单选框, 下拉选择, 多选框 等用户输入的组件。 使用表单,您可以收集、验证和提交数据。 TIP Form 组件已经从 2. x 的 Float 布局升级为 Flex 布局。 典型表单# 最基础的表单包括各种输入表单项,比如input、select、radio、checkbo…...
zmq_connect和zmq_poll
文章内容: 介绍函数zmq_connect和zmq_poll的使用 zmq_connect zmq_connect函数是ZeroMQ库中的一个函数,用于在C语言中创建一个与指定地址的ZeroMQ套接字的连接。该函数的原型如下: int zmq_connect(void *socket, const char *endpoint);其…...
TinyLog iOS v3.0接入文档
1.背景 为在线教育部提供高效、安全、易用的日志组件。 2.功能介绍 2.1 日志格式化 目前输出的日志格式如下: 日志级别/[YYYY-MM-DD HH:MM:SS MS] TinyLog-Tag: |线程| 代码文件名:行数|函数名|日志输出内容触发flush到文件的时机: 每15分钟定时触发…...
react-native 配置@符号绝对路径配置和绝对路径没有提示的问题
这里需要用到vscode的包 yarn add babel-plugin-module-resolver 找到根目录里的babel.config.js 在页面添加plugins配置 直接替换 module.exports {presets: [module:metro-react-native-babel-preset],plugins: [[module-resolver,{root: [./src],alias: {/utils: ./src/…...
element的Table表格组件树形数据与懒加载简单使用
目录 1. 代码实现2. 效果图3. 解决新增、删除、修改之后树节点不刷新问题。([参考文章](https://blog.csdn.net/weixin_41549971/article/details/135504471)) 1. 代码实现 <template><div><!-- lazy 是否懒加载子节点数据 --><!-…...
游戏、设计选什么内存条?光威龙武系列DDR5量大管饱
如果你是一位PC玩家或者创作者,日常工作娱乐中,确实少不了大容量高频内存的支持,这样可以获得更高的工作效率,光威龙武系列DDR5内存条无疑是理想之选。它可以为计算机提供强劲的性能表现和稳定的运行体验,让我们畅玩游…...
linux磁盘清理_docker/overlay2爆满
问题:无意间发现linux服务器登陆有问题,使用df命令发现目录满了。 1. 确定哪里占用了大量内存。 cd / du -sh * | sort -rh经过一段时间后,显示如下: // 474G home // 230G var // 40G usr // 10G snap // --- 根据实际情…...
Redis过期清理策略和内存淘汰机制
目录 Redis过期清理策略Redis内存淘汰机制 Redis过期清理策略 Redis 通过设置键的过期时间来实现自动删除过期键。当键的过期时间到达时,Redis 会自动将该键删除。Redis 过期清理策略主要有以下两种: 惰性删除:Redis 在获取键时会检查键是否…...
2_并发编程同步锁(synchronized)
并发编程带来的安全性同步锁(synchronized) 1.他的背景 当多个线程同时访问,公共共享资源的时候,这时候就会出现线程安全,代码如: public class AtomicDemo {int i0;//排他锁、互斥锁public void incr(){ //synchronizedi; …...
Python 常用模块pickle
Python 常用模块pickle pickle序列化模块 【一】定义 序列化:将数据结构或对象转换为可存储或传输的格式反序列化:将序列化后的数据恢复为开始的数据结构或者对象 【二】目的 数据持久化存储远程通信缓存进程间通信 【三】序列化 将对象转换为字节…...
CentOS 6 制作openssh 9.6 p1 rpm包(含ssh-copy-id、openssl) —— 筑梦之路
openssh 9.6 需要openssl 1.1.1 以上版本,因此需要先安装openssl 1.1.1,可阅读这篇升级更新openssl版本到1.1.1w CentOS 6 制作openssl 1.1.1w rpm包 —— 筑梦之路-CSDN博客 CentOS 6很久都停止更新和支持,关于此版本的写的不多ÿ…...
Tomcat Notes: Deployment File
This is a personal study notes of Apache Tomcat. Below are main reference material. - YouTube Apache Tomcat Full Tutorial,owed by Alpha Brains Courses. https://www.youtube.com/watch?vrElJIPRw5iM&t801s 1、Tomcat deployment1.1、Two modes of …...
佛山专业做网站公司有哪些/百度客服24小时电话人工服务
Problem Description 给出组合数C(n,m), 表示从n个元素中选出m个元素的方案数。例如C(5,2) 10, C(4,2) 6.可是当n,m比较大的时候,C(n,m)很大!于是xiaobo希望你输出 C(n,m) mod p的值!思路:水题,练一下l&a…...
网站报错401/日本预测比分
最近无埋点技术很是流行,抽空研究了下诸葛IO,talkingData以及百分点这些业内知名公司的无埋点SDK,抽取其中重要的信息供大家参考: 1、首先什么是无埋点呢,其实所谓无埋点就是开发者无需再对追踪点进行埋码,…...
微信机器人 wordpress/山东建站
Java数据类型教程 - Java数字数据类型字节,短整数,整数,长整数,浮点数和双精度类是数字包装类。它们都继承自抽象的Number类。我们不能创建Number类的对象。然而,er可以声明Number类的引用变量。我们可以将六个数值包装…...
做网站平台成本/青岛网站建设运营推广
在testerhome上看到一篇描述R语言的文件,很帅气,决定学一学。 1.下载安装 下载地址 2.主界面 甚是激动,开始搞起!!!! 3.数据 就以公司图书室的图书目录来作为数据 4.开始 先将excel文档转化为c…...
北镇网站建设/网络营销理论基础
1. 数学概念的提出 首先使用“函数”一词的是莱布尼兹(Leibnitz,1646年7月1日-1716年11月14日)自 17 世纪起近代数学产生以来,函数的概念一直处于数学思想的真正核心位置。2. 数学流派 彼得堡学派: 彼得堡&…...
做网站代理商好赚吗?/seo公司外包
安装防火墙组件:sudo apt-get install ufw -y;开启防火墙:sudo ufw enable;开启拒绝访问:sudo ufw default deny;查看状态:ufw status;常用端口配置案例如下:sudo ufw allow 80/tcp;sudo ufw allow 25/tcp;sudo ufw al…...