多项式乘法逆 12E
2023 年 1 月 24 日
目录
多项式乘法逆 12E
#ifndef ALGO_MATH_POLY_INV12ENT
#define ALGO_MATH_POLY_INV12ENT
#include "poly-def.hpp"
template <class ModT>
auto poly_inv_12E(std::span<const ModT> f, u32 m) {
u32 n = std::bit_ceil(m);
AVec<ModT> x(n * 2);
x[0] = f[0].inv();
for (u32 t = 1; t < n; t *= 2) {
std::span xt{x.begin(), x.begin() + t * 4};
AVec<ModT> u(t * 4);
std::copy(f.begin(), std::min(f.begin() + t * 2, f.end()), u.begin());
ntt<ModT>(u); // 4E
ntt<ModT>(xt); // 4E
for (u32 i = 0; i < t * 4; ++i) {
x[i] = (ModT(2) + -u[i] * x[i]) * x[i];
}
intt<ModT>(xt); // 4E
std::fill_n(x.begin() + t * 2, t * 2, 0);
}
return x.resize(m), x;
}
#endif // ALGO_MATH_POLY_INV12ENT