P3383 【模板】线性筛素数
https://blog.csdn.net/huang_miao_xin/article/details/51331710
首先看一个关于质数分布的规律:
- 大于等于5的质数一定和6的倍数相邻。例如5和7,11和13,17和19等等;
- 在6的倍数相邻两侧并不是一定就是质数。
证明:令x≥1,将大于等于5的自然数可表示成:[6x-1 6x 6x+1 6x+2 6x+3 6x+4]
一组
其中6x 6x+2 6x+3 6x+4
可提出因子2或3,所以它们一定不是素数。
显然,素数要出现只可能出现在6x的相邻两侧。这里有个题外话,关于孪生素数,有兴趣的道友可以再另行了解一下,由于与我们主题无关,暂且跳过。
此时判断质数可以6个为单元快进,循环中i++步长加大为6,加快判断速度。
下面考虑如何对6x-1和6x+1进行判断?
现在n=6x-1或6x+1,找n有没有因子怎么找?
首先俩数都是奇数。因子不可能是2。
6x是3的倍数。6x+1和6x-1因子不能是3.
因子可能是:5、7 11、13 17、19 步长6。
这中间的数随便拿一个出来。都是2或3的倍数。
循环结束条件?判断到开根号就行了,这是判断质数的基本知识点。
代码:
1 |