多项式乘法逆 10E

2023 年 1 月 24 日

目录

多项式乘法逆 10E

#ifndef ALGO_MATH_POLY_INV10ENT
#define ALGO_MATH_POLY_INV10ENT

#include "poly-def.hpp"

template <class ModT>
auto poly_inv_10E(std::span<const ModT> f, u32 m) {
  u32 n = std::bit_ceil(m);
  AVec<ModT> x(n);
  x[0] = f[0].inv();
  for (u32 t = 1; t < n; t *= 2) {
    AVec<ModT> f2(t * 2), nx(t * 2);
    std::copy(f.begin(), std::min(f.begin() + t * 2, f.end()), f2.begin());
    std::copy_n(x.begin(), t * 2, nx.begin());
    ntt<ModT>(f2); // 2E
    ntt<ModT>(nx); // 2E
    dot<ModT>(f2, nx);
    intt<ModT>(f2); // 2E
    std::fill_n(f2.begin(), t, 0);
    ntt<ModT>(f2); // 2E
    dot<ModT>(f2, nx);
    intt<ModT>(f2); // 2E
    vectorization_2<ModT, true>(t, x.data() + t, f2.data() + t, []<class T>(T &xi, T f2) {
      xi = -f2;
    });
  }
  return x.resize(m), x;
}

#endif // ALGO_MATH_POLY_INV10ENT