Luzhiled's Library

This documentation is automatically generated by online-judge-tools/verification-helper

View the Project on GitHub ei1333/library

:heavy_check_mark: Berlekamp Massey (math/fps/berlekamp-massey.hpp)

Verified with

Code

/**
 * @brief Berlekamp Massey
 */
template< template< typename > class FPS, typename Mint >
FPS< Mint > berlekamp_massey(const FPS< Mint > &s) {
  const int N = (int) s.size();
  FPS< Mint > b = {Mint(-1)}, c = {Mint(-1)};
  Mint y = Mint(1);
  for(int ed = 1; ed <= N; ed++) {
    int l = int(c.size()), m = int(b.size());
    Mint x = 0;
    for(int i = 0; i < l; i++) x += c[i] * s[ed - l + i];
    b.emplace_back(0);
    m++;
    if(x == Mint(0)) continue;
    Mint freq = x / y;
    if(l < m) {
      auto tmp = c;
      c.insert(begin(c), m - l, Mint(0));
      for(int i = 0; i < m; i++) c[m - 1 - i] -= freq * b[m - 1 - i];
      b = tmp;
      y = x;
    } else {
      for(int i = 0; i < m; i++) c[l - 1 - i] -= freq * b[m - 1 - i];
    }
  }
  return c;
}
#line 1 "math/fps/berlekamp-massey.hpp"
/**
 * @brief Berlekamp Massey
 */
template< template< typename > class FPS, typename Mint >
FPS< Mint > berlekamp_massey(const FPS< Mint > &s) {
  const int N = (int) s.size();
  FPS< Mint > b = {Mint(-1)}, c = {Mint(-1)};
  Mint y = Mint(1);
  for(int ed = 1; ed <= N; ed++) {
    int l = int(c.size()), m = int(b.size());
    Mint x = 0;
    for(int i = 0; i < l; i++) x += c[i] * s[ed - l + i];
    b.emplace_back(0);
    m++;
    if(x == Mint(0)) continue;
    Mint freq = x / y;
    if(l < m) {
      auto tmp = c;
      c.insert(begin(c), m - l, Mint(0));
      for(int i = 0; i < m; i++) c[m - 1 - i] -= freq * b[m - 1 - i];
      b = tmp;
      y = x;
    } else {
      for(int i = 0; i < m; i++) c[l - 1 - i] -= freq * b[m - 1 - i];
    }
  }
  return c;
}
Back to top page