[Note] 多项式操作大全
[Note] 多项式操作大全
学数学的只要推一下证一下就行了,我们学 OI 的要考虑的就多了。总之,作为选手,只需要粗浅的数学知识就能在 OI 的范畴内十分不严谨地操作生成函数。
Part 1. 一些展开式
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}\) 也成立,我们考虑递推,由于一次乘法次数相加,考虑递推。
Part 4. 多项式 ln
即求 \(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
多项式牛顿迭代
称一个光滑函数 \(f(x)\) 在 \(a\) 处的泰勒展开式为:
多项式牛顿迭代是解决下列问题的:
求一个关于 \(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)\) 是后半截。代入得
由于是在 \(\bmod{x^n}\) 下进行的,所以 \(i\ge 2\) 的项全都会被截断,所以:
解得
拼上前半部分:
因此只要最开始 \(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)\) 的零点。使用多项式牛顿迭代即可。
迭代公式:
Part 6. 多项式开根
牛顿迭代法,迭代公式:
注意初始值取较小解。
其实也可以像多项式求逆一样推,但是显然无脑套牛顿迭代更简单。
Part 7. 多项式快速幂
这么高次幂,直接两边 ln 一下,\(\ln G(x)-k\ln F(x)\equiv 0\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}\) 这样卷积的方法。我们通过以下步骤将其变成普通和卷积。
Part 10. 多项式连续点值平移
拉格朗日插值公式
要求构造一个函数使得它过 \(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(m+x)\),代入
接下来的要点是如何凑卷积形式。我们必须把变量 \(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)\),免得转换。所以最终凑出来:
卷积一下,求第 \(n+x\) 项即可。
本文来自博客园,作者:haozexu,转载请注明原文链接:https://www.cnblogs.com/haozexu/p/18933642

浙公网安备 33010602011771号