Prime Sieve - 素数筛法
问题
素数(质数)是除了和它自身没有其他数能够整除的正整数,最小的素数是。而不符合该特性的正整数是合数,常见的素数有
素数是数论学科中的基础概念,关于素数的最为著名的问题就是哥德巴赫猜想。判断中哪些是素数,哪些是合数。
简单筛法
按照素数的定义,判断一个正整数是否为素数,需要满足范围内的所有正整数除了没有其他能够被整除的整数。
即遍历所有数字,判断其是否能被整除()即可。
用该算法判断一个正整数是否为素数的时间复杂度为,判断范围内的整数是否为素数的时间复杂度为。
埃拉托斯特尼筛法/埃氏筛法(Sieve of Eratosthenes)
埃式筛法设置数组,是一个布尔值,表示数字是否为素数。
以为筛子,除了本身所有的倍数都不是素数,即;
以为筛子,除了本身所有的倍数都不是素数,即;
以为筛子,除了本身所有的倍数都不是素数,即;
称这样作为遍历起点的数字为筛子。
对筛法进行两点优化:
若不是素数,那么存在,显然不能同时大于。因此筛子只需要选择,即可判断范围内的所有数字是否为素数。
筛子遍历倍数时,其中之前的筛子已经筛选了,筛子已经筛选了,,筛子已经筛选了。可以跳过这部分来节省时间。因此那么对于筛子只需要遍历这部分即可。
由于存在某些素数被重复筛选,埃氏筛法的时间复杂度为(证明略)。
素数筛法
- http://101.96.10.63/research.cs.wisc.edu/techreports/1990/TR909.pdf
- https://www.cs.utexas.edu/users/misra/scannedPdf.dir/linearSieve.pdf