多项式求导
原理
如果有
A(x)=n∑i=0cixi
那么由于求导的加法原则,每一项可以单独考虑,则有
A′(x)=n∑i=1icixi−1
实现
多项式积分
原理
如果有
A(x)=n∑i=0cixi
同样由于积分的加法原则,每一项可以单独考虑,则有(常数项可以忽略)
∫A(x)dx=n+1∑i=1ci−1ixi
实现
多项式乘法
原理
定义两个多项式 A(x)=∑ni=0aixi,B(x)=∑mi=0bixi 。那么乘积为 C(x)=∑ni=0∑mj=0aibjxi+j 。
我们考虑利用快速傅里叶变换解决,我们求出 ωkn 代入的所有的点值,然后用逆变换就可以求出所有系数了。
对于模意义下的我们利用 gp−1n 代替 ω (其中 g 为原根)就可以了。
实现
我们接下来都默认用费马质数来作为模数进行 NTT 。
多项式牛顿迭代
原理
给出函数 f ,找到一个多项式 A,使得 f(A(x))≡0(modxn) 。
在 (modx) 时,可以求出 A(x) 的常数项。
已经求出 f(A(x))≡0modxn ,现在求 f(B(x))≡0modx2n ,B(x) 与 A(x) 前 n 项系数相同。
在 modx2n 下,在 A(x) 处展开 f(B(x)) 。
f(B(x))=∑i≥0f(i)(A(x))i!(B(x)−A(x))i
不难发现在 i≥2 的时候,最低项已经超过了 x2n ,所以只有 i=0,1 要考虑,也就是
f(B(x))≡f(A(x))+f′(A(x))(B(x)−A(x))(modx2n)B(x)≡A(x)−f(A(x))f′(A(x))(modx2n)
大多数情况下,多项式复合是一个比较难求解的一个东西,但对于一些特殊的 f 可以方便求出。
多项式求逆
原理
好像这个不好套牛迭,我们现推算了。
设 F(x) 是 P(x) 在 (modxn) 下的逆元,那么表示出来就是
F(x)P(x)≡1(modxn)
当 n=1 求逆元即可,假设我们求出在 modxn2 意义下的逆元 G(x) ,那么有
G(x)P(x)≡1(modxn2)
我们有
F(x)−G(x)≡0(modxn2)F2(x)−2F(x)G(x)+G2(x)≡0(modxn)F(x)≡2G(x)−P(x)G2(x)(modxn)
那么递归求解即可,复杂度 T(n)=T(n2)+O(nlogn)=O(nlogn) 。
实现
由于这个是大部分多项式操作的一个基础操作(加减乘除)之一,所以要尽量加快速度。
可以先 NTT 然后做点值乘法,能少一半常数。(注意一开始需要是 2k≥len 形式)
多项式开根
原理
求 F2(x)≡P(x)(modxn) ,此时的 f(A(x))=A2−P 我们要求它的零点。
那么我们套用牛迭的式子就得到了
B(x)=A(x)−A2(x)−P(x)2A(x)=A(x)2+P(x)2A(x)
复杂度 T(n)=T(n2)+O(nlogn)=O(nlogn) 。 。。主定理是真的强大
注意常数项非 1 的时候,通常都会保证存在模意义下的二次剩余,然后用 BSGS 求出它是 gk ,然后开根就是 gk/2 。
实现
多项式ln
原理
求 G(x)=lnF(x) ,我们有
G(x)=∫F′(x)F(x)dx
那么我们求导然后再求逆即可,复杂度 O(nlogn) 。
常数项需要是 1 ,其他形如 lnx 的无理数在模意义下无法表示。
实现
多项式exp
原理
可以套用牛顿迭代和多项式 ln 解决。
分治的做法虽然多了个 O(log) 但好写许多(而且通常由于常数优势会比较快,除非你会论文哥那个牛迭优化),原理如下
B(x)=exp(A(x))B′(x)=A′(x)exp(A(x))B′(x)=A′(x)B(x)B(x)=∫A′(x)B(x)dx
我们考虑把 A(x) 先求导成 A′(x) ,令 mid=⌊l+r2⌋ 然后考虑分治求出 [l,mid] 的 B(x) ,然后考虑对于 (mid,r] 的贡献,也就是 A0∼r−l 和 Bl∼mid 卷然后贡献上去。
注意 A(0)=0 才在模意义下有含义,此时 B(0)=1 ,以及积分需要平移一位并乘上 1n 。复杂度 O(nlog2n) 。
实现
多项式快速幂
原理
求 G(x)=Fk(x) ,我们取对数有 lnG(x)=klnF(x) 也就是 G(x)=exp(klnF(x)) 。
但是 F(0) 可能不为 1 ,那么我们把 F(x) 除掉 F(0) 即可。那么还可能为 0 我们平移即可,也就是除掉 xa 。
然后 exp 结束记得乘回来它的 k 次幂即可。
代码
不想判 0 了。。
多项式复合逆
原理
设 G(F(x))=x 求 F(x) 的一项。此时 G(x) 可能是和 F 同阶的一个多项式,套用牛顿迭代项数会特别多,根本无法求解。
但要求单项即 [xn]F(x) 有一个可以快速计算的式子
[xn]F(x)=1n[xn−1](xG(x))n
至于证明可以参看这篇博客 。
实现
__EOF__
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】