由Eratosthenes筛法演变出的一种素数新筛法
这两天和walls老师交流讨论了一个中学竞赛题,我把原题稍作增强和变形,得到如下一个题:
从105到204这100个数中至少要选取多少个数才能保证选出的数中必有两个不是互素的?
我们知道最小的几个素数为2、3、5、7、11、13、17、……,由17*17>204可知,105到204之间的所有合数都有不大于13的素因数。于是可以这样构建标号分别为2、3、5、7、11、13的6个集合:
逐个遍历105到204的所有合数,如果它被2整除,就把它加入到标号为2的集合里;否则考察标号更大一级的集合,即如果它被3整除,则把它加入到标号为3的集合里;依次类推,每一个合数都会被加入到6个集合中某一个集合里。
上面提供了一种具体的构造集合的方法。由构造规则易知,这6个集合中任何一个集合,只要其中的数多于一个的话,从中任选两个数,它们都有该集合对应的标号作为它们的非1公约数,即它们不是互素的。
当然,并不需要真的去逐个遍历合数并采用上述的构造法把每个合数加到对应的集合里。这是因为如下两个因素:
(1)由前面的105到204之间的所有合数都有不大于13的素因数这一结论就说明105到204之间的每一个合数都可以放到上述的6个集合中的某一个里。比如110,它的不大于13的素因数有2、5和11,因此可以把110放到标号为2、5、11的任意一个集合里都是可以的;
(2)105到204之间有足够多的合数确保上述6个集合都不为空,这为上述的每个集合找一个独有的数就好,121=11*11,只能放到标号为11的集合里;169=13*13,只能放到标号为13的集合里;119=7*17,只能放到标号为7的集合里;125=5*5*5,只能放到标号为5的集合里;111=3*37,只能放到标号为3的集合里;128=2^7,只能放到标号为2的集合里。
我们甚至不必关心这些合数具体是哪些以及总数有多少个,但我们需要知道105到204之间有多少个素数,不然这个题就做不出来。设所求素数总数为n,那么由鸽巢原理马上就知道本题所求的答案为n+7。
接下来探讨如何求105到204之间的素数总数的问题。
最直接的办法是使用Eratosthenes筛法。为减少书写,同时去除2、3、5的倍数,得:
107 109
113 119
121 127
131 133 137 139
143 149
151 157
161 163 167 169
173 179
181 187
191 193 197 199
203
接着标出7的倍数(品红色标注)、11的倍数(绿色标注)和13的倍数(浅青色标注)。
剩下没有被标记的数都是素数,一共有19个。
中午在稿纸上由Eratosthenes筛法演变出一种更少书写的新筛法,说明如下:
依次分行写出13、11、7的倍数清单(略去2、3、5的倍数以及重复的数)
13: 143, 169
11: 121, 187
7: 119, 133, 161, 203
遍历105到204的数,依次写下不是2、3、5的倍数且不在13、11、7的倍数清单里的数:
107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199
一共是19个素数。
由Eratosthenes筛法演变出的一种素数新筛法的更多相关文章
- 下面给出了四种设计模式的作用: 外观(F
下面给出了四种设计模式的作用: 外观(Fa?ade :为子系统中的一组功能调用提供一个一致的接口,这个接口使得这一子系统更加容易使用: 装饰(Decorate):当不能采用生成子类的方法进行扩充时,动 ...
- 面试官:spring中定义bean的方法有哪些?我一口气说出了12种,把面试官整懵了。
前言 在庞大的java体系中,spring有着举足轻重的地位,它给每位开发者带来了极大的便利和惊喜.我们都知道spring是创建和管理bean的工厂,它提供了多种定义bean的方式,能够满足我们日常工 ...
- poj2689 Prime Distance(素数区间筛法)
题目链接:http://poj.org/problem?id=2689 题目大意:输入两个数L和U(1<=L<U<=2 147 483 647),要找出两个相邻素数C1和C2(L&l ...
- 找出10000内的素数 CSP
"Problem: To print in ascending order all primes less than 10000. Use an array of processes, SI ...
- POJ-2689-Prime Distance(素数区间筛法)
链接: https://vjudge.net/problem/POJ-2689 题意: The branch of mathematics called number theory is about ...
- Swift 中异常抛出和四种异常处理
在Swift中你可以像其他语言一样抛出异常处理异常,今天我们就详细地说说Swift中的异常抛出和处理. 在一开始我们要定义错误或者说是异常,Swift中的一些简单异常可以使用枚举定义,注意这个枚举要继 ...
- 一口气说出Redis 5种数据结构及对应使用场景,面试要加分的
整理了一些Java方面的架构.面试资料(微服务.集群.分布式.中间件等),有需要的小伙伴可以关注公众号[程序员内点事],无套路自行领取 更多优选 一口气说出 9种 分布式ID生成方式,面试官有点懵了 ...
- 基于Visual C++2013拆解世界五百强面试题--题10-找出N个数种最大的K个数
有一亿个整数,请找出最大的 1000 个,要求时间越短越好, 空间占用越好越好. 如果不考虑时间效率,很容易想到解决方法,我们只需存储前一千个数, 然后依次读入后面的数和这一千个数组比较,替换其中比较 ...
- 长度为n的数组,有一个数重复出现了n/2+1次,找出(三种方法)
问题: 长度为n的数组,有一个数重复出现了n/2+1次,找出这个数: 解决: 比较直接的思路是遍历每个元素,让其与剩下其他元素比较,相等一次计数器sum++,直到sum=n/2+1为止: #inc ...
随机推荐
- SSM和Maven整合
项目架构如图 applicationContext.xml还有其他文件一起放进resources下 jsp,js,等文件放在webapp下
- Python - 可变和不可变对象
前置知识 在 Python 中,一切皆为对象 Python 中不存在值传递,一切传递的都是对象的引用,也可以认为是传址 有哪些可变对象,哪些不可变对象? 不可变对象:字符串.元组.数字(int.flo ...
- 深入刨析tomcat 之---第11篇 how tomcat works( 第15章 ) 如何解析web.xml 文件
writedby 张艳涛 记得当年是学习jsp的时候,写过web.xml中的标签.在之后的springmvc中也是有关于配置mvc 过滤器 和dispatchServlet的标签,之前是看不懂呢!看到 ...
- Spring最简单构建一个后台{msg:"登录成功",code:200,data:null}
一.简介 {msg:"登录成功",code:200,data:null} 二.两种请求 如果严格msg code data也带"" @RestControlle ...
- a = input(a, yymmdd10.)引发的问题
在数据清理过程中,经常会遇到以文本储存的日期型数据,这种数据不能直接进行分析,需要先将其转化为以数值存储的格式. 首先准备数据集: data data1; input a :$10. b :$10. ...
- css :nth-of-type选择器为什么不起作用!!!
问题 今天工作才发现的,原来我一直就理解错了!! MDN官网对这个选择器的的定义是: :nth-of-type() 这个 CSS 伪类是针对具有一组兄弟节点的标签, 用 n 来筛选出在一组兄弟节点的位 ...
- 论文笔记:(ICML2020)On Learning Sets of Symmetric Elements
目录 摘要 一.引言 二.先前的工作 三.基础 3.1 符号和基本定义 3.2 G-不变网络 3.3 描述等变层 3.4 Deep sets 四.DSS层 4.1 对称元素集合 4.2 等变层的表征 ...
- Java基础——类型转换注意事项及常见问题
类型转换 由于Java是强类型语言,所以要进行有些运算的时候,需要用类型转换 低------------------------------------------------------------ ...
- 线性代数期末大总结I
行列式 n阶行列式的计算: \[\left|\begin{matrix}a_{11} & a_{12} & \cdots & a_{1n} \\a_{21} & a_{ ...
- 关于Servlet技术
1.Servlet 技术 a)什么是 Servlet 1.Servlet 是 JavaEE 规范之一.规范就是接口 ...