algo — C++23 日本語リファレンス GitHub

convolution_mod

関数 · FFT・実数畳み込み

template <std::integral T>
std::vector<T> convolution_mod(const std::vector<T> &a, const std::vector<T> &b, T mod);

概要

任意 mod 畳み込み(実数 FFT を 15bit 分割で 3 回適用)

係数を上位 15bit / 下位 15bit に分けて $a = a_1 \cdot 2^{15} + a_0$ とし、 $a_1 b_1$、$a_0 b_0$、$(a_1 + a_0)(b_1 + b_0)$ の 3 回の畳み込みから復元する。 double の精度の範囲($\mathrm{mod}^2 \times$ 長さ が約 $2^{53}$ 以下)で正しい。

テンプレートパラメータ

名前 説明
T 整数型

パラメータ

名前 説明
a 入力多項式の係数列($[0, \mathrm{mod})$ を想定)
b 入力多項式の係数列 ([0, mod) を想定)
mod 出力を取る法 (NTT-friendly でなくてよい)

戻り値

std::vector<T> a と b の畳み込みを mod で取った値 (長さ a.size() + b.size() - 1)

計算量

関連項目