[Note] 多项式操作大全

[Note] 多项式操作大全

学数学的只要推一下证一下就行了,我们学 OI 的要考虑的就多了。总之,作为选手,只需要粗浅的数学知识就能在 OI 的范畴内十分不严谨地操作生成函数。

Part 1. 一些展开式

\[e^{Cx}=\sum_{n\ge 0}\frac{C^n}{n!}x^n \]

\[\ln(1-x)=-\sum_{n\ge 1}\frac{1}{n}x^n \]

\[\frac{1}{1-Cx}=\sum_{i\ge 0} {(Cx)}^i \]

\[\frac{1}{1+x}=\sum_{i\ge 0} (-1)^ix^i \]

\[\frac{1}{(1-x)^m}=\sum_{i\ge 0} {n+m-1 \choose n}x^i \]

\[\ln(1+x)=-\sum\limits_{n=1}^{+\infty}\dfrac{(-1)^{n}x^n}{n} \]

\[\exp x=-\sum_{n=0}^{+\infty}\frac{x^n}{n!} \]

\[(1+x)^{m}=\sum\limits_{n=0}^{+\infty}\binom{m}{n}x^n \]

Part 2. 多项式求导/积分

我们只需要知道 \((x^n)'=nx^{n-1},(e^x)'=e^x,(\ln x)'=\frac{1}x,(\sin x)'=\cos x,(\cos x)'=-\sin x\)。然后积分就是找到后半部分,替换回去,对于导数,我们可以将其组合起来:

  • \((f\pm g)'(x)=f'(x)\pm g'(x)\)

  • \(cf'(x)=(cf)'(x)\),其中 \(c\) 为常数

  • \((fg)'(x)=f'(x)g(x)+f(x)g'(x)\)

  • \((f/g)'(x)=\frac{f'(x)g(x)-f(x)g'(x)}{g(x)}\)

  • \(h(x)=f(g(x))\),则 \(h'(x)=f'(g(x))g'(x)\)

对于多项式,积分我们往往只在 ln 的时候会用一下,下文中会提到。我们常常都是先求导然后再积分回去,所以关于不定积分损失掉的常数,我们考虑拿原多项式带入 0,就可以算出来了。

Part 3. 多项式乘法逆

即求 \(G(x)\),满足 \(F(x)G(x)\equiv 1\pmod{x^n}\)。如果 \(F(x)G(x)\equiv 1\pmod{x^n}\) 那么对于 \(i<n\)\(F(x)G(x)\equiv 1\pmod{x^i}\) 也成立,我们考虑递推,由于一次乘法次数相加,考虑递推。

\[\begin{aligned} &\begin{cases} F(x)G(x)\equiv 1\pmod{x^n} \\ F(x)G'(x)\equiv 1\pmod{x^{\lceil \frac{n}2\rceil}} \end{cases}\\ \implies&\begin{cases} F(x)G(x)\equiv 1\pmod{x^{\lceil \frac{n}2\rceil}} \\ F(x)G'(x)\equiv 1\pmod{x^{\lceil \frac{n}2\rceil}} \end{cases}\\ \implies& G'(x)-G(x)\equiv 0 \pmod{x^{\lceil \frac{n}2\rceil}} &\text{(即上面的表述)}\\ \implies& (G'(x)-G(x))^2\equiv 0\pmod{x^n} &\text{(注意是上取整,相乘之后次数相加)}\\ \implies& (G'(x))^2-2G'(x)G(x)+(G(x))^2\equiv 0\pmod{x^n}\\ \implies& G(x)-2G'(x)+F(x)(G'(x))^2\equiv 0\pmod{x^n} &\text{(同时乘以 F(x))}\\ \implies& G(x)\equiv 2G'(x)-F(x)(G'(x))^2\pmod{x^n} \end{aligned} \]

Part 4. 多项式 ln

即求 \(G(x)\equiv \ln F(x)\pmod{x^n}\)。我们考虑两边求导再不定积分:

\[\begin{aligned} &G(x)\equiv \ln F(x)\pmod{x^n}\\ \implies& G'(x)\equiv \frac{F'(x)}{F(x)}\pmod{x^n}\\ \end{aligned} \]

然后我们弄回去,

\[\int G'(x)\equiv\ln F(x)\pmod{x^n} \]

是吗,不是还有个积分常数吗?它是多少呢?看起来我们没办法把它弄出来,因为常数项的信息在求导的时候永久损失了,但是没关系,我们只需要给原多项式即 \(\ln F(x)\) 代入 \(x=0\) 即可,那么也就是说我们需要补上常数 \(\ln {[x^0]F(x)}\),由于模意义下必须 \(\ln F(0)\) 必须是有理数,由于底数 \(e\) 是超越数,只有当 \([x^0]F=1\) 的时候才满足。这就是为什么要求 \(F\) 的常数项为 \(1\)

Part 5. 多项式 exp

多项式牛顿迭代

参考资料 多项式牛顿迭代 - feiko - 博客园 (cnblogs.com)

称一个光滑函数 \(f(x)\)\(a\) 处的泰勒展开式为:

\[f(x)=\sum\limits_{n=0}^{+\infty}\dfrac{f ^ {(n)}(a)} {i!}(x-a)^n \]

多项式牛顿迭代是解决下列问题的:

求一个关于 \(x\) 的多项式 \(f(x)\),使得对于给定函数 \(g(f(x))\)\(g(f(x))\equiv 0\pmod{x^n}\)

就好像是解方程一样,我们选择 \(g(x)=0\) 的解,即 \(g(f(x))\equiv 0\pmod{x^1}\) 的解作为初始值。

若已经求出 \(f_h(x)\pmod{x^{\lceil \frac{n}2\rceil}}\) 作为一个解,将 \(g(f(x))\)\(f_h(x)\) 处泰勒展开,并设 \(h(x)\) 满足 \(f(x)\equiv f_h(x)+x^{\lceil \frac{n}2\rceil}h(x)\pmod{x^n}\),也就说 \(h(x)\) 是后半截。代入得

\[\sum\limits_{i=0}^{+\infty} \dfrac{g^{(i)}(f_{h}(x))}{i!}x^{i\lceil\frac{n}{2}\rceil}h^i(x)\equiv 0\pmod{x^{n}} \]

由于是在 \(\bmod{x^n}\) 下进行的,所以 \(i\ge 2\) 的项全都会被截断,所以:

\[g(f_h(x))+g^\prime(f_h(x))(x^{\lceil\frac{n}{2}\rceil}h(x))\equiv 0\pmod{x^n} \]

解得

\[h(x)\equiv -x^{-\lceil\frac{n}{2}\rceil}\frac{g(f_h(x))}{g'(f_h(x))} \]

拼上前半部分:

\[f(x)\equiv f_h(x)+x^{\lceil \frac{n}2\rceil}h(x)\equiv f_h(x)-\frac{g(f_h(x))}{g'(f_h(x))}\pmod{x^n} \]

因此只要最开始 \(g(f(x))\equiv 0\pmod{x^1}\) 的解存在,那么最终的解就存在,且他们一一对应。

求 exp

我们给 \(G(x)\equiv \exp F(x)\) 两边同时开 ln,变成 \(\ln G(x)-F(x)\equiv 0\)。那么就是求左边这个函数 \(g(G(x))=\ln G(x)-F(x)\) 的零点。使用多项式牛顿迭代即可。

迭代公式:

\[f(x)\equiv f_h(x)(1-\ln f_h(x)+F(x))\pmod{x^n} \]

Part 6. 多项式开根

牛顿迭代法,迭代公式:

\[f(x)\equiv \frac{f_h^2(x)+F(x)}{2f_h(x)}\pmod{x^n} \]

注意初始值取较小解。

其实也可以像多项式求逆一样推,但是显然无脑套牛顿迭代更简单。

Part 7. 多项式快速幂

这么高次幂,直接两边 ln 一下,\(\ln G(x)-k\ln F(x)\equiv 0\pmod{x^n}\),我们直接一顿牛顿迭代:

\[f(x)\equiv f_h(x)(1-\ln f_h(x)+k\ln F(x))\pmod{x^n} \]

这可以吗?显然是不可以的,因为 \(\ln F(x)\) 是不一定有定义的!也就是说最初的解可能是找不到的!因此这里不能牛顿迭代……

但是两边 ln 一下是一个好想法,我们再两边 exp 一下,指数上用多项式 exp 做即可。但是这不是一样的么……

所以我们考虑一种策略,如果 \(F(0)=0\),就找到第一个非 \(0\) 项平移一下,然后变成 \(F(0)>1\) 的情况,我们整体除以这个值即可变成 \(1\),最后补上并再平移回去即可。

关于对指数如何取模的问题,结论是应该将 \(k\)\(P=998244353\) 或其他题目要求的质数取模。这个暂时不讨论,参阅 快速傅里叶变换实用讲解 - lupengheyyds - 博客园 (cnblogs.com)

Part 8. 多项式分治乘 / 分治 FFT

多项式分治乘是以 \(n\log n\) 的时间解决 \(n\) 个一次多项式的连乘积,就是先将短的合并到一起,考虑一个长度为 \(n,m\) 的多项式相乘的复杂度是与 \((n+m)\log (n+m)\),故复杂度分析类似合并果子(哈夫曼树)。

而分治 FFT,又称半在线卷积,是解决 \(f_i=\sum_{j=0}^i f_jg_{i-j}\) 这样的问题,套上 CDQ,用 FFT 计算左边 F 对右边 F 的贡献即可。

Part 9. 多项式差卷积

多项式差卷积是求解 \(f_k=\sum_{i-j=k}a_ib_j=\sum_{i=k}a_ib_{i-k}\) 这样卷积的方法。我们通过以下步骤将其变成普通和卷积。

\[\begin{aligned} &\sum_{i=k}^na_ib_{i-k}\\ =& \sum_{i=0}^{n-k}a_{i+k}b_{i}\\ =& \sum_{i=0}^{n-k} a'_{n-(i+k)}b_{i} &\small\text{(a' 是 a 翻转之后的多项式)}\\ =& \sum_{i=0}^{n-k} a'_{(n-k)-i}b_i \end{aligned} \]

Part 10. 多项式连续点值平移

参考 多项式平移|连续点值平移 - OI Wiki (oi-wiki.org)

拉格朗日插值公式

要求构造一个函数使得它过 \(P_1(x_1, y_1), P_2(x_2,y_2),\cdots,P_n(x_n,y_n)\),我们构造 \(n\) 个函数使得第 \(i\) 个在其他几个点处都是 \(0\),在 \(x_i\) 处为 \(y_i\),可以以下构造:

\[f(x)=\sum_{i=1}^ny_i\cdot\prod_{j\neq i}\dfrac{x-x_j}{x_i-x_j} \]

连续点值平移

\[\begin{aligned} f(x)&=\sum _ {0\leq i\leq n}f(i)\prod _ {0\leq j\leq n\,\land \,j\neq i}\frac{x-j}{i-j}\\ &=\sum_{0\le i\le n} f(i) \frac{\frac{x^{\underline n}}{x-i}}{i!(n-i)!(-1)^{n-i}} &\small\text{(i 的 n 次下降幂去掉 0)}\\ &=\sum_{0\le i\le n} f(i)\frac{1}{(x-i)i!(n-i)!(-1)^{n-i}}\cdot \frac{x!}{(x-n-1)!}\\ &=\frac{x!}{(x-n-1)!}\sum _ {0\leq i\leq n}\frac{f(i)}{(x-i)}\frac{(-1)^{n-i}}{i!(n-i)!} \end{aligned} \]

我们要求的点值是 \(f(m+x)\),代入

\[\begin{aligned} f(m+x)&=\frac{(m+x)!}{(m+x-n-1)!}\sum _ {0\leq i\leq n}\frac{f(i)}{(m+x-i)}\frac{(-1)^{n-i}}{i!(n-i)!} \end{aligned} \]

接下来的要点是如何凑卷积形式。我们必须把变量 \(x\) 从卷积式里面撤下去,变到上标上面去。

现在有很多方法,比如我们把上标换成 \(n+x\),然后设卷积的一半是 \(A(i)=\frac{f(i)(-1)^{n-i}}{i!(n-i)!}\),那么另一半,原先是 \(B(i)=\frac{1}{m+x-i}\),现在变成了 \(B(n+x-i)\),代入之后不能变,于是凑成 \(C(i)=\frac{1}{i-n+m}\),这样就一样了,然后由于下标范围扩大了,为了不多贡献,我们给乘上一个 \([i\le n]\),这一项我们分配给 \(A(i)\),免得转换。所以最终凑出来:

\[\begin{aligned} A(x)&=\sum _ {i\geq 0}\frac{f(i)(-1)^{n-i}}{i!(n-i)!}[i\le n]x^i\\ C(x)&=\sum _ {i\geq 0}\frac{1}{i-n+m}x^i \end{aligned} \]

卷积一下,求第 \(n+x\) 项即可。

posted @ 2025-06-17 21:32  haozexu  阅读(21)  评论(0)    收藏  举报