线性筛的简单证明

news/2025/2/21 2:57:51/

原理

线性筛是一种可以在线性时间内将素数筛选出来的算法,其中的主要思想在于保证合数只会被它的最小质因数筛掉并且筛掉一次

代码

下面是线性筛的算法CPP实现:

vector<int> generate_primes_linear_time(int n) {vector<int> lp(n + 1);vector<int> primes;for (int i = 2; i <= n; ++i) {if (lp[i] == 0) {lp[i] = i;primes.push_back(i);}for (int j = 0; j < primes.size() && primes[j] <= lp[i] && i * primes[j] <= n; ++j)lp[i * primes[j]] = primes[j];}return primes;
}

其中 l p [ i ] lp[i] lp[i]保存了 i i i的最小质因数, p r i m e s primes primes则是存储了从小到大的质数。

简单证明

所有的合数只会被筛掉一次

假设存在一个合数被筛掉了两次,即存在合数 C = i ∗ p i = p j ∗ j ( p i > p j ) C=i*p_i=p_j*j(p_i>p_j) C=ipi=pjj(pi>pj),那么就可以得出它被两个不同的质数 p i , p j p_i,p_j pi,pj筛过两次,那么很容易得到 p j ∣ i p_j | \ i pj i,并且有 p i > p j p_i > p_j pi>pj,那么表明此时对于倍数 i i i的时候,在枚举到质数 p j p_j pj就会退出循环而不会枚举到 p i p_i pi,因此假设不成立。可以保证所有的合数有且并被筛过一次。

下一个没有被筛掉的数字一定是素数

假设下一个没有被筛掉的数字为 x x x,那么我们假设它不是素数,则有 x = p x ∗ q ( p x < x , q < x ) x=p_x*q(p_x < x, q < x) x=pxq(px<x,q<x)其中 p x p_x px x x x的最小质因数,那么对于倍数 q q q,在枚举素数的时候没有枚举到 p x p_x px,表明存在更加小的素数 p y p_y py使得 p y ∣ q p_y | \ q py q,因此也有 p y ∣ x p_y | \ x py x,所以 p x p_x px并不是 x x x的最小质因数。假设不成立,所以 x x x是素数。


http://www.ppmy.cn/news/1154445.html

相关文章

巴以冲突中暴露的摄像头正对安全构成威胁

巴以冲突爆发后&#xff0c;许多配置不当的安全摄像头正暴露给黑客活动分子&#xff0c;使其周遭人员面临巨大安全风险。 Cyber​​news 研究人员发现&#xff0c;在以色列至少有165 个暴露的联网 RTSP 摄像头&#xff0c;在巴勒斯坦有 29 个暴露的 RTSP 摄像头。在巴勒斯坦&am…

python字符串的定义和表示

在Python中&#xff0c;字符串是一种表示文本数据的数据类型。你可以使用单引号&#xff08;&#xff09;或双引号&#xff08;"&#xff09;来定义字符串&#xff0c;如下所示&#xff1a; str1 Hello World!str2 "Python is awesome." Python中的字符串可以…

应对互联网用户激增与IP地址短缺的挑战

互联网用户激增 随着互联网技术的飞速发展&#xff0c;互联网已经深刻改变了我们的生活方式和商业模式。无论是个人用户还是企业&#xff0c;都越来越依赖互联网进行沟通、娱乐、工作和学习。这一现象导致了互联网用户数量的快速激增。 IP地址的有限性 然而&#xff0c;与此…

Java两个线程使用最基础wait/notify轮流打印数字和字符

背景&#xff1a; 最基础的java线程协同工作题目&#xff0c;也是笔试常见题目。 题目要求两个线程轮流打印数字&#xff08;1-26&#xff09;和字符&#xff08;a到z&#xff09;。 代码 class PrintNumRunnable implements Runnable {final Object object;final static in…

【小余送书第三期】CTF/AWD竞赛标准参考书+实战指南:《AWD特训营》,参与活动,领书咯!

目录 一、背景介绍 二、内容简介 三、读者对象 四、本书目录 五、书籍概览 一、背景介绍 随着网络安全问题日益凸显&#xff0c;国家对网络安全人才的需求持续增长&#xff0c;其中&#xff0c;网络安全竞赛在国家以及企业的人才培养和选拔中扮演着至关重要的角色。 在数…

ORACLE XXX序列 goes below MINVALUE 无法实例化的处理办法

--序列增加区分 --删除未使用序列表 DECLARE V_CNT INT; BEGINSELECT COUNT(*) INTO V_CNT FROM USER_SEQUENCES WHERE SEQUENCE_NAME SEQ_INTELLECT_BIZ_DETAIL_ID;IF V_CNT1 THEN BEGINEXECUTE IMMEDIATE DROP SEQUENCE SEQ_INTELLECT_BIZ_DETAIL_ID;END;END IF; END; / ---…

vue3 v-html中使用v-viewer

安装&#xff1a;npm install v-viewernext 在main.js中配置 import “viewerjs/dist/viewer.css”; import Viewer from “v-viewer”; app.use(Viewer, { Options: { inline: true, //默认值&#xff1a;false。启用内联模式。 button: true, //在查看器的右上角显示按钮。 …

uniapp 自定义tabbar页面不刷新

最近在做自定义tabbar时&#xff0c;每次切换页面都要刷新&#xff0c;页面渲染很慢&#xff0c;需要实现切换页面不刷新问题。 结局思路&#xff0c;原生的tabbar切换页面时就不选新&#xff0c;用switchTab来跳转 1.pages.json中配置tabbar&#xff0c;如下,设置高度为0&am…