来学习一个多项式全家桶。
基本算法
FFT
先咕着。
NTT
先咕着。
数学
多项式求导
这其实是高中数学内容。
对于多项式 \(F(x)=u(x)+v(x)\),它的导数\(F\'(x)=u\'(x)+v\'(x)\)。
再结合\(u(x)=x^n, u\'(x)=nx^{n-1}\),就可以愉快地线性时间求出导数。
多项式积分
直接根据公式
\[\int F(x)dx = (\sum^{n}_{i=0}\frac{f_i}{i+1}x^{i+1})+c
\]
那么右边就是
\[f_0x+\frac{f_1}{2}x^2+\frac{f_2}{3}x^3+\frac{f_3}{4}x^4+...+\frac{f_n}{n+1}x^{n+1}+c
\]
原函数
\[F(x)=f_0+f_1x+f_2x^2+f_3x^3+...+f_nx^n
\]
\(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*G\' \equiv 1 \pmod {x^{\lceil \frac{n}{2} \rceil}}
\]
且
\[F*G \equiv 1 \pmod {x^{\lceil \frac{n}{2} \rceil}}
\]
上减下,除掉 \(F\)
\[G\'-G \equiv 0 \pmod {x^{\lceil \frac{n}{2} \rceil}}
\]
平方
\[(G\'-G)^2 \equiv 0 \pmod {x^n}
\]
拆开
\[G\'^2-2GG\'+G^2 \equiv 0 \pmod {x^n}
\]
乘上 \(F\)
\[FG\'^2-2G\'+G \equiv 0\pmod{x^n}
\]
移项
\[G \equiv 2G\'-FG\'^2 \pmod{x^n}
\]
递归算就行了。
多项式对数函数
多项式 \(F\),求 \(G \equiv ln(F) \pmod {x^n}\)。
设 \(A(x)=ln(x)\),有
\[G(x)=A(F(x)),A\'(x)=\frac{1}{x}
\]
求导
\[G\'(x)=A\'(F(x))F\'(x)=\frac{F\'(x)}{F(x)}
\]
求导求逆乘一起就行了。
泰勒展开
求一个函数 \(f(x)\) 在某一点的值,可以构造一个函数 \(g(x)\),使得
\[f(x) \approx g(x) = g(0) + \frac{f^1(0)}{1!}x + \frac{f^2(0)}{2!}x^2 + ... + \frac{f^n(0)}{n!}x^n
\]
其中 \(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}\)。
现在假设求出了
\[G(F_0(z)) \equiv 0 \pmod{z^{ \lceil \frac{n}{2} \rceil}}
\]
进行泰勒展开
\[G(F(z))=G(F_0(z))+\frac{G\'(F_0(z))}{1!}(F(z)-F_0(z))+\frac{G\'\'(F_0(z))}{2!}(F(z)-F_0(z))^2+...
\]
因为 \(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 G(F_0(z))+G\'(F_0(z))+G\'(F_0(z))(F(z)-F_0(z)) \pmod{z^n}
\]
且 \(G(F(z)) \equiv 0 \pmod{z^n}\),得到
\[F(z) \equiv F_0(z) - \frac{G(F_0(z))}{G\'(F_0(z))} \pmod{z^n}
\]
迭代就可以了。
多项式指数函数
求 \(F(x)\equiv e^{A(x)} \pmod{x^n}\)。
取对数并移项
\[\ln F(x) - A(x)=0
\]
设 \(G(F(x)) = \ln F(x) - A(x)\),则求 \(G(F(x))=0\)。
求导
\[G\'(F(x)) = \frac{1}{F(x)}
\]
假设已经求出了 \(F_0(x) \equiv e^{A(x)} \pmod{x^{\lceil\frac{n}{2}\rceil}}\),代入牛顿迭代公式
\[F(x) \equiv F_0(x) - \frac{G(F_0(x))}{G\'(F_0(x))} \pmod{x^n} \\
F(x) \equiv F_0(x)(1 - \ln F_0(x) + A(x)) \pmod{x^n}
\]
且 \(A(0)=0\),所以 \(F(x)\) 的常数项为 \(1\)。
也可以递归求解了。