c++浅析素数原理和埃拉托斯特尼筛法(埃筛)

2023-12-01 07:10

本文主要是介绍c++浅析素数原理和埃拉托斯特尼筛法(埃筛),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

(以下图片来自wikipedia)

素数定理

我们先来看一个问题,对于一个不超过n的正整数,其中有多少是素数:

这就需要用到一个老朋友

我们高中经常见到的一个函数

\pi (x) \sim \frac{x}{lnx}

其中 \pi (x) 表示不超过x的素数的个数

上述函数表示不超过素数的数量可以用x/lnx来拟合

那么对于100个数中,就能大概计算出素数的个数约为22个,实际为25个

这样在做题时就可以大约估计出区间内素数的个数

Eratosthenes筛法

又称埃筛,是判断素数最为常见的一种筛法

所谓“筛”,是一种形象化的描述,我们设置的条件就如筛子上的孔,筛掉的杂质就是我们不需要的

合数,留下来的精品就是我们需要的素数

一个好的“筛子”,空的大小要合理,排布要准确,如果一个一个筛去,便会十分费力

所以我们要优化孔,是其筛的效率更高

对于每一个素数p,筛掉p的倍数,当筛完一轮之后(见文章开头的图),剩下的便是素数

下面给出代码

//to find the prime among 1 and nfor(int i = 2; i <= n; i ++){for(int j = i * 2; j <= n; j+= i) prime[j] = false;}

对于第二行循环的条件,我们解释一下

其中先令j是i = 2的2倍(因为2是素数),每次都递增i的一倍,即j = 4 -> j = 6 -> j = 8...

每次i的递增,当i等于3时,j起始为6,然后为9...

当i = 4时,会发现4已经被筛掉了,这里可以引出欧拉筛,一种更为巧妙的筛法,但在这里先不做介绍

...

以此类推,就如同开头的图一样,把质数的倍数全部筛掉了!

多么简单而又高效的一种算法!

时间复杂度分析

我们对程序的时间复杂度进行一次分析

对于每一个i值,内部循环的次数越是(想一想为什么,很简单!)

\frac{n}{i} 

即当i=2时,即为n/2

对于多次,并求和相加,便得到

\frac{n}{2} + \frac{n}{3} + \frac{n}{4} + \frac{n}{5}.....+\frac{n}{n}

 想一想这像什么?有没有想到把n做为因子提出来

没错,就是泰勒展开式

所以其复杂度为 O(nlogn) 

这样的运行效率已经很高了,为了更高,我们可以降低我们区间的范围

对于一个自然数来说,只要通过在\sqrt{n}的范围内的素数,就能筛掉n范围内的所有合数

为什么呢?

很简单,我们先来看一个数 72

他的约数有(1,72), (2, 36), (3, 24), (4, 18), (6,12), (9, 8)

会发现,72的平方根约为8.4, 而每个约数对里必有一个小于8.4的数,所以只要能判定

\sqrt{n}的范围内的素数,就能筛掉n范围内的所有合数

所以只需限定一个sqrt(n)的条件即可

 

这篇关于c++浅析素数原理和埃拉托斯特尼筛法(埃筛)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/440263

相关文章

apache的commons-pool2原理与使用实践记录

《apache的commons-pool2原理与使用实践记录》ApacheCommonsPool2是一个高效的对象池化框架,通过复用昂贵资源(如数据库连接、线程、网络连接)优化系统性能,这篇文章主... 目录一、核心原理与组件二、使用步骤详解(以数据库连接池为例)三、高级配置与优化四、典型应用场景五、注意事

C++ RabbitMq消息队列组件详解

《C++RabbitMq消息队列组件详解》:本文主要介绍C++RabbitMq消息队列组件的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. RabbitMq介绍2. 安装RabbitMQ3. 安装 RabbitMQ 的 C++客户端库4. A

C++ HTTP框架推荐(特点及优势)

《C++HTTP框架推荐(特点及优势)》:本文主要介绍C++HTTP框架推荐的相关资料,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. Crow2. Drogon3. Pistache4. cpp-httplib5. Beast (Boos

电脑系统Hosts文件原理和应用分享

《电脑系统Hosts文件原理和应用分享》Hosts是一个没有扩展名的系统文件,当用户在浏览器中输入一个需要登录的网址时,系统会首先自动从Hosts文件中寻找对应的IP地址,一旦找到,系统会立即打开对应... Hosts是一个没有扩展名的系统文件,可以用记事本等工具打开,其作用就是将一些常用的网址域名与其对应

Dubbo之SPI机制的实现原理和优势分析

《Dubbo之SPI机制的实现原理和优势分析》:本文主要介绍Dubbo之SPI机制的实现原理和优势,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Dubbo中SPI机制的实现原理和优势JDK 中的 SPI 机制解析Dubbo 中的 SPI 机制解析总结Dubbo中

浅析Java如何保护敏感数据

《浅析Java如何保护敏感数据》在当今数字化时代,数据安全成为了软件开发中至关重要的课题,本文将深入探讨Java安全领域,聚焦于敏感数据保护的策略与实践,感兴趣的小伙伴可以了解下... 目录一、Java 安全的重要性二、敏感数据加密技术(一)对称加密(二)非对称加密三、敏感数据的访问控制(一)基于角色的访问

C++类和对象之初始化列表的使用方式

《C++类和对象之初始化列表的使用方式》:本文主要介绍C++类和对象之初始化列表的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C++初始化列表详解:性能优化与正确实践什么是初始化列表?初始化列表的三大核心作用1. 性能优化:避免不必要的赋值操作2. 强

C++迭代器失效的避坑指南

《C++迭代器失效的避坑指南》在C++中,迭代器(iterator)是一种类似指针的对象,用于遍历STL容器(如vector、list、map等),迭代器失效是指在对容器进行某些操作后... 目录1. 什么是迭代器失效?2. 哪些操作会导致迭代器失效?2.1 vector 的插入操作(push_back,

Android与iOS设备MAC地址生成原理及Java实现详解

《Android与iOS设备MAC地址生成原理及Java实现详解》在无线网络通信中,MAC(MediaAccessControl)地址是设备的唯一网络标识符,本文主要介绍了Android与iOS设备M... 目录引言1. MAC地址基础1.1 MAC地址的组成1.2 MAC地址的分类2. android与I

Spring框架中@Lazy延迟加载原理和使用详解

《Spring框架中@Lazy延迟加载原理和使用详解》:本文主要介绍Spring框架中@Lazy延迟加载原理和使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、@Lazy延迟加载原理1.延迟加载原理1.1 @Lazy三种配置方法1.2 @Component