多项式全家桶
多项式求逆
假设我们要求 \(G(x) = \frac{1}{F(x)}\)
考虑倍增,设求出 \(H(x) \equiv \frac{1}{F(x)} \pmod {x^{\frac{n}{2}}}\)
多项式开根
假设我们要求 \(G(x) = \sqrt{F(x)}\)
考虑倍增,设求出 \(H(x) \equiv \sqrt{F(x)} \pmod {x^{\frac{n}{2}}}\)
MTT
拆系数,让 \(G\) 为我们拆系数所用的阈值, \(F_{0_i} = F(x) \bmod G\),\(F_{1_i} = \lfloor\frac{F(x)}{G}\rfloor\)。
那么我们求 \(F(x) \times H(x)\),那么就是求 \((F_0(x) + G \times F_1(x)) (H_0(x) + G \times H_1(x)) = F_0(x) H_0(x) + G (F_0(x) H_1(x) + F_1(x) H_0(x)) + G^2 F_1(x) H_1(x)\) 。
那么我们就是要算 \(A(x) = F_0(x) H_0(x)\),\(B(x) = F_0(x) H_1(x) + F_1(x) H_0(x)\),\(C(x) = F_1(x) H_1(x)\),这个 \(FFT\) 算就好了。
多项式对数函数
答案是 \(\int ( \frac{F'(x)}{F(x)} )\)
泰勒展开
\(f(x)\) 在 \(x_0\) 处泰勒展开:\(\sum\limits_{i = 0} \frac{F^i (x_0)}{i!} (x - x_0) ^ i\)
可以理解为无限逼近。让 \(k\) 阶导数都相同,那么多项式相同。
多项式牛顿迭代
给定一个函数 \(g\)。
已知\(g(f(x)) \equiv 0 \pmod {x^{n}}\), 求 \(f\)。
倍增。设已经得到了 \(x ^ {\frac{n}{2}}\) 的解 \(f_0(x)\)。
\(g(f(x))\) 在 \(f_0(x)\) 处泰勒展开。
由于 \(f(x) - f_0(x) \equiv 0 \pmod x^{\frac{n}{2}}\)
那么 \(\sum\limits_{i = 0}^{+ \infty} \frac{g^i ( f_0(x) )}{i!} (f(x) - f_0(x))^i \equiv g(f_0(x)) + g'(f_0(x)) (f(x) - f_0(x)) \pmod {x^n}\)
多项式exp
要对 \(h(x)\) 求 \(\exp\)。
令 \(g(f(x)) = \ln(f(x)) - h(x)\)
如果我们已经求得了 \(f_0(x) = \exp(h(x)) \pmod {x^{\frac{n}{2}}}\)
多项式除法
定义 \(F_R(x)\) 为把 \(F(x)\) 系数翻转后的函数
若 \(F_R(x)\) 系数为 \(k\) ,那么 \(F_R(x)=F(\frac{1}{x})*x^k\)
若 \(f(x)=g(x)*q(x)+r(x)\), \(f\) 次数为 \(n\) ,\(g\) 次数为 \(m\), \(q\) 次数为 \(n-m\) , \(r\) 次数 \(\le m-1\)
我们可以把 \(\frac{1}{x}\) 带入函数
得
从而我们可以知道 \(q(n) \bmod x^{n-m+1}\)
我们知道 \(q\) 次数为 \(n-m\) ,而模数次数为 \(n-m+1\),因此我们就算出了 \(q\) 。
算 \(r\) 可以用
多项式多点求值
假设我们要对 \(x_1, x_2 ... x_n\) 进行多点求值,给定的多项式是 \(F(x)\) (\(n-1\) 次多项式)。
让 \(mid = \frac{n}{2}\)。
考虑分治,如何算 \(x_1, x_2 ... x_{mid}\) 的多项式?
让 \(G(x) = (x - x_1) (x - x_2) ... (x - x_{mid})\) 。
那么我们可以让 \(F(x) = G(x) Q(x) + R(x)\)。发现 \(x_1, x_2 ... x_{mid}\) 对 \(F(x)\) 多点求值,而在 \(G(x) Q(x)\) 处对这些点没有贡献。
(因为有 \((x - x_i)\) 的因式)
因此问题就相当于对 \(R(x)\) 多点求值,而 \(R(x)\) 的次数是原来的一半。对 \(x_{mid + 1}, x_{mid + 2} ... x_{n}\) 做是同理。
时间复杂度是 \(T(n) = 2T(\frac{n}{2}) + n \log n\),即 \(\Theta(n \log ^2 n)\) 。
多项式快速插值
考虑拉格朗日插值:\(\sum\limits_{i = 1}^{n} \frac{\prod_{j \neq i} (x - x_j)}{\prod_{j \neq i} (x_i - x_j)} y_i\) 。
让 \(d_i = y_i \prod\limits_{j \neq i} (x_i - x_j)\) 。
如果我们算出了 \(d_i\),那么答案就是 \(\sum\limits_{i = 1}^{n} \prod_{j \neq i} (x - x_j) d_i\) ,很容易分治 + \(NTT\) 算。
这个 \(\prod\limits_{j \neq i} (x_i - x_j)\) 很恶心,主要原因是这个 \(j \neq i\) 。
考虑我们计算 \(\lim\limits_{x \to x_i}\frac{\prod\limits_{j \neq i} (x - x_j)}{x - x_i}\)
让 \(f(x) = \prod\limits_{j \neq i} (x - x_j)\)。而且我们知道 \(f(x_i) = 0\),于是要求的变成:
这显然是 \(f(x_i)\) 的导数。求处 \(f(x)'\) 然后快速插值即可。
时间复杂度也是 \(\Theta(n \log^2 n)\)