Eular质数筛法

一 Eular质数筛法

欧拉筛法是一种比Eratosthenes筛法更为高效的质数筛法,其时间复杂度是O(n),其算法思想很简单,描述如下:

linear_prime_sieves
1:  set is_prime[] to true
2:  for i=2 to n
3:    if is_prime[i]=true then prime[pi++]=i
4:    for j=0 to pi-1
5:      if prime[j]*i>n then exit loop_j
6:      is_prime[prime[j]*i]=false
7:      if i mod prime[j]=0 then exit loop_j
8:    endif
9:  endif


这个算法有两层循环,第一层循环遍历从2开始到n的范围内寻找质数,如下为质数,则加入到prime数组里。第二层循环则是对未来的数进行筛选。对于当前的i,显然它乘以任何一个已找到的质数都能组成一个合数,可以将其剔除。算法最难理解的是第七行:当peimer[j]是i的因子的时候,退出循环,不再进行剔除操作;这么做的原因如下:首先peimer[j]是i的最小质因数,因为j是从0开始的;其次,我们可以肯定的说,i已经无需再去剔除prime[j']*i (j'>j) 形式的合数了,这是因为,prime[j']*i可以写成prime[j']*(prime[j]*k)=prime[j]*(prime[j']*k),也就是说所有的prime[j']*i将会被将来的某个i'=prime[j']*k剔除掉,当前的i已经不需要了。


你可能感兴趣的:(算法)