这篇具有很好参考价值的文章主要介绍了OI 数论中的上界估计与时间复杂度证明。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法 "按钮提交疑问。
预备
0.1 渐进符号
其实不少高等数学 / 数学分析教材在讲解无穷小的比较时已经相当严谨地介绍过大 O、小 O 记号,然而各种历史习惯记法的符号滥用(abuse of notation)[1] 直到现在都让笔者头疼. These notations seem to be innocent, but can be catastrophic without careful manipulation. For example,
Knuth 在《具体数学》里举出的例子[2] . “ ” 隐含的对称性使其在 中格格不入. 事实上,将 看作“阶不高于 的所有函数的集合”是比“某个阶不高于 的函数”更严谨的理解. 因此,本文将使用 (有时也记为 )的集合论符号代替传统的 记法.
或更一般的,
没看出有啥问题,对吧?笔者在写作此文时犯了同样的错误. 请注意,大 O 记号的作用对象是函数, 是什么?它只是个函数值,是确定的数——这是因为 也是求和枚举中确定的数,而不是 这种真正代表变元的记号. 所以 是什么?它什么也不是.
这种错误的出现是在所难免的,我们太习惯用 、 这种变元都不明确的记号来表示函数了[1] . 写成 也不严谨,因为只有 才应代表函数本身, 只能是函数值. 这样我们就可以放心地写下 ,不用担心把变元与确定值弄混了.
然而大家还是喜欢写 和 ,而不是奇怪的 和 . 所以,我们大概只能沿用这种不太严谨的记号,并时刻提醒自己加倍小心了. (形如 的 风格“匿名函数”记号可能更好?)
但上述命题从结论上是正确的. 正确的推导过程应为
第一步是直接由大 O 记号的定义得到的结果.
Wikipedia[3] 中有一张详尽的表格介绍了各种渐进符号的定义,OI Wiki[4] 上也有极好的讲解,尚不熟练的读者可以参考. 有兴趣仔细研究的读者可以参考《具体数学》第九章[2] 、Wikipedia 及其 reference(个人推荐 Knuth 关于 、 、 的短文[5] ). 本文除用 “ ” 和“ ”替代 “ ” 外,完全使用 Knuth 提议的记号体系.
0.2 调和数 H(n) / 调和级数
调和级数的部分和 定义为 通过一些与 有关的数列放缩可以证明 ,其中 是 Euler 常数. 因此 .
0.3 自然数等幂和 Pp(n) / p - 级数
- 级数可视为调和级数的推广. 其部分和定义为
- 级数具有如下性质:
当 时, - 级数收敛;
当 时, - 级数是调和级数;
当 时,我们指出
时 - 级数的渐进估计可以从连续幂函数积分的角度理解. 证明这渐进性,离散情况下,可对 差分后前缀和 + 二项式定理得到高次项系数,或可用离散微积分理论得到精确表示(参见《具体数学》[6] );连续情况下,Lagrange 中值定理应为较简单的估计方法. 这里从略. 总之,我们得到:
1 约数函数 σz(n)
约数函数(Divisor Function,也可称为除数函数、因数函数)是与 的因子有关的一类函数,定义如下:
当 时, 被称为约数个数函数(number-of-divisors function),常被记为 或 . 当 时, 被称为约数和函数(sum-of-divisors function),常直接记为 .
也就是估计 的因子的数量. 一个广为人知的上界是 ,因为 的所有小于 的因子 均与另一因子 一一对应.
事实上进一步可以证明 [7] ,虽然这在 OI 中并不实用.
即估计 到 中所有数因子个数的和. 这是一个形式上鲜为人知但其应用广为人知的例子. 变换求和顺序,容易得到
显然,这比 的平凡估计好上不少. 本例的思路不仅是埃氏筛(Sieve of Eratosthenes)的理论基础,也在杜教筛、快速 Mobius 变换、 卷积[8] 等处出现.
进一步利用此技巧和 - 级数的估计,我们甚至能在仔细研究 前就得到其前缀和的渐进估计:
遗憾的是,对此前缀和做差分并不能得到 的优秀估计.
现在引入一个重要放缩技巧,其在后续估计中屡试不爽.
显然,右式比左式多算了 的项,因此命题是正确的. 但我们还可以做得更好:
分治. 我们其实已经在 Example 1 估计 时用过此技巧了.
用 Proposition 1:
可以证明用 Proposition 2 不会得到更优的结果.
我们发现了一个有趣的事实: 和 的渐进上界均为 .
用 Proposition 2 和 - 级数的性质:
我们得到了一个相当优秀的渐进上界. 值得关注的是:
当 时, . 这与 Example 1 的结果一致.
当 时, ,即 . 洛谷 P4980 Polya 定理模板题[9] 的一种比较 trivial 的解法[10] 的时间复杂度证明就来源于此. 我们之后还会在整除分块与杜教筛中见到它.
另外,如果只使用 Proposition 1 , 部分的渐进上界将只能估计至 . 因此 Proposition 2 是更为优越的.
约数函数更复杂的上限与渐进估计可参考 Wikipedia[7] .
2 整除分块
也被称为数论分块. 求 我们按 分块求和: 可以证明,对一指定的 ,满足 的 取遍一连续区间,故若 的前缀和能 求出,块数量 即该算法的时间复杂度. 注意到当 时, 最多只有 种取值,而 时, 表明其也最多只有 种取值. 因此整除分块的时间复杂度
方便起见,后文记 .
2.1 整除分块嵌套
将 Proposition 2 加强,我们有如下通用放缩:
LHS 成立的关键在于 ;而 RHS 的本质就是上述对整除分块块数量上界的估计.
注意到 Proposition 2 是 Example 5 证明的核心,而 Proposition 3 是 Proposition 2 的加强版,故仿造 Example 5 的证明,我们有
Example 6 令 则前述 Example 5 中 的上界与渐进上界也同样适用于 .
现在可以对嵌套整除分块 的时间复杂度 做出估计了. 对 Example 6 取 ,立刻有
我们还可以进一步归纳. 假定 ,我们有
因此 . 边界条件 ,数列递推求得 ,检验满足条件. 因此 重嵌套整除分块的时间复杂度
3 杜教筛
杜教筛可以以低于线性的时间复杂度求解某些数论函数的前缀和. 其思路并不复杂. 设 为一数论函数,我们希望快速求得其前缀和 . 考虑数论函数 和 , 两端做前缀和得 因此
故若 、 的前缀和可 算得,根据上式整除分块即可递归地计算出 的前缀和.
下面分析算法的复杂度. 注意到 故单轮递归涉及到的自变量均可表示为 的形式. 一个 做整除分块耗时 ,若采用记忆化递归,由上节分析,算法总时间复杂度为
但我们还可以做得更好——考虑先用 的时间复杂度线性筛出前 个 并求前缀和,则递归求解时, 的 就无需再向下递归了. 为分析此类时间复杂度,对 Proposition 3 做最后一点扩展:
故用 Proposition 4 ,当 时,算法在递归部分的时间复杂度降低为
总时间复杂度
为最小化时间复杂度,取 ,得到最优时间复杂度 .
这部分的时间复杂度证明主要参考了文章[11] .
4 Challenge
Example 7 对 到 间的无平方因子数计数. .
参见蓝桥杯 2023 省赛 A 组 J 题《翻转硬币》[12] 或《完全平方数》[13] .
我们指出,无平方因子数有如下计数公式
朴素实现复杂度为 ,考虑对 开发一种新的整除分块算法. 现在问题有三. 一是估计 这并不困难,按 和 讨论即知其上界为 .
二是实现方案. 这里也直接给出:
ll sqrtN= sqrt( N);
ll ans= 0 ;
for ( ll l= 1 , r, d; l<= sqrtN; l= r+ 1 ){
d= N/( l* l), r= sqrt( N/ d);
ans+=( S_mu( r)- S_mu( l- 1 ))* d;
}
最后是算法时间复杂度分析. 普通的 整除分块不会因杜教筛增加时间复杂度,但 则需要额外的讨论. 注意到该整除分块枚举中,需做杜教筛的数的集合为 同样类似 Proposition 3 ,我们有
因此算法递归部分时间复杂度可估计为 总时间复杂度为 取 ,得到最优时间复杂度 . 代入 ,量级约为 .文章来源:https://www.toymoban.com/news/detail-417815.html
这估计并不算优秀. 传言存在 的估计,猜测大概优化了 和 的重叠部分。笔者尚未找出其推导方式.文章来源地址https://www.toymoban.com/news/detail-417815.html
References
1. Abuse of notation - wikipedia . (n.d.). https://en.wikipedia.org/wiki/Abuse_of_notation#Function_notation.
2. Graham, R. L., Knuth, D. E., & Patashnik, O. (1994). Concrete mathematics: A foundation for computer science (second, pp. 443–449). Addison-Wesley.
3. Big o notation - wikipedia # family of bachmann–landau notations . (n.d.). https://en.wikipedia.org/wiki/Big_O_notation#Family_of_Bachmann%E2%80%93Landau_notations.
4. 复杂度 - OI wiki . (n.d.). https://oi-wiki.org/basic/complexity/#%E6%B8%90%E8%BF%9B%E7%AC%A6%E5%8F%B7%E7%9A%84%E5%AE%9A%E4%B9%89.
5. Knuth, D. E. (1976). Big omicron and big omega and big theta. SIGACT News , 8 (2), 18–24. https://doi.org/10.1145/1008328.1008329
6. Graham, R. L., Knuth, D. E., & Patashnik, O. (1994). Concrete mathematics: A foundation for computer science (second, pp. 47–56). Addison-Wesley.
7. Divisor function - wikipedia # growth_rate . (n.d.). https://en.wikipedia.org/wiki/Divisor_function#Growth_rate.
8. sun123zxy. (2020). sun123zxy’s blog - 原创OI题目 GCD卷积 problem and solution . https://blog.sun123zxy.top/posts/20201206-gcdconv/.
9. P4980 【模板】pólya 定理 - 洛谷 | 计算机科学教育新生态 . (n.d.). https://www.luogu.com.cn/problem/P4980.
10. sun123zxy. (2020). sun123zxy’s blog - 等价类计数:Burnside引理 & Polya定理 . http://blog.sun123zxy.top/posts/20200321-burnside/#s-4.3.
11. Ander. (2022). 杜教筛 . https://zhuanlan.zhihu.com/p/521699400.
12. P9238 [蓝桥杯 2023 省 a] 翻转硬币 - 洛谷 | 计算机科学教育新生态 . (n.d.). https://www.luogu.com.cn/problem/P9238.
13. P4318 完全平方数 - 洛谷 | 计算机科学教育新生态 . (n.d.). https://www.luogu.com.cn/problem/P4318.
到了这里,关于OI 数论中的上界估计与时间复杂度证明的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报 进行投诉反馈,一经查实,立即删除!