[学习笔记] 多项式拉格朗日反演与复合逆
不会多项式。
多项式复合函数
讲复合逆之前,先讲讲复合函数。这个问题是说,给定一个 \(n\) 次多项式 \(F(x)\),和一个 \(m\) 次多项式 \(G(x)\),你需要求一个 \(n\) 次多项式 \(H(x)\) ,满足条件:
换种说法,你要求的多项式应满足:
做法
令 \(B = \sqrt{n}\)。类似 BSGS:
预处理出所有 \(G(x)^j\) 及 \(G(x)^{iB}\),这部分用 NTT 计算。然后对于 \(\sum_{j=0}^{B-1} [x^{iB+j}] F(x)G(x)^j\) 我们暴力计算,最后乘上 \(G(x)^{iB}\) 即可。总时间复杂度 \(O(n^2 + n \sqrt{n} \log n)\)。
拉格朗日反演
现在我们讲讲复合逆。拉格朗日反演可以在 \(O(n \log n)\) 的时间求 \([x^n]G(x)\),其中 \(G(x)\) 满足 \(F(G(x)) = x\),\(F(x)\) 是已知的多项式,并且 \([x^0] F(x) = [x^0] G(x) = 0\),\([x^1] F(x) \neq 0\),\([x^1] G(x) \neq 0\)。\(G(x)\) 也被称为 \(F(x)\) 的复合逆。
引理:若 \(F(G(x)) = x\),那么 \(G(F(x)) = x\)。
证明:记 \(\mathbb{R}[\![x]\!]_{+}\) 为常数项为零且一次项非零的 \(\mathbb{R}\) 上形式幂级数。我们知道函数的复合是定义在形式幂级数环 \(\mathbb{R}[\![x]\!]\) 上的二元运算,即 \((F \circ G)(x) = F(G(x))\),其封闭性与结合性显然,所以构成半群。但 \(\mathbb{R}[\![x]\!]_{+}\) 具有更好的性质,下面我们将证明它在函数复合运算上构成群。引理等价于 \(G(x)\) 的左逆元等于右逆元,只要单位元 \(\epsilon\) 同时是左幺元和右幺元,并且左右逆元都存在时,便有如下性质:设 \(\alpha\) 存在左逆元 \(l\) 和右逆元 \(r\),则 \(l = l(\alpha r) = (l \alpha) r = r\)。显然 \(\mathbb{R}[\![x]\!]_{+}\) 的单位元 \(\epsilon(x) = x\) 满足性质,因此我们只需证明 \(G\) 的右逆元存在。使用待定系数法容易说明对于任意 \(A(x),B(x) \in \mathbb{R}[\![x]\!]_{+}\),方程 \(A(\delta(x)) = B(x)\) 在 \(\delta(x) \in \mathbb{R}[\![x]\!]_{+}\) 存在唯一解,因此 \(G(x)\) 的右逆元一定存在。这就证明了结论。
令 \(G(x) = \sum_{i=1}^n g_i x^i\),代入 \(G(F(x)) = x\) 得:
两边同时求导:
我们只关注 \(n\) 次项,将它提出:
两边同时除以 \(F(x)^n\) 得:
注意到 \(F(x)^k\) 是 D-finite 的,对它求导得到 \((F(x)^k)' = kF(x)^{k-1}F'(x)\),即 \(F(x)^kF'(x) = \frac{(F(x)^{k+1})'}{k+1}\),代入上式:
不要忘记我们的目标是求出 \(g_n\),现在我们想办法把其他的系数全部消去。注意到,对于任意一个整系数多项式,其求导后 \(-1\) 次项的系数一定为 \(0\),因此我们将等式两边同时取 \(-1\) 次项:
对于等式右边:
对于等式左边:
令
则
由于 \([x^0]p(x) = 1\),于是
于是
即
多项式快速幂 + 多项式求逆即可。
扩展拉格朗日反演
扩展拉格朗日反演可以在 \(O(n \log n)\) 的时间求 \([x^n]G(x)\),其中 \(G(x)\) 满足 \(F(G(x)) = H(x)\),\(F(x)\) 和 \(H(x)\) 是已知的多项式。推导过程和拉格朗日反演完全一致,因此这里不再赘述了。结果是:
事实上,可以认为拉格朗日反演是扩展拉格朗日反演中 \(H(x) = x\) 的一种特殊情况。
多项式复合逆
令 \(n-1\) 次多项式 \(F(x)=\sum\limits _{i=0}^{n-1} a_ix^i\)。给定 \(n\) 和 \(F(x)\) 的各项系数,要求一个 \(n-1\) 次多项式 \(G(x)\) 满足:
做法
上面提到的拉格朗日反演公式可以求出 \(G(x)\) 的一项系数,但现在我们要求所有系数。按照求多项式复合的方式做,令 \(B = \sqrt{n}\):
预处理出所有 $ (\frac{x}{F(x)})^{iB}$ 及 \((\frac{x}{F(x)})^j\),这部分用 NTT 计算。计算 \([x^{iB + j}] (\frac{x}{F(x)})^{iB} (\frac{x}{F(x)})^j\) 这部分相当于给两个多项式,求出他们乘积的某一项系数,直接暴力即可。总时间复杂度 \(O(n^2 + n \sqrt{n} \log n)\)。