普通筛法:
核心思路:
使用一个布尔数组记录此数是否为素数,
从2~n便利,
如果是此数记录为素数
向后维护数组,此素数的K倍均为非素数,直到大于n.
^时间复杂度O(nlogn)
便利+维护
埃式筛法
初式:
同线性筛法,依次遍历向后维护
但是对每个数均进行倍数标记
直到sqrt(n)
存在重复标记
因而时间复杂度来到了O(nloglogn)
便利部分+维护
在Python中,由于循环较慢,使用NumPy优化的埃氏筛法(利用切片赋值)比纯Python的线性筛法快。
即C/C++中使用线性筛数,Python使用埃式筛法
线性筛法(欧拉筛)
基于以上的思考,对素数表的标记继续优化
使每个数都被其最小的质因数筛掉
for(int j=1;i*primes[j]<=n;j++){ vis[i*primes[j]]=true; if(i%primes[j]==0) break; }
for j in primes: if i*j>n: break vis[i*j]=True if i%j==0: break #python版优化
不过python用埃氏筛就好(