Meissel–Lehmer 算法
「Meissel–Lehmer 算法」是一种能在亚线性时间复杂度内求出
记号规定
对于集合
Meissel–Lehmer 算法求 π(x)
定义
再定义
特殊的,我们定义:
这个无限和式实际上是可以表示为有限和式的,因为在
设
在
这样,计算
计算 P₂(x,a)
由等式
首先我们注意到
当
计算 ϕ(x,a)
对于
- 可以被
整除的; - 不可以被
整除的。
属于第
因此我们得出结论:
定理
: 函数 满足下列性质
计算
上图表示计算
但是,这样需要计算太多东西。因为
为了限制这个二叉树的「生长」,我们要改变原来的终止条件。这是原来的终止条件。
终止条件
: 如果 ,则不要再对节点 调用等式 。
我们把它改成更强的终止条件:
终止条件
: 如果满足下面 个条件中的一个,不要再对节点 调用等式 :
且 ; 。
我们根据 终止条件
- 如果叶子节点
满足 ,则称这种叶子节点为 普通叶子; - 如果叶子节点
满足 且 ,则称这种节点为 特殊叶子。
由此我们得出:
定理
: 我们有: 其中
表示 普通叶子 的贡献:
表示 特殊叶子 的贡献:
计算
计算 S
我们有:
我们将这个等式改写为:
其中:
注意到计算
如果不是这样,因为有
,所以有 ,这与 矛盾,所以原命题成立。
更多的,当
计算 S₁
因为:
所以:
所以计算
因此:
有了这个等式我们便可以在
计算 S₂
我们有:
我们将
其中:
计算 U
由
因此:
因此:
因为有
计算 V
对于计算
所以
其中:
预处理出
考虑我们如何加速计算
更准确的说,我们首先将
接着我们把这个式子改写为:
其中:
计算 W₁ 与 W₂
计算这两个值需要计算满足
计算 W₃
对于每个
计算 W₄
相比于
计算 W₅
我们像计算
计算 S₃
我们使用所有小于
算法的时空复杂度
时空复杂度被如下
- 计算
; - 计算
; - 计算
。
计算 P₂(x,y) 的复杂度
我们已经知道了这个过程的时间复杂度为
计算 W₁,W₂,W₃,W₄,W₅ 的复杂度
计算
计算
计算
因此,计算
计算
计算
计算 S₃ 的复杂度
对于预处理:由于要快速查询
对于求和:对于计算
总复杂度
这个算法的空间复杂度为
我们取
一些改进
我们在这里给出改进方法,以减少算法的常数,提高它的实际效率。
在 终止条件
中,我们可以用一个 来代替 ,其中 满足 。我们可以证明这样子计算 的时间复杂度可以优化到:这也为通过改变
的值来检查计算提供了一个很好的方法。为了清楚起见,我们在阐述算法的时候选择在
处拆分来计算总和 ,但实际上我们只需要有 就可以计算。我们可以利用这一点,渐近复杂性保持不变。用前几个素数
预处理计算可以节省更多的时间。
参考资料与拓展阅读
本文翻译自:Computing
本页面最近更新:2023/9/5 22:13:13,更新历史
发现错误?想一起完善? 在 GitHub 上编辑此页!
本页面贡献者:Early0v0, Peanut-Tang, 1196131597, Alpacabla, CCXXXI, Enter-tainer, GHLinZhengyu, Great-designer, megakite, Menci, Tiphereth-A, Vxlimo
本页面的全部内容在 CC BY-SA 4.0 和 SATA 协议之条款下提供,附加条款亦可能应用