ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

暴力の多项式全家桶

2022-06-27 20:32:48  阅读:153  来源: 互联网

标签:暴力 dfrac 复杂度 mathsf 全家 exp 多项式 mathrm


因为我不会 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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有