[学习笔记] 多项式多点求值与快速插值
不写代码。
多项式多点求值
给定一个 \(n\) 次多项式 \(f(x)\) ,对于 \(i \in [1,m]\) 求出 \(f(a_i)\) 。
做法
考虑分治,设 \(L(x) = \prod_{i=1}^{\frac{n}{2}} (x - x_i)\),\(R(x) = \prod_{i = \frac{n}{2} + 1}^n (x - x_i)\),那么对于 \(i \in [1,\frac{n}{2}]\),\(F(x_i) = (F \ \mathrm{mod} \ L)(x_i)\),对于 \(i \in ( \frac{n}{2}+1, n ]\),\(F(x_i) = (F \ \mathrm{mod} \ R)(x_i)\)。多项式取模即可,每次的 \(L(x)\) 和 \(R(x)\) 可以分治 NTT 预处理。时间复杂度 \(O(n \log ^2n)\)。
多项式快速插值
给出 \(n\) 个点 \((x_i, y_i)\),求一个 \(n-1\) 次的多项式 \(f(x)\),使得 \(f(x_i)\equiv y_i\pmod{998244353}\)。
做法
考虑拉格朗日插值:
分母是一个常数,设 \(p(x) = \prod_{i=1}^n (x - x_i)\),那么对于每个 \(i\),分母相当于 \(\frac{p(x)}{x - x_i}\) 代入 \(x = x_i\) 后的值,但这是未定义的。不过根据洛必达法则,它的值即为 \(p'(x_i)\),于是我们可以先用分治 NTT 算 \(p(x)\),求导算出 \(p'(x)\),然后多点求值求出每个 \(i\) 对应分母的值。
于是 \(F(x) = \sum_{i=1}^n \prod_{j \neq i} (x - x_j) \frac{y_i}{p'(x_i)}\),分治处理:设 \(L(x) = \prod_{i=1}^{\frac{n}{2}} (x - x_i)\),\(R(x) = \prod_{i = \frac{n}{2} + 1}^n (x - x_i)\),于是
递归计算即可,每次的 \(L(x)\) 和 \(R(x)\) 可以分治 NTT 预处理。时间复杂度 \(O(n \log ^2n)\)。