暴力の多项式全家桶

因为我不会 NTT

其实是因为任意模数多项式乘法太毒瘤,所以需要暴力(?

冷门的不想写了(e.g. 下降幂多项式乘法),不可做的写不了啊(e.g. 复合)

目前仍属于口胡阶段,如果有时间我就写一份拿挑战多项式拍一下 .(UPD. 应该没太大问题(求逆还没测))

很多地方省略了 \(\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)\) .

UPD.

\(G(z)=\ln F(z)\)\(F,G\) 的系数序列为 \(\{A\},\{B\}\),则有更简洁的做法:

\[B_n=A_n-\dfrac1n\sum_{i=1}^{n-1}iB_iA_{n-i} \]

(\(A_0=1\)

多项式 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)\) .

\(A_0=0\)

多项式幂函数

\(G(z)=F(z)^t\) .

不失一般性,令 \(F(z)\) 的常数项为 \(1\) .

\(\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

posted @ 2022-06-27 20:21  Jijidawang  阅读(267)  评论(3编辑  收藏  举报
😅​