素数算法(普通求解,埃氏筛,欧拉筛)

素数算法(常规求解,埃氏筛,欧拉筛)

  • 1. 常规求解
    • 1.1 原理解释
    • 1.2 算法实现
  • 2 . 埃氏筛
    • 2.1 原理解释
    • 2.2 算法实现
  • 3. 欧拉筛
    • 3.1 原理解释
    • 3.2 算法实现

1. 常规求解

1.1 原理解释

枚举法是一种简单的求解素数的方法,其基本思想是从2开始逐个判断每个数字是否为素数。具体来说,对于一个待判断的数n,我们可以从2开始依次尝试将n除以小于等于n的开方的所有数,如果存在一个因子能够整除n,则n不是素数;否则n是素数。

这种方法的效率较低,特别是在处理大范围内的素数时,会耗费大量时间和计算资源。因此,在实际应用中,通常使用更加高效的质数筛选法或素性测试算法来求解素数。

1.2 算法实现

import mathdef is_prime(n):if n < 2:return Falsefor i in range(2, int(math.sqrt(n)) + 1):if n % i == 0:return Falsereturn True

其中,函数is_prime接受一个正整数n作为输入,返回一个布尔值,表示n是否为素数。在函数中,我们首先判断如果n小于2,则返回False,因为2是最小的素数。然后,我们从2开始循环,到n的开方的整数部分+1为止,依次判断是否存在能整除n的因数。如果找到一个可以整除n的数,则n不是素数,返回False;如果遍历完所有可能的因数,都没有找到可以整除n的数,则n是素数,返回True。

需要注意的是,枚举法只适用于判断较小的数字是否为素数。在实际应用中,通常需要判断的数字范围非常大,因此使用更加高效的算法求解素数是必要的。

2 . 埃氏筛

2.1 原理解释

埃拉托斯特尼筛法(Sieve of Eratosthenes)是一种常用的质数筛选法,可以高效地找出一定范围内的所有素数。其基本原理是通过逐步排除非素数的方式来筛选出素数。

具体步骤如下:

创建一个长度为n+1的布尔数组is_prime,初始化所有元素为True。is_prime[i]表示数字i是否为素数。

从2开始,遍历到√n,对于每个遇到的素数p,执行以下操作:

如果is_prime[p]为True,说明p是素数,将is_prime[p]置为False。
对于p的所有倍数i(i从2开始),将is_prime[i*p]置为False。这些数都不是素数,因为它们至少有一个因子p。
遍历完成后,所有is_prime[i]为True的索引i对应的数字i都是素数。

埃氏筛利用了一个重要的性质:如果一个数是素数,那么它的所有倍数都不是素数。因此,通过遍历素数的倍数并将其标记为非素数,我们可以排除一大批非素数,从而筛选出素数。

2.2 算法实现

import mathdef sieve_of_eratosthenes(n):is_prime = [True] * (n + 1)is_prime[0] = is_prime[1] = Falsefor p in range(2, int(math.sqrt(n)) + 1):if is_prime[p]:for i in range(p * p, n + 1, p):is_prime[i] = Falseprimes = [i for i in range(n + 1) if is_prime[i]]return primes

在代码中,我们首先创建了一个长度为n+1的布尔数组is_prime,并将所有元素初始化为True。然后,从2开始遍历到√n,对于每个素数p,将其倍数标记为非素数。遍历完成后,根据is_prime数组中值为True的索引,构建出素数列表primes并返回。

埃氏筛的时间复杂度为 O(n log log n),其中n是待筛选的范围。该方法的优势在于其简单性和较低的时间复杂度,但当处理极大范围内的素数时,还有更优秀的算法可以使用,如线性筛(欧拉筛)法。

3. 欧拉筛

3.1 原理解释

欧拉筛(Euler’s sieve)是一种高效的质数筛选算法,通过遍历每个数并标记其最小质因数来筛选出所有素数。与埃氏筛不同,欧拉筛只标记每个数一次,因此其时间复杂度为 O(n)。

具体步骤如下:

创建一个长度为n+1的数组is_prime,初始化所有元素为True。is_prime[i]表示数字i是否为素数。

遍历2到n的每个数i,执行以下操作:

如果is_prime[i]为True,说明i为素数,将i加入素数列表primes。
遍历素数列表primes中的每个素数p,如果i * p <= n,将is_prime[i * p]置为False。
如果i能整除p,跳出内层循环,避免重复标记。
在欧拉筛中,我们利用了一个重要性质:每个合数都有一个最小质因数,而这个最小质因数不会大于它的平方根。因此,在遍历过程中,我们只需要标记每个数的最小质因数即可,无需遍历它的倍数。

3.2 算法实现

def euler_sieve(n):is_prime = [True] * (n + 1)primes = []for i in range(2, n + 1):if is_prime[i]:primes.append(i)for p in primes:if i * p > n:breakis_prime[i * p] = Falseif i % p == 0:breakreturn primes

在代码中,我们首先创建了一个长度为n+1的数组is_prime,并初始化所有元素为True。然后,我们遍历2到n的每个数i,在遍历过程中利用已知的素数列表primes来标记每个数的最小质因数。如果is_prime[i]为True,说明i为素数,将其添加到primes列表中。

欧拉筛的时间复杂度为 O(n),因为每个数只会被标记一次。这使得欧拉筛成为了一种高效的计算素数的算法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/685142.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

黑马程序员java部分笔记(持续更新)九点五:数组的动态初始化与常见问题

为什么有动态初始化呢? 当 不知道数组里几个元素的具体值时用动态初始化 动态初始化&#xff1a;初始化时只指定数组长度&#xff0c;由系统分配初始值 格式&#xff1a;数据类型[]数组名new 数据类型[数组长度]; 特点&#xff1a;在创建的时候有自己指定数组长度&#xff0c;…

Java的集合框架和泛型

文章目录 集合框架什么是集合框架类和接口总览 集合框架的重要性背后所涉及的数据结构以及算法什么是数据结构容器背后对应的数据结构什么是算法 包装类基本数据类型和对应的包装类装箱和拆箱自动装箱和自动拆箱 泛型什么是泛型引出泛型语法泛型类泛型的上界(没有下界)泛型方法…

心理辅导|高校心理教育辅导系统|基于Springboot的高校心理教育辅导系统设计与实现(源码+数据库+文档)

高校心理教育辅导系统目录 目录 基于Springboot的高校心理教育辅导系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、学生功能模块的实现 &#xff08;1&#xff09;学生登录界面 &#xff08;2&#xff09;留言反馈界面 &#xff08;3&#xff09;试卷列表界…

方式0控制流水灯循环点亮

#include<reg51.h> //包含51单片机寄存器定义的头文件 #include<intrins.h> //包含函数_nop_()定义的头文件 unsigned char code Tab[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};//流水灯控制码,该数组被定义为全局变量 sbit P17=P1^7; /*****************…

100.网游逆向分析与插件开发-网络通信封包解析-C++还原网络通信系统发送功能

内容参考于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;数据包组织与发送过程逆向分析 码云地址&#xff08;游戏窗口化助手 分支&#xff09;&#xff1a;https://gitee.com/dye_your_fingers/sro_-ex.git 码云版本号&#xff1a;ec54e9ae1ca0efe96b87d5…

C/C++如何把指针所指向的指针设为空指针?

实践出真知&#xff0c;指针对于初学的友友来说&#xff0c;头都要大了。喵喵一直遵循在实践中学&#xff0c;在学习中实践&#xff0c;相信你也会有所得&#xff01; 以下是该问题的解决方案&#xff1a; int** ptrPtr new int*; // 创建指向指针的指针 int* ptr new int;…

《动手学深度学习(PyTorch版)》笔记8.2

注&#xff1a;书中对代码的讲解并不详细&#xff0c;本文对很多细节做了详细注释。另外&#xff0c;书上的源代码是在Jupyter Notebook上运行的&#xff0c;较为分散&#xff0c;本文将代码集中起来&#xff0c;并加以完善&#xff0c;全部用vscode在python 3.9.18下测试通过&…

基于Springboot的社区物资交易互助平台(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的社区物资交易互助平台&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系…

深度学习||YOLO(You Only Look Once)深度学习的实时目标检测算法(YOLOv1~YOLOv5)

目录 YOLOv1: YOLOv2: YOLOv3: YOLOv4: YOLOv5: 总结: YOLO(You Only Look Once)是一系列基于深度学习的实时目标检测算法。 自从2015年首次被提出以来,YOLO系列不断发展,推出了多个版本,包括YOLOv1, YOLOv2, YOLOv3, YOLOv4, 和YOLOv5等。下面是对YOLO系列的详解…

【光学】学习记录1-几何光学的近轴理论

课程来源&#xff1a;b站资源-光学-中科大-崔宏滨老师&#xff08;感谢&#xff09;&#xff0c;本系列仅为自学笔记 【光学 中科大 崔宏滨老师 1080p高清修复&#xff08;全集&#xff09;】https://www.bilibili.com/video/BV1NG4y1C7T9?p2&vd_source7ba37b2cff2a1b783…

MATLAB计算极限和微积分

一.函数与极限 计算极限&#xff1a;lim(3*x^2/(2x1))&#xff0c;x分别趋于0和1&#xff0c;代码如下&#xff1a; syms x; limit(3*x*x/(2*x1),x,0) limit(3*x*x/(2*x1),x,1) 结果分别为0和1&#xff1a; 1.计算双侧极限 计算极限&#xff1a;lim(3*x^2/(2x1))&#xff0…

wordpress日主题模版Ripro-v5 6.4开心版

RiPro主题全新V5版本&#xff0c;&#xff08;原RiPro v2旧版已停更&#xff09;是一个优秀且功能强大、速度极快&#xff0c;易于管理、现代化的WordPress虚拟资源商城主题。支持首页模块化布局和WP原生小工具模块化首页可拖拽设置&#xff0c;让您的网站设计体验更加舒适。同…

linux进程控制【程序替换】

目录 前言&#xff1a; 1.替换原理 ​编辑 2.替换函数 2.1函数 execl 2.2函数 execv 2.3函数 execlp 2.4函数 execvp 2.5函数 execle 2.6函数 execve 2.7函数 execvpe 前言&#xff1a; 前面我们介绍了进程控制中的创建&#xff0c;退出等待&#xff0c;本章节我们将…

计算机的分类

计算机的分类 1.个人移动设备。这个比较好理解&#xff0c;比较常见的是手机&#xff0c;平板电脑。 2.桌面计算机。这类计算机范围比较广泛&#xff0c;包括低端的上网本&#xff0c;台式计算机&#xff0c;笔记本电脑和高端的工作站。核心部件都是表大规模集成电路技术的cp…

8.JS中的== 操作符的强制类型转换规则

对于 来说&#xff0c;如果对比双方的类型不一样&#xff0c;就会进行类型转换。假如对比 x 和 y 是否相同&#xff0c;就会进行如下判断流程&#xff1a; 首先会判断两者类型是否相同&#xff0c;类型相同的话就比较两者的大小&#xff1b;类型不相同的话&#xff0c;就会进…

核心篇-OSPF技术之序(下)

文章目录 一. 实验专题1.1. 实验1&#xff1a;配置OSPF特殊区域1.1.1. 实验目的1.1.2. 实验拓扑图1.1.3. 实验步骤&#xff08;1&#xff09;配置IP地址&#xff08;2&#xff09;创建环回口&#xff08;3&#xff09;查看路由表&#xff08;4&#xff09;设置Stub区域&#xf…

【LeetCode】1005. K 次取反后最大化的数组和(简单)——代码随想录算法训练营Day33

题目链接&#xff1a;1005. K 次取反后最大化的数组和 题目描述 给你一个整数数组 nums 和一个整数 k &#xff0c;按以下方法修改该数组&#xff1a; 选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。 重复这个过程恰好 k 次。可以多次选择同一个下标 i 。 以这种方式修改…

2024/02/13

21 、C 22 、D 23、B 如果5先出栈那么1&#xff0c;2&#xff0c;3&#xff0c;4就已经入栈了&#xff0c;5出后4出&#xff0c;1要出栈必须先让3&#xff0c;2出栈&#xff0c;所以 不可能输出B 24、10&#xff0c;12&#xff0c;120 25、2&#xff0c;5 26、段错…

selenium定位元素报错:‘WebDriver‘ object has no attribute ‘find_element_by_id‘

Selenium更新到 4.x版本后&#xff0c;以前的一些常用的代码的语法发生了改变 from selenium import webdriver browser webdriver.Chrome() browser.get(https://www.baidu.com) input browser.find_element_by_id(By.ID,kw) input.send_keys(Python)目标&#xff1a;希望通…

【Python--网络编程之TCP三次握手】

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;Python开发技术 &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; Python网络编程之[TCP三次握手] 往期内容代码见资源&#xff0c;效果图如下一、实验要求二、协…