多项式算法学习笔记
来学习一个多项式全家桶。
基本算法
FFT
先咕着。
NTT
先咕着。
数学
多项式求导
这其实是高中数学内容。
对于多项式 \(F(x)=u(x)+v(x)\),它的导数\(F'(x)=u'(x)+v'(x)\)。
再结合\(u(x)=x^n, u'(x)=nx^{n-1}\),就可以愉快地线性时间求出导数。
多项式积分
直接根据公式
那么右边就是
原函数
\(c\)咋整啊,直接等 \(0\) 吧。
那么就可以线性做完了。
多项式求逆
对于函数 \(F(x)\),求一个多项式 \(G\)(x),使得在每一项系数模 \(x^n\) 时,有\(F(x)*G(x) \equiv 1 \pmod {x^n}\)。
如果 \(F\) 只有一项,那么就变成了单项式求逆元。
如果有 \(n\) 项呢?
假设我们先求出来了模 \(x^{\lceil \frac{n}{2} \rceil}\) 的逆为 \(G'\),则:
且
上减下,除掉 \(F\)
平方
拆开
乘上 \(F\)
移项
递归算就行了。
多项式对数函数
多项式 \(F\),求 \(G \equiv ln(F) \pmod {x^n}\)。
设 \(A(x)=ln(x)\),有
求导
求导求逆乘一起就行了。
泰勒展开
求一个函数 \(f(x)\) 在某一点的值,可以构造一个函数 \(g(x)\),使得
其中 \(f^n(0)\) 表示对原函数的图像上 \(0\) 这个点进行 \(n\) 阶求导。
牛顿迭代
求函数 \(G(x)\) 的零点,即求满足 \(G(F(z)) \equiv 0 \pmod {z^n}\) 的多项式 \(F(z)\)。
\(n=1\) 时,提前求出\(G(F(z)) \equiv 0 \pmod {z^n}\)。
现在假设求出了
进行泰勒展开
因为 \(F(z)\) 和 \(F_0(z)\) 的最后 \(\lceil \frac{n}{2} \rceil\) 项相同,所以 \((F(z)-F_0(z))^2\) 的最低非 \(0\) 项次数大于 $2 \lceil \frac{n}{2} \rceil $,所以
且 \(G(F(z)) \equiv 0 \pmod{z^n}\),得到
迭代就可以了。
多项式指数函数
求 \(F(x)\equiv e^{A(x)} \pmod{x^n}\)。
取对数并移项
设 \(G(F(x)) = \ln F(x) - A(x)\),则求 \(G(F(x))=0\)。
求导
假设已经求出了 \(F_0(x) \equiv e^{A(x)} \pmod{x^{\lceil\frac{n}{2}\rceil}}\),代入牛顿迭代公式
且 \(A(0)=0\),所以 \(F(x)\) 的常数项为 \(1\)。
也可以递归求解了。