Prime Sieve - 素数筛法


问题

素数(质数)是除了和它自身没有其他数能够整除的正整数,最小的素数是。而不符合该特性的正整数是合数,常见的素数有

素数是数论学科中的基础概念,关于素数的最为著名的问题就是哥德巴赫猜想。判断中哪些是素数,哪些是合数。

简单筛法

按照素数的定义,判断一个正整数是否为素数,需要满足范围内的所有正整数除了没有其他能够被整除的整数。

即遍历所有数字,判断其是否能被整除()即可。

用该算法判断一个正整数是否为素数的时间复杂度为,判断范围内的整数是否为素数的时间复杂度为

埃拉托斯特尼筛法/埃氏筛法(Sieve of Eratosthenes)

埃式筛法设置数组是一个布尔值,表示数字是否为素数。

为筛子,除了本身所有的倍数都不是素数,即

为筛子,除了本身所有的倍数都不是素数,即

为筛子,除了本身所有的倍数都不是素数,即

称这样作为遍历起点的数字为筛子。

对筛法进行两点优化:

不是素数,那么存在,显然不能同时大于。因此筛子只需要选择,即可判断范围内的所有数字是否为素数。

筛子遍历倍数时,其中之前的筛子已经筛选了,筛子已经筛选了,筛子已经筛选了。可以跳过这部分来节省时间。因此那么对于筛子只需要遍历这部分即可。

由于存在某些素数被重复筛选,埃氏筛法的时间复杂度为(证明略)。


素数筛法


源码

PrimeSieve.h

PrimeSieve.cpp

测试

PrimeSieveTest.cpp