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

sqrt

関数 · 形式的冪級数 (FPS)

// (1)
template <internal::static_modint_c mint>
std::vector<mint> sqrt(const std::vector<mint> &h, int deg);

// (2)
template <internal::static_modint_c mint>
std::vector<mint> sqrt(const std::vector<mint> &h);

概要

(1) 平方根 $\sqrt h \pmod{x^{deg}}$

$g^2 \equiv h \pmod{x^{deg}}$ を満たす $g$ を求める。最低次の項 $c x^k$ を括り出し、 $k$ が偶数かつ $c$ が平方剰余のとき $g = x^{k/2} \sqrt{h / x^k}$ をニュートン法で求める。 ニュートン法は $g = \sqrt{\cdot}$ と $g^{-1}$ を併走させ各段で DFT を使い回す (full inverse の再計算を避ける)。条件を満たせば Montgomery + AVX2 NTT 実装へ振り分ける。 $k$ が奇数、または $c$ が平方非剰余で解が存在しない場合は空列を返す。

(2) 平方根 $\sqrt h$(deg は h.size())

関連項目