杜教筛的时空复杂度分析
背景
杜教筛是 OI 界中一种常用的计算积性函数前缀和的技巧:对于积性函数
将
关键在于
- 快速计算
$\sum_{k = 1}^n (f \times g)(k)$ 。 - 快速计算
$\sum_{k = 1}^n g(k)$ 。
那么利用哈希表,我们就可以以比较低的时空复杂度计算
具体分析
考虑一个具体的例子:计算欧拉函数
定义
引理 1
证明 令
引理 2 对于任意连续单增函数
则
这个引理来自 Concrete Mathematics [1] 的 (3.10),这里就不再证明。
引理 3 令正整数
证明 令
定理 1
证明 对于
对于
对于
定理 2 对于任意正整数
证明 因为
定理 2 揭示了这个技巧的巧妙所在:为了计算
当然空间复杂度是
取
后记
之所以会写这篇博客,主要是我第二次看杜教筛的资料的时候,终于想通了它的时间复杂度分析,也就上面这一堆东西。但实际上和任之洲的集训队论文 [2] 相比,只多出了一个简单的定理 2。没有意识到这一点之前,我一直无法理解为什么那两个和式就可以代表杜教筛的时间复杂度。另外,更重要的一点就是看到了 tangjz 的《浅谈一类积性函数的前缀和》中的分析,个人认为那是在自欺欺人,稍有用心的人就会发现其中描述时间复杂度的
参考资料
[1]. Ronald L. Graham, Donald E. Kunth, Oren Patashnik, 2002, Concrete Mathematics (2th edition), 978-7-111-10576-3
[2]. 任之洲,2016,《积性函数求和的几种方法》,2016 年信息学奥林匹克中国国家队候选队员论文