一定能让你理解的素数筛法——埃氏筛法和欧式筛法

2023-11-09

先上代码

  1. 埃氏筛法
#include<bits/stdc++.h>
using  namespace std;
//时间复杂度(nloglogn)
//适用10^6下
const int MAX = 1000000;
void FindPrime(vector<int>& prime);
int main() {
	vector<int>prime;
	FindPrime(prime);
	for (auto i : prime)
		printf("%d ", i);
	return 0;
}
void FindPrime(vector<int>& prime) {
	array<int, MAX>flag;
	int j = 0;
	fill(flag.begin(), flag.end(), 0);
	for (int i = 2; i < MAX; i++) {
		if (flag[i] == 0) {
			prime.push_back(i);
		}
		for (int k = i + i; k < MAX; k += i) {
			flag[k] = 1;
		}
	}
}
  1. 欧式筛法
#include<bits/stdc++.h>
using  namespace std;
//时间复杂度(n)
//适用低于10^7
const int MAX = 10000000;
void FindPrime(vector<int>& prime);
int main() {
	vector<int>prime;

	FindPrime(prime);
	for (auto i : prime)
		printf("%d ", i);
	return 0;
}
void FindPrime(vector<int>& prime) {
	array<int, MAX>flag;
	fill(flag.begin(), flag.end(), 0);
	for (int i = 2; i < MAX; i++) {
		if (flag[i]==0) {
			prime.push_back(i);
		}
		for (int j = 0; j < prime.size() && i * prime[j] < MAX; j++) {
			flag[i * prime[j]] = 1;
			if (i % prime[j] == 0) {
				break;
			}
		}
	}
}

一些细节: 埃氏和欧式的共同点都是从已知的最小素数 2起手,并将2放入素数数组,然后开始针对2的倍数进行筛选。
其他: 假如是vs编译的话,这么大的数据量需要修改堆栈区的大小,否则一定会抛出异常。
我的修改堆栈区大小为:99999999——》100m

分析

在开始分析之前,请忘了数论的那些术语,质因数等等
知道什么是素数即可
进行手动计算过程
在这里插入图片描述
原因是:2分解成乘法,可有12=2×6;12=3×4
而其中最小的质数组合为2×6
也就是说欧式筛法,每次筛的是最小素数的组合,这样保证了一定不会多筛重复的数

从代码来分析

欧式筛法的脱出条件共有3条

1. j < prime.size() 

内部脱出:遍历整个素数数组,筛掉i与素数的乘法组合

2. i * prime[j] < MAX

外部进入判断:如果第一次筛选已经超过上界,则脱出

3. if (i % prime[j] == 0)

内部脱出:保证了筛掉的为最小素数的乘法组合(专业术语叫质因数)

其中1和3的组合构成素数筛选的核心判断
2其实可有可无,只为了控制边界而已

后记

如果只是想学习算法,不想做科研,大可不必深入去研究数论的那些术语,大部分算法都可通过手工模拟去理解核心原理,再去理解算法。
但是 假如有数论的基础,相对看起代码也会更快,不至于都去手工模拟。
所以如何学习,根据自己的目标量力而行即可。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一定能让你理解的素数筛法——埃氏筛法和欧式筛法 的相关文章

  • GCC C++ (ARM) 和指向结构体字段的 const 指针

    假设有一个简单的测试代码 typedef struct int first int second int third type t define ADDRESS 0x12345678 define REGISTER type t ADDRE
  • 将处理后的图形绘制到另一个图形中

    我想将一个经过处理的图形绘制到另一个图形中 I have two graphics var gHead Graphics FromImage h var gBackground Graphics FromImage b Transform
  • 捕获 foreach 条件中抛出的异常

    我有一个foreach在 foreach 本身的条件下循环期间中断的循环 有没有办法try catch抛出异常然后继续循环的项 这将运行几次 直到异常发生然后结束 try foreach b in bees exception is in
  • 有什么工具可以说明每种方法运行需要多长时间?

    我的程序的某些部分速度很慢 我想知道是否有我可以使用的工具 例如它可以告诉我可以运行 methodA 花了 100ms 等等 或者类似的有用信息 如果您使用的是 Visual Studio Team System 性能工具 中有一个内置分析
  • 为什么 std::allocator 在 C++17 中丢失成员类型/函数?

    一边看着std 分配器 http en cppreference com w cpp memory allocator 我看到成员 value type pointer const pointer reference const refer
  • C++派生模板类继承自模板基类,无法调用基类构造函数[重复]

    这个问题在这里已经有答案了 我试图从基类 模板 继承 派生类也是模板 它们具有相同的类型 T 我收到编译错误 非法成员初始化 Base 不是基类或成员 为什么 如何调用基类构造函数 include
  • 单元测试失败,异常代码为 c0000005

    我正在尝试使用本机单元测试项目在 Visual Studios 2012 中创建单元测试 这是我的测试 TEST METHOD CalculationsRoundTests int result Calculations Round 1 0
  • 为什么 FTPWebRequest 或 WebRequest 通常不接受 /../ 路径?

    我正在尝试从 ftp Web 服务器自动执行一些上传 下载任务 当我通过客户端甚至通过 Firefox 连接到服务器时 为了访问我的目录 我必须指定如下路径 ftp ftpserver com AB00000 incoming files
  • 两组点之间的最佳匹配

    I ve got two lists of points let s call them L1 P1 x1 y1 Pn xn yn and L2 P 1 x 1 y 1 P n x n y n 我的任务是找到它们点之间的最佳匹配 以最小化它
  • C# using 语句、SQL 和 SqlConnection

    使用 using 语句 C SQL 可以吗 private static void CreateCommand string queryString string connectionString using SqlConnection c
  • 在 C 中复制两个相邻字节的最快方法是什么?

    好吧 让我们从最明显的解决方案开始 memcpy Ptr const char a b 2 调用库函数的开销相当大 编译器有时不会优化它 我不会依赖编译器优化 但即使 GCC 很聪明 如果我将程序移植到带有垃圾编译器的更奇特的平台上 我也不
  • 过期时自动重新填充缓存

    我当前缓存方法调用的结果 缓存代码遵循标准模式 如果存在 则使用缓存中的项目 否则计算结果 在返回之前将其缓存以供将来调用 我想保护客户端代码免受缓存未命中的影响 例如 当项目过期时 我正在考虑生成一个线程来等待缓存对象的生命周期 然后运行
  • 32位PPC rlwinm指令

    我在理解上有点困难rlwinmPPC 汇编指令 旋转左字立即然后与掩码 我正在尝试反转函数的这一部分 rlwinm r3 r3 0 28 28 我已经知道什么了r3 is r3在本例中是一个 4 字节整数 但我不确定这条指令到底是什么rlw
  • gdb查找行号的内存地址

    假设我已将 gdb 附加到一个进程 并且在其内存布局中有一个文件和行号 我想要其内存地址 如何获取文件x中第n行的内存地址 这是在 Linux x86 上 gdb info line test c 56 Line 56 of test c
  • 内核开发和 C++ [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 从我know https stackoverflow com questions 580292 what languages are windo
  • 为什么我使用google'smtp'无法发送电子邮件?

    我有以下程序使用 smtp gmail com 587 发送电子邮件 namespace TestMailServer class Program static void Main string args MailMessage mail
  • 过度使用委托对性能来说是一个坏主意吗? [复制]

    这个问题在这里已经有答案了 考虑以下代码 if IsDebuggingEnabled instance Log GetDetailedDebugInfo GetDetailedDebugInfo 可能是一个昂贵的方法 因此我们只想在调试模式
  • 如何查明CONFIG_FANOTIFY_ACCESS_PERMISSIONS是否启用?

    我想利用fanotify 7 http man7 org linux man pages man7 fanotify 7 html我遇到的问题是在某些内核上CONFIG FANOTIFY ACCESS PERMISSIONS不起作用 虽然C
  • 热重载时调用方法

    我正在使用 Visual Studio 2022 和 C 制作游戏 我想知道当您热重新加载应用程序 当它正在运行时 时是否可以触发一些代码 我基本上有 2 个名为 UnloadLevel 和 LoadLevel 的方法 我想在热重载时执行它
  • boost::program_options:带有固定和可变标记的参数?

    是否可以在 boost program options 中使用此类参数 program p1 123 p2 234 p3 345 p12 678 即 是否可以使用第一个标记指定参数名称 例如 p 后跟一个数字 是动态的吗 我想避免这种情况

随机推荐

  • DeepWalk+word2vec的百科词条图嵌入可视化实战分析

    视频讲解 DeepWalk word2vec的百科词条图嵌入可视化实战分析 哔哩哔哩 bilibili 结果演示 完整代码数据 import networkx as nx 图数据挖掘 import gensim from gensim mo
  • 如何正确打开华为手机的 USB 调试和 完整 log 功能?

    华为手机 荣耀6 不能开启USB调试 借了一台华为荣耀手机 估计被重置过系统 电脑都连接不上 在关于里面开启开发者模式 并开启 USB 调试模式 但是刚打开 再次进来就变成不可选择的状态 并且不能调试 需要如下操作才能正常使用 USB 调试
  • 关于梯度下降的学习笔记

    什么是梯度下降 梯度下降可拆分为梯度 下降 在一阶函数中 某一点的梯度表示函数在该点处的导数 导数的正负号表示函数上升的方向 梯度下降是基于微积分中导数的概念 大部分的机器学习模型都有直接或间接地运用梯度下降的算法 1 梯度下降的目的 在机
  • OpenCV-Python学习(21)—— OpenCV 图像几何变换之图像翻转(cv.flip、np.flip)

    1 学习目标 学习 OpenCV 图像的翻转函数 cv flip 学习 NumPy 矩阵的反转函数 np flip 自己实现矩阵反转的函数 2 OpenCV 翻转 翻转也称镜像 是指将图像沿轴线进行轴对称变换 水平镜像是将图像沿垂直中轴线进
  • 【maven】mvn deploy 报错 Failed to deploy artifacts: Could not transfer artifact

    文章目录 1 场景1 1 1 概述 1 场景1 1 1 概述 因为在windows下 内网环境 然后升级了flink 但是包是外网拷贝进去的 拷贝到我的本地 现在本地升级好了 需要将jar包发布到内网的nexus机器中 但是执行命令报错如下
  • Vue3.0中引用子组件类型声明报错问题

    Vue3 0中引用子组件类型声明报错问题 报错原因 1 找不到组件模块或者找不到对应的类型声明 2 Typescript 只能理解 ts 文件 无法理解 vue 文件 解决方案 1 在项目根目录或 src 文件夹下创建一个后缀为 d ts
  • 第一个djiango项目(包含搭建环境)

    1 安装django框架 pip install django 2 创建项目命令 django admin startproject 项目名 django admin version 如果您看到Django版本号的输出 则表示安装成功 3
  • 数据分析(二) - Excel按一个单元格内的分隔符进行分行

    文章目录 场景 一 python 二 excel word 场景 办公室老师给了我一张Excel表 记录了每位同学的获奖情况 学号 姓名 奖项 加分 101 小明 ICPC世界冠军 国奖 优秀班干部 15 0 102 小亮 一作论文 数学建
  • vm manager failed to contact configuration server

    当用virt manager命令启动VM 管理工具是报错 vm manager failed to contact configuration server 如下办法解决了我的问题 读取dbus uuid dbus uuidgen get
  • 花费7元训练自己的GPT 2模型

    在上一篇博客中 我介绍了用Tensorflow来重现GPT 1的模型和训练的过程 这次我打算用Pytorch来重现GPT 2的模型并从头进行训练 GPT 2的模型相比GPT 1的改进并不多 主要在以下方面 1 GPT 2把layer nor
  • Gensim 中 word2vec 模型的恢复训练:载入存储模型并继续训练

    Gensim 中 word2vec 模型的恢复训练 本文为系列文章之一 前面的几篇请点击链接 NLP 利器 gensim 库基本特性介绍和安装方式 NLP 利器 Gensim 库的使用之 Word2Vec 模型案例演示 NLP 利器 Gen
  • 数据挖掘概述

    目录 1 数据挖掘概述 2 数据挖掘常用库 3 模型介绍 3 1 分类 3 2 聚类 3 3 回归 3 4 关联 3 5 模型集成 4 模型评估 ROC 曲线 5 模型应用 1 数据挖掘概述 数据挖掘 寻找数据中隐含的知识并用于产生商业价值
  • 无基础学c语言的打卡日记总论

    背景知识 笨人浙江考生 选课是政史地 目前在读大一 知道自己的专业学c并且还学数学分析和高等代数 一开始不以为意 学校用的教材是谭浩强老师的c语言程序设计 推荐的 小白友好 上课之前有很认真的自习课本 第一章好像是一个总论 里面有一些思想以
  • 在NPU上的切片操作x=x[:,::-1,:,:]不生效的分析解决

    1 系统环境 硬件环境 Ascend GPU CPU Ascend GPU MindSpore版本 1 9 0 执行模式 PyNative Graph 不限 Python版本 3 7 5 操作系统平台 Linux 2 报错信息 2 1 问题
  • winform下mapxtreme2008 v7.0 生成release版提示找不到dll问题

    在winform下基于mapxtreme2008 v7 0 生成了一个地图软件 用debug方式运行无误 但改为release版时提示缺少一大堆dll 如 无法从C Program Files x86 Common Files MapInf
  • 本地网站域名与联网冲突吐槽篇

    提示 前面是吐槽360使用bug 以及网站开发者使用弊端 解决冲突主要方法在后面 前言是解决电脑无法保存修改的hosts文件真相以及解决棒法 处理不行的话 只能一棒打死安全软件 前言 电脑里安装了360之类的安全软件 安全类软件为了安全 往
  • 时序预测

    时序预测 MATLAB实现时间序列回归之评估模型残差及统计分布 目录 时序预测 MATLAB实现时间序列回归之评估模型残差及统计分布 基本介绍 程序设计 异方差性 统计分布 学习总结 参考资料 致谢 基本介绍 残差分析的基本目的是检查 CL
  • 偷懒的一天-------Day83

    今天实在是学不进去 从公司里工作着也是浑浑噩噩的 虽然不是我媳妇生孩子 但这也是我们这个大家庭里的第一个孩子 我的亲大侄子啊 当然还可能是侄女 还在想名字 都想了好多了 还是有些激动有些紧张啊 偷懒一天 来码上几个字 草草写上至少我也知道我
  • Opencv的基础操作

    一 图像填充 首先定义图像显示函数 def cv show name img cv2 imshow name img cv2 waitKey 0 cv2 destroyAllWindows 图像读取 img cat cv2 imread c
  • 一定能让你理解的素数筛法——埃氏筛法和欧式筛法

    先上代码 埃氏筛法 include