Berlekamp–Massey(線形漸化式の推定)

有限列のprefixから、そのprefixを生成する最短の線形漸化式を求めます。

API

proc berlekampMassey*[T](
    sequence: openArray[T],
): seq[T]

返り値を coefficient とすると、十分後ろの各項について

sequence[n] =
  coefficient[0] * sequence[n - 1] +
  coefficient[1] * sequence[n - 2] +
  ...

が成り立ちます。

係数は「直前の項から順」に並びます。たとえばFibonacci数列では @[1, 1]を返します。

使用例

import atcoder/modintimport atcoder/extra/math/berlekamp_masseytype mint = modint998244353let sequence =  @[    mint.init(0),    mint.init(1),    mint.init(1),    mint.init(2),    mint.init(3),    mint.init(5),    mint.init(8),  ]let coefficient =  berlekampMassey(sequence)doAssert coefficient == @[  mint.init(1),  mint.init(1),]

代数的要件

Tは体のように振る舞い、次の演算を備える必要があります。

通常は素数modのmodintを使用します。

端のケース

計算量

列の長さを n とすると、

です。

Kitamasaとの関係

berlekampMasseyは列から漸化式を推定します。 既知の漸化式から第k項を求める場合はkitamasaを使用できます。