Eratosthenes 筛法

【预备】素数计数函数Prime-counting function

数学中,素数计数函数是一个用来表示小于或等于某个实数x的素数的个数的函数,记为{\displaystyle \pi (x)}.

这个定理由高斯和勒让德在18世纪末提出,并在1896年被证明,证明用到了黎曼ζ函数的性质.

精确估计为:

\pi(x) = \operatorname{li}(x) + \mathrm{O} \left( x \exp \left( -\frac{\sqrt{\ln(x)}}{15} \right) \right)\!

一般使用:

{\displaystyle {\pi(x) =\frac {x}{\log(x)}}}

换言之,第n个素数的大小约为O(nlogn),严格来说为

{\displaystyle p_{n}=n\ln n+n\ln \ln n-n+{\frac {n\ln \ln n-2n}{\ln n}}+O\left({\frac {n(\ln \ln n)^{2}}{(\ln n)^{2}}}\right)}

有上下界

{\displaystyle n\ln n+n\ln \ln n-n<p_{n}<n\ln n+n\ln \ln n\!}

给出简单证明

【预备】Mertens 第二定理

\sum_{p\leq x}\frac{1}{p} =loglogx+B_1+O(\frac{1}{logx})

B_{1}=c-\sum_{p} \sum_{k \geq 2} \frac{1}{k p^{k}}=c+\sum_{p}\left[\frac{1}{p}+\log \left(1-\frac{1}{p}\right)\right]

给出弱化版证明

证明

如果每一次对数组的操作花费 1 个单位时间,则时间复杂度为:

O\left(n \sum_{k=1}^{\pi(n)} \frac{1}{p_k}\right)

其中p_k表示第k小的素数,根据Mertens第二定理,存在常数B_1使得:

\sum_{k=1}^{\pi(n)} \frac{1}{p_k}=\log \log n+B_{1}+O\left(\frac{1}{\log n}\right)

所以 Eratosthenes 筛法 的时间复杂度为O(nloglogn)

代码与实现

int Eratosthenes(int n) 
{
  int cnt = 0;//记录素数的数量,并不是必须的语句  
  is_prime[0] = is_prime[1] = 0;//预置认为0,1是素数
  for (int i = 2; i <= n; ++i)
  {
    if (is_prime[i]) 
    {
      prime[cnt++] = i;  // prime[cnt]是i,后置自增运算代表当前素数数量
      for (int j = i * i; j <= n; j += i)
        is_prime[j] = 0;  // 是i的倍数的均不是素数
     }
  }
  return cnt;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值