預備
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 關於
0.2 調和數 / 調和級數
調和級數的部分和
0.3 自然數等冪和 / - 級數
當
時, - 級數收斂;當
時, - 級數是調和級數;當
時,我們指出
1 約數函式
約數函式(Divisor Function,也可稱為除數函式、因數函式)是與
Definition 1 (約數函式)
當
Example 1 估計
也就是估計
事實上進一步可以證明
Example 2 估計
即估計
顯然,這比
進一步利用此技巧和
Example 3 估計
遺憾的是,對此字首和做差分並不能得到
現在引入一個重要放縮技巧,其在後續估計中屢試不爽.
Proposition 1
顯然,右式比左式多算了
Proposition 2
Example 4 估計
可以證明用 Proposition 2 不會得到更優的結果.
我們發現了一個有趣的事實:
Example 5 估計
用 Proposition 2 和
我們得到了一個相當優秀的漸進上界. 值得關注的是:
- 當
時, . 這與 Example 1 的結果一致. - 當
時, ,即 . 洛谷 P4980 Polya 定理模板題[9] 的一種比較 trivial 的解法[10] 的時間複雜度證明就來源於此. 我們之後還會在整除分塊與杜教篩中見到它.
另外,如果只使用 Proposition 1 ,
約數函式更復雜的上限與漸進估計可參考 Wikipedia[7].
2 整除分塊
也被稱為數論分塊. 求
方便起見,後文記
2.1 整除分塊巢狀
將 Proposition 2 加強,我們有如下通用放縮:
Proposition 3
LHS 成立的關鍵在於
注意到 Proposition 2 是 Example 5 證明的核心,而 Proposition 3 是 Proposition 2 的加強版,故仿造 Example 5 的證明,我們有
Example 6 令
現在可以對巢狀整除分塊
我們還可以進一步歸納. 假定
因此
3 杜教篩
杜教篩可以以低於線性的時間複雜度求解某些數論函式的字首和. 其思路並不複雜. 設
故若
下面分析演算法的複雜度. 注意到
但我們還可以做得更好——考慮先用
Proposition 4
特別的,當
故用 Proposition 4 ,當
總時間複雜度為
為最小化時間複雜度,取
這部分的時間複雜度證明主要參考了文章[11].