暴力の多项式全家桶
作者:互联网
因为我不会 NTT
其实是因为任意模数多项式乘法太毒瘤,所以需要暴力(?
目前仍属于口胡阶段,如果有时间我就写一份拿挑战多项式拍一下 .
很多地方省略了 \(\pmod{x^c}\),\(c\) 是一个神奇的常数 .
目录非常 naive 的东西
多项式加减 & 数乘
????
时间复杂度 \(O(n)\) .
多项式乘法 / 卷积
代入定义暴力模拟即可 .
时间复杂度 \(O(n^2)\) .
多项式插值
平凡拉格朗日插值即可 .
具体的,考虑构造 \(n+1\) 个多项式 \(g_i(x)\),使得 \(g_i(x_i)=y_i\),且对于任意 \(i\neq j\) 有 \(g_i(x_j)=0\),然后 \(\displaystyle\sum_{i=0}^n g_i(x)\) 即是所求多项式 .
构造这个 \(g_i\),可以令 \(g_i(x)=y_i\ell_i(x)\),这样 \(\ell_i(x)\) 只取 \(\{0,1\}\),那么自然满足条件 .
令 \(\ell_i(x)\) 为
\[\ell_i(x) = \prod_{i\neq j}\dfrac{x-x_j}{x_i-x_j} \]即可,当 \(x=x_i\) 时,每项都是 \(\dfrac{x_i-x_j}{x_i-x_j}=1\),当 \(x\neq x_i\) 时,一定有一项使得分子为 \(0\) .
所以我们就得到了拉格朗日插值公式:
\[L_n(x)=\sum_{i=0}^ny_i\prod_{i\neq j}\dfrac{x-x_j}{x_i-x_j} \]上面设的 \(\ell_i(x)\) 称做拉格朗日基本多项式(插值基函数),\(L_n(x)\) 叫做拉格朗日插值多项式 .
时间复杂度 \(O(n^2)\) .
多项式多点求值
我们知道多项式单点求值有秦九韶算法,大概是乘法分配律,具体可以看奥赛之光里 CDsidi 出的一道题 T220475 .
于是单点求值被 \(O(n)\) 解决,于是多点求值被 \(O(n^2)\) 解决 .
多项式微积分
众所周知当 \(n\) 是自然数时有
\[\dfrac{\mathrm d}{\mathrm dx}x^n=nx^{n-1} \]\[\int x^n\mathrm dx=\dfrac{x^{n+1}}{n+1}+C \]于是把每一项单独拿出来处理,时间复杂度 \(O(n)\) .
求逆及其直接推广
多项式乘法逆
设 \(A,B\) 分别是所求多项式 \(F\) 和其乘法逆 \(F^{-1}\) 的各项系数 .
由定义知
\[\sum_{i=0}^nA_iB_{n-i}=[n=0] \]不妨令 \(n>0\),于是把 \(B_0\) 拿出来得
\[A_0B_n=-\sum_{i=1}^nA_iB_{n-i} \]即
\[B_n=-\dfrac1{A_0}\sum_{i=1}^nA_iB_{n-i} \]边界 \(B_0=\dfrac1{A_0}\),根据多项式定义我们知道 \(A_0\neq 0\),于是问题被解决了 .
直接模拟,时间复杂度 \(O(n^2)\) .
多项式带余除法
对于多项式 \(F\),定义 \(F^{\mathsf R}\) 为
\[F^{\mathsf R}(z) = z^nF\left(\dfrac 1z\right) \](系数反转)
这个可以 \(O(n)\) 求 .
于是令 \(F(z)=Q(z)G(z)+H(z)\),则:
\[\begin{aligned}&F\left(\dfrac 1z\right) = Q\left(\dfrac 1z\right)G\left(\dfrac 1z\right)+R\left(\dfrac 1z\right)\\\Longrightarrow&F^{\mathsf R}(z)=Q^{\mathsf R}(z)G^{\mathsf R}(z)+x^{n+m+1}\cdot R^{\mathsf R}(z)\\\Longrightarrow&F^{\mathsf R}(z)\equiv Q^{\mathsf R}(z)G^{\mathsf R}(z)&\pmod{x^{n-m+1}}\end{aligned} \]一次求逆可以算出 \(Q^{\mathsf R}\),然后可以轻易算出 \(R^{\mathsf R}\),这样也就算出 \(Q,R\) 了 .
时间复杂度 \(O(n^2)\) .
多项式 ln
令 \(G(z)=\ln F(z)\),两边求导,得
\[G'(z)=\dfrac{F'(z)}{F(z)} \]一次多项式求导,一次多项式求逆,时间复杂度 \(O(n^2)\) .
多项式 exp
令 \(G(z)=\exp F(z)\),两边求导,得
\[G'(z)=G(z)F(z) \]令 \(F,G\) 的系数序列为 \(\{A\},\{B\}\),于是按卷积的定义展开:
\[(n+1)B_{n+1}=\sum_{i=0}^nB_{n-i}A_{i+1}(i+1) \]把 \(n+1\) 除过去,然后 \(n+1\) 换成 \(n\) 就得到
\[B_n=\dfrac1n\sum_{i=1}^niB_{n-i}A_i \]直接模拟,时间复杂度 \(O(n^2)\) .
多项式幂函数
令 \(G(z)=F(z)^t\) .
先 \(\ln\) 再 \(\exp\),得
\[G(z)=\exp(t\ln G(z)) \]一次多项式 \(\ln\),一次多项式 \(\exp\),时间复杂度 \(O(n^2)\) .
从而多项式开根就是求 \(\dfrac 12\) 次方,也被解决 .
普通多项式与下降幂多项式间转换
下降幂多项式转普通多项式:乘上 \(\exp z\) 转成点值 EGF,然后插回去即可 .
普通多项式下降幂多项式:把上面的过程反过来 .
均是 \(O(n^2)\) .
多项式三角函数
根据欧拉公式有
\[\mathrm e^{\mathrm ix}=\cos x + \mathrm i\cos x \]于是
\[\mathrm e^{-\mathrm ix}=\cos x - \mathrm i\cos x \]联立解二元一次方程组可得
\[\begin{cases}\sin x=\dfrac 12(e^{\mathrm ix}+e^{-\mathrm ix})\\\cos x=\dfrac1{2\mathrm i}(e^{\mathrm ix}-e^{-\mathrm ix})\end{cases} \]推广到多项式就行了,两次多项式 exp,时间复杂度 \(O(n^2)\) .
tan 就是 sin/cos,一次求逆,时间复杂度 \(O(n^2)\) .
当然这个做法要求 \(-1\) 在模模数意义下有二次剩余,没有的情况应该是可以 complex 类模拟的(因为所有操作都是暴力的所以应该很好实现)(存疑).
多项式反三角函数
这个有很多做法啊 .
令 \(F(z)=\arcsin G(z)\),则两边求导再积分就得
\[F(z)=\int\dfrac{G'(z)}{\sqrt{1-G(z)^2}}\mathrm dz \]一次卷积 / 幂,一次开根,一次求导,一次求逆,再一次卷积,时间复杂度 \(O(n^2)\) .
其他的类似吧,关键在于复合函数求导 .
Reference
标签:暴力,dfrac,复杂度,mathsf,全家,exp,多项式,mathrm 来源: https://www.cnblogs.com/CDOI-24374/p/16417421.html