はじめに
こんにちは。 22B の noya2 です。
私の誕生日である 6/28 に開催した yukicoder contest 435 の G 問題 で次のような出題をしました:
を求めよ( は の 回合成 )
以下、多項式や形式的冪級数(FPS)は として 上で考えるものとします。
最近のことですが、 次多項式 に対して、合成 の計算が 時間で計算できることが発明されました[1]。このアルゴリズムと繰り返し二乗法をあわせれば、 を 時間で計算できるということになります。本記事は 時間で計算する方法を提示します。また、中身が に限らない場合の拡張を示します。
重要になるのは次の等式です。ここで は関数の合成で、 です。
両辺はいずれも に等しいです。このように合成冪は右合成と左合成を考えることによって非自明な式が得られることがあります。低次多項式の通常の冪 は、両辺を微分して非自明な式 を得ていたことを思い出してください[2]。これを の微分方程式とみなし、適切な初期条件をもとに の係数を低次から順に計算できたのでした。計算量が に依存しないという特徴もありました。これを踏まえて、同様に計算できないかを考えましょう。
について を と書きます。 とおけば、上の式は
と書くことができます。両辺の の項の係数を比較すると
となります。ここで に注意すると、 は相殺し、次のようになります。 としておきます。
よって、 のとき
に従って の係数を低次から順に計算できます。 が から定まっていることに注意してください。
愚直な実装では の計算に 時間かかることになりますが、もともと の係数比較をしていたことを思い出しましょう。誤解を恐れず言えば、結局のところ の計算がオンラインでできればよいということになります。問題設定を明確にしましょう。
の多項式 が で初期化されている。 個のクエリをオンラインで処理せよ。 回目のクエリでは が与えられる。 に を加算し、 を求めよ。
ではなく を求めるという点で、通常の relaxed-convolution などとは設定が少し異なることに注意してください。先ほどの議論では、 から定まる を比較して を得ていたのでした。つまり、 項先の暫定的な結果を計算しておく必要があったのです。
これを踏まえて、次のような再帰関数 を設計します。 とします。
- を確定させる
- から定まる の を計算する
- を返す
よくある分割統治FFTなどの実装と異なり、右端の項 を求めない定義になっています。
の動作は次のとおりです。
- のときなにもせず、 を返す。
- とし、 とする。
- から への寄与と から への寄与を計算する。
- として を求める。
- から への寄与と から への寄与を計算する。
- とする。 を返す。
3.を終えた時点で から定まる が計算されていることに注目してください。また、4. で の場合は の結果を使います。
分割統治を行う際の統治部分では、 の寄与を へ送りますが、今回の場合は
- の寄与を先に送っておく
- その結果から を計算する
- の寄与を追加で送る
という挙動をすることになります。
を呼べば が求められます。 の統治処理は 時間で行えるので、あわせて 時間の計算量で求めることができます。
ここからは、いくつかの拡張(一般化)を見ていきます。
アフィン変換の合成もまたアフィン変換です。行列累乗などで 時間で計算できます。
次以上の非零項が存在し、さらに定数項が非零である場合、上述と同様の手法は通用しません。 とおいて の の項の係数に注目すると、左辺は
ですが、これは に依存しています。
そもそも、定数項が非零である多項式やFPSをFPSの中に入れるような合成は、通常は定義できません(すべての項が収束しない)。オンライン合成の文脈でも、項が追加されるたびに、それまで計算した項がすべて更新されることになってしまいます。以下、定数項は であるとして進めます。
となるため、 としてよく、素直な繰り返し二乗法で 時間で計算できます。
例によって とおき、次の方程式を考えます。
この式の を取ると
となります。 に注意すると のとき
と定まります。両辺の から が定まっているため、より単純なオンライン畳み込み、中身が低次多項式のオンライン合成によって、 時間で計算できます。 が入力で与えられる場合は の位数に注意が必要ですが、自然な文脈で出てくる場合は 以外に注意するものはないかもしれません。
多項式が多少高次になる場合でも、 次の係数 が位数の条件を満たせば、同様の手法で計算できます。
です。同様の考察によって、今度は は相殺しますが、 について
を得ます。 のケースをはじめに扱っていたのでした。一般の でも実装はほとんど変わらないでしょう。計算量は変わらず 時間です。
多項式が多少高次になる場合でも、 次の係数が非零である場合は、同様の手法で計算できます。
そろそろ険しくなってきました。
です。同様の考察によって、今度は は相殺しますが、 について
を得ます。より複雑になりますが、 つ先の結果まで計算する分割統治によって実装できると思います。
多項式が多少高次になる場合で、しかも 次の係数が であって 次の係数が である場合でも、 次の係数が非零であれば、なんとかなるというわけです。
例によって とおきますが、上と同様の方法では位数の条件から上手くいきません。そこで 回合成との右合成および左合成を考えましょう。つまり
です。すぐ上に挙げたケース(高次になる場合)に帰着しました。
なお、一般に、 次の係数を としたとき、 となって 次の係数は になるため、 のケースに帰着させることはできません。
一般に、常にではないが漸化式の分母が になるケースです。この場合に対処する方法はわかりませんでした。また、実装が複雑になるくらいなら、そもそも 倍程度の時間をかけて素朴に合成と繰り返し二乗法を使った方が高速なのではないか、とすら思います。情報お待ちしております。
おわり
場合分けが大変になってしまいました。しかも結局のところ すら部分的にしか解けませんでした。残したケースは のケースです。
部分問題として登場した、少し先の項を求めるオンライン畳み込み・低次多項式のオンライン合成は、目新しくて気に入っています。
実は、想定解の実装は、出題時に tester をしてくださった potato167 さんに全てを担当していただきました。本当にありがとうございます。
noshi91 さんによる資料 : https://arxiv.org/abs/2404.05177, https://noshi91.hatenablog.com/entry/2024/03/16/224034 ↩︎
maspy さんによる資料 : https://maspypy.com/多項式・形式的べき級数-高速に計算できるもの#toc45 ↩︎