筛素数
https://blog.csdn.net/Yuki_fx/article/details/115103663
1不是素数
最小的素数是2
暴力
\([2,n-1]\)枚举,能整除则不是素数
优化
- 范围缩小为\([2,n/2]\)
- 素数(除了2)一定是奇数,只需判断奇数因子
- \(x = a \times b\),a递增,b递减,中间的分界线为 $ \sqrt n $ ab成对出现并且分散在\(\sqrt n\)两侧
埃氏筛:区间

如何构造合数?在大于1的数中任选两个相乘得到c,\(c = 1 \times c = a \times b\) 一定是合数
总结成算法:
- 两个数组,一个用来标记此数字是否访问过;另一个用来存储已经筛选出来的(如果仅仅是查询是否为素数只用访问数组即可,素数数组是方便输出素数的)
- 初始化访问数组的01为已访问
- 2到n循环判断是否访问过,访问过即为合数
- 对当前的i倍增,从两倍开始直到到达上界,但是这样会有重复,如2会对4,12,16标记,4也会对12,16标记




欧拉筛
不难发现,埃氏筛在优化后依旧会重复筛选
根据唯一分解定理,每个合数都有一个最小的素因子,而欧拉筛的基本思想是让每个合数被其最小的素因子筛掉,这样就可以保证不重复筛选
欧拉筛与埃氏筛的框架相同,关键在倍增操作
埃氏筛只要是素数就倍增
而欧拉筛是用当前的i乘以已有的素数,既可以保证用素数筛合数,也保证了从素数的平方开始筛

欧拉筛中 if(i%prime[j]==0) break 的语句保证了每个合数只会被其最小的质因数筛掉,这样就可以保证O(n)的复杂度

浙公网安备 33010602011771号