Dirichlet 級数と Dirichlet 積
モノイド
に置き換えることで、
を、分配法則を満たすように拡張することで積を定義します。 が十分大きな複素数 の代入を考える場合もありますが、今回は収束などの細かいことは無視しましょう- 「
」の符号は、歴史的な背景によりこうなっていますが、この記事では大事ではありません。式を書くのが手間であれば、全て「 」にしてしまっても不都合は生じないでしょう。
また、無限数列を使って定式化をしますが、そのうち
Dirichlet 積の計算量
c = [0] * (N+1)
for i in range(1, N+1):
for j in range(1, N//i+1):
c[i*j] += a[i] * b[j]
乗法的 Dirichlet 級数の場合
Dirichlet 級数の言葉で書けば、級数が Euler 積分解
時間での計算
for p in primes:
D_{a,p}(s) = sum a(p^k) p^{-ks} (p-part of D_a)
D_b(s) ← D_b(s) D_{a,p}(s)
といった計算をしていけばよいです。
c = b
for p in primes:
for i in range(N//p, 0, -1):
n = p * i
# n = (p^k) * m となるとき、c[n] ← c[n] + a[p^k] * c[m] として更新
q, m = p, i
while True:
c[n] += a[q] * c[m]
if m % p != 0:
break
q, m = q * p, m // p
in-place に更新するため、更新順に注意しましょう。大きい番号から更新することで、後の計算に必要な部分が先に上書きされてしまうことを避けています。計算量は、
時間での計算
- 素数べき
に対して、 を愚直に( 時間で)計算する。 の順に、それが素数べきでないならば、 として により を求める。
前計算として、各
Dirichlet 積と累積和
数論関数
まず、次を確認しましょう。
【命題 1】
を固定します。 なので、この部分は と計算できます。 であるとき、 である必要があります。 を固定したとき、 の範囲は なので、 が固定した の寄与になります。
これらを足し合わせることで、
【命題 2】
となる に対する となる に対する ,
このとき、
計算方法は全く同じです。さらに同じようにすると、次も分かります。
【命題 3】
となる に対する となる に対する ,
このとき、次のものすべてが、合計
となる に対する となる に対する
計算する前後でデータの持ち方をそろえることで、同様の計算の反復に備えています。アルゴリズムはほとんど変わりません。
計算量を確認しましょう。
の計算に、 時間- 各
の計算に、 ごとに 時間
となりますが、
【命題 4】
となる に対する となる に対する ,
このとき、次のものすべてが、合計
となる に対する となる に対する
特に
また、この時間計算量は、以下の条件のように削減可能である。
のうち一方が乗法的であれば、 時間 の両方が乗法的であれば、 時間
アルゴリズムは同様で、
を、 時間で計算する。 および を 時間で計算する。- 各
に対して、 を、 ごとに 時間で計算する(【命題 2】)。 に対する合計時間は 時間である。
となって、
また
除算の計算
同じ議論をうまく遡ることで、次の操作も行えることが分かります。
【命題 5】
となる に対する となる に対する ,
このとき、次のものすべてが、合計
となる に対する となる に対する
特に
また、この時間計算量は、以下の条件のように削減可能である。
のうち一方が乗法的であれば、 時間 の両方が乗法的であれば、 時間
【命題 4】の類似ですね。【命題 1】で出てきた式変形などを使って、小さな
詳しい実装は紹介しませんが、後述の関連問題を解きながら細部を考えてみてください。
【命題2】の類似は成り立ちません。つまり、
具体例
代表的な Dirichlet 級数として、
約数関数の累積和
この例は、結局のところ
Möbius 関数の累積和(Mertens 関数)
Möbius 関数
【命題 5】を用いることで、Mertens 関数
Euler 関数の累積和
Euler 関数
なお、このことは、
無平方数 (square-free number) の数え上げ
における
疎な変形
少し難しい例も扱っておきましょう。例えば、
(ただし )とおく が成り立つ
ことが分かります。
(ただし ) (ただし )
とすると、
したがって、そのすべての項の計算や、累積和の計算は容易に行うことができ、
「疎な変形」としては、このように少数の素数部分の変形や、あるいはどの
関連問題
Project Euler は、コンテンツの性質上さらなるヒントや解答コードの提示はできませんので、ご了承ください。
- https://projecteuler.net/problem=193
- https://projecteuler.net/problem=351 この手法について公式解説PDF がある問題。
- https://projecteuler.net/problem=401
- https://projecteuler.net/problem=432
- https://projecteuler.net/problem=448
- https://projecteuler.net/problem=484
- https://projecteuler.net/problem=530
- https://projecteuler.net/problem=556
- https://projecteuler.net/problem=625
- https://projecteuler.net/problem=643
- https://projecteuler.net/problem=715
問題例:Multiple Sequences (ARC 116 [C])
本記事を執筆する直接的なきっかけとなった問題です。

記号を適宜取り換えて、
自然数の組
解法 1: 時間解法
Dirichlet 級数について、必要な情報を【命題 4】の形で管理することにします。
これを
- 解答例:https://atcoder.jp/contests/arc116/submissions/21380847
時間での実装
- 解答例:https://atcoder.jp/contests/arc116/submissions/21380909
時間での実装
AtCoder コードテスト環境で、

解法 2: 時間解法
ここで、
二項定理で展開することで、
解答例:https://atcoder.jp/contests/arc116/submissions/21380945 (

- 繰り返し二乗法の乗算回数
回よりも、この解法の乗算回数 回の方が、定数倍が小さい - こちらの解法は、乗算の対象が常に
であるため、それを陽に配列として持つ必要がない
といった性質が挙げられます。
参考文献
- wikipedia:Dirichlet convolution
- Min_25 さん:Sum of Multiplicative Function
- Min_25 さん:格子点の数え上げの高速化 (別手法、すごい)
- hos-lyric さん:Xmas Contest 2019 D: Sum of (-1)^f(n) 解説
- 37zigen さん(yukicoder wiki):トーティエント関数の和
- Nisiyama_Suzune さん(codeforces blog):[Tutorial] Math note — Dirichlet convolution
- 私の過去記事:[数学] 畳み込み入門:Dirichlet積とゼータ変換・メビウス変換