Polynomial Interpolation(多項式補間)

相異なる点 (xs[i], ys[i]) をすべて通る、次数が xs.len 未満の 一意な多項式を構成します。

一般形

let coefficients =
  polynomialInterpolation(
    xs,
    ys,
  )

引数

典型的な係数型は modint998244353 です。

前提条件

空列を2個渡した場合は空の多項式を返します。

返り値

返り値はFormalPowerSeries[T]です。

coefficients[i]

は (x^i) の係数を表します。係数は次数の昇順です。

n = xs.lenのとき、返り値の長さは常にnです。最高次係数が0でも 末尾の0を保持します。

具体例

(f(x)=3+2x+5x^2)を3点から復元します。

import atcoder/modint
import atcoder/extra/math/polynomial_interpolation

type mint = modint998244353

let
  xs = @[
    mint.init(0),
    mint.init(1),
    mint.init(2),
  ]

  ys = @[
    mint.init(3),
    mint.init(10),
    mint.init(27),
  ]

  coefficients =
    polynomialInterpolation(
      xs,
      ys,
    )

doAssert coefficients == @[
  mint.init(3),
  mint.init(2),
  mint.init(5),
]

関連API

多項式そのものが必要な場合はpolynomialInterpolationを使います。 1点での値だけが必要で、x座標が連続整数ならlagrange_polynomialが簡潔です。

計算量

n = xs.len、多項式乗算の計算量をM(n)とすると、

NTTを使用する場合、時間計算量はO(n log^2 n)です。