由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个素数。