初めに
この記事ではあくまでも時間計算量のオーダーのみを考慮しているため、定数倍についての保証はありません。
relaxed convolutionとは
で多項式の積を計算するオンラインアルゴリズムです。Online FFTと呼ばれる事もありますが、Relaxed Convolutionの方が使われていそうだったのでこちらで統一します。
このアルゴリズムを使うことで形式的べき級数の
/
/
等も出来ます。
relaxed convolution のやり方
Kiriさんのわかりやすい解説があったのでここでは割愛させて下さい qiita.com
積分のやり方
の
項目は、
の
項目に
をかけた物なので、一つ前の項を保存しておけば出来ます。
exp(f) のやり方
\begin{align} g=\exp(f) \end{align} とおくと、
\begin{align}
gf'&=&f'\exp(f)\\
\int gf' dx &=&\exp(f)\\
&=&g
\end{align}
より、 の
項目までと、
の
項目までをrelaxed convolutionにて掛け合わせる事で出来ます。
verify : https://judge.yosupo.jp/submission/119568
relaxed convolution を高々定数項だけずらす拡張
の
項目まで、
の
項目までをかけ合わせたものの
項目までを手に入れることが出来ます。
(
)、
(
) とおくと、
\begin{align} fg=f_0g_0+(f_1g_0+f_0g_1)x^t+f_1g_1x^{2t} \end{align}
と
に関しては高々定数項しかないため前半3項は愚直に計算しても計算量はボトルネックとなり得ません。
また、
の場合、
の
項目は
の
項目であることから、
と
をrelaxed convolutionで掛け合わせる事で
の
項目まで手に入り、
これにより
の
項目までを手に入れる事が出来ました。
これは Kiriさんのブログの図の左上の
のマスを増やしたと考えると直感的に理解出来るかと思います。
また、fとgの項数が高々定数個ずれる場合、小さい方に合わせてあげれば良いです。
inv のやり方
とおくと、
であることから、
\begin{align}
[x^N] fg = [x^N] (f \mod x^{N-1}) \times (g \mod x^{N-1}) + [x^0]f \times [x^N]g + [x^N]f \times [x^0]g
\end{align}
を前章の拡張を用いて計算する事で
の
項目を求める事が出来ます。
verify : https://judge.yosupo.jp/submission/119569
log のやり方
とおくと、
であることから前章までの内容を用いて計算することが出来ます。
(23/01/08/9:53 追記)
とおくと
となり、これはinvとほぼ同様に処理出来るので一回のrelaxed convolutionで行う事も出来ます。
verify : https://judge.yosupo.jp/submission/119575
sqrt のやり方
の初項を非零に限定すると、
とおくと、
であることから inv の章と同様に一つだけ項数をずらすことで出来ます。
初項が零の時はそもそも
項目までの情報から
項目までに非零が存在するかを知り得ないので定義から難しそうです。
(そもそも形式的冪級数のsqrtは定数項1を前提とするのが一般的という話もあります)
verify : TODO
pow のやり方
を使えば出来ます。
例の如く
の適用条件等に注意する必要があります。
verify : TODO