多项式

也许更好的阅读体验

前置知识

FFT
牛顿迭代
求导


定义

简单来说,形如 a 0 x 0 + a 1 x 1 + a 2 x 2 + + a n x n a_0x^0+a_1x^1+a_2x^2+\cdots+a_nx^n a0x0+a1x1+a2x2++anxn,的代数表达式叫做多项式
可以记作 f ( x ) = a 0 x 0 + a 1 x 1 + a 2 x 2 + + a n x n f(x)=a_0x^0+a_1x^1+a_2x^2+ \cdots+a_nx^n f(x)=a0x0+a1x1+a2x2++anxn
其中 a 0 , a 1 ,   , a n a_0,a_1,\cdots,a_n a0,a1,,an叫做多项式的系数, x x x是一个不定元,不表示任何值
不定元在多项式中最大项的次数称作多项式的次数


多项式的表示法

系数表示法

像刚刚我们提到的那些多项式,都是以系数形式表示的,也就是将 n n n次多项式 f ( x ) f(x) f(x)的系数 a 0 , a 1 , &ThinSpace; , a n a_0,a_1,\cdots,a_n a0,a1,,an看作 n + 1 n+1 n+1维向量 <mover accent="true"> a </mover> = ( a 0 , a 1 , &ThinSpace; , a n ) \overrightarrow{a}=(a_0,a_1,\cdots,a_n) a =(a0,a1,,an),其系数表示就是向量 <mover accent="true"> a </mover> \overrightarrow{a} a

点值表示法

如果 n + 1 n+1 n+1个不同的数 x 0 , x 1 , &ThinSpace; , x n x_0,x_1,\cdots,x_n x0,x1,,xn对多项式进行求值,得到 f ( x 0 ) , f ( x 1 ) , &ThinSpace; , f ( x n ) f(x_0),f(x_1),\cdots,f(x_n) f(x0),f(x1),,f(xn),那么就称 { ( x i , f ( x i ) ) 0 i n , i Z } \left\{ \left( x_{i},f\left( x_{i}\right) \right)|0\leq i\leq n,i\in Z\right\} {(xi,f(xi))0in,iZ}为多项式 f ( x ) f(x) f(x)的点值表示
注意, n + 1 n+1 n+1个点值只能表示 n n n次多项式


多项式的基本运算

两个多项式 <mstyle displaystyle="true" scriptlevel="0"> f ( x ) = <munderover> i = 0 </munderover> a i x i </mstyle> \begin{aligned}f(x)=\sum_{i=0}^{\infty}a_ix^i\end{aligned} f(x)=i=0aixi <mstyle displaystyle="true" scriptlevel="0"> g ( x ) = <munderover> i = 0 </munderover> b i x i </mstyle> \begin{aligned}g(x)=\sum_{i=0}^{\infty}b_ix^i\end{aligned} g(x)=i=0bixi

加法

<mstyle displaystyle="true" scriptlevel="0"> h ( x ) = f ( x ) + g ( x ) = <munderover> i = 0 </munderover> ( a i + b i ) x i </mstyle> \begin{aligned}h(x)=f(x)+g(x)=\sum_{i=0}^{\infty}(a_i+b_i)x^i\end{aligned} h(x)=f(x)+g(x)=i=0(ai+bi)xi

乘法

<mstyle displaystyle="true" scriptlevel="0"> f ( x ) = f ( x ) g ( x ) = <munderover> i = 0 </munderover> <munder> j + k = i </munder> ( a j b k ) x i </mstyle> \begin{aligned}f(x)=f(x)*g(x)=\sum_{i=0}^{\infty}\sum_{j+k=i} (a_j\cdot b_k)x^i\end{aligned} f(x)=f(x)g(x)=i=0j+k=i(ajbk)xi


多项式的其它运算

基本套路

从现在开始要用到牛顿迭代了
一般基本套路是运用牛顿迭代倍增求解

  1. 先构造一个复合多项式 g g g,使 g ( f ) = 0 g(f)=0 g(f)=0
  2. g g g求导
  3. 牛顿迭代

为了方便阅读,下面把牛顿迭代再贴一次

f f 0 g ( f 0 ) g ( f 0 ) ( <mtext>   </mtext> m o d <mtext>   </mtext> x 2 n ) f\equiv f_{0}-\dfrac {g\left( f_{0}\right) }{g&#x27;\left( f_{0}\right) }\left(\ mod\ x^{2n}\right) ff0g(f0)g(f0)( mod x2n)

有一个多项式 A A A

多项式求逆

f = 1 A f=\dfrac{1}{A} f=A1,求 f f f的前 n n n

构造 g ( f ) = 1 f A = 0 g\left( f\right) =\dfrac {1}{f}-A=0 g(f)=f1A=0,我们知道 f f f的常数项为 A A A的常数项的逆元,接下来开始迭代
此时有 g ( f 0 ) = 1 f 0 2 g&#x27;(f_0)=-\dfrac{1}{f_0^2} g(f0)=f021

g ( f 0 ) = ( f 0 1 A ) g&#x27;(f_0)=(f_0^{-1}-A)&#x27; g(f0)=(f01A),将 A A A看为常数项
g ( f 0 ) = ( f 0 1 A ) = f 0 2 = 1 f 0 2 g&#x27;(f_0)=(f_0^{-1}-A)&#x27;=-f^{-2}_0=-\dfrac{1}{f_0^2} g(f0)=(f01A)=f02=f021

根据牛顿迭代
f f 0 1 f 0 A 1 f 0 2 ( <mtext>   </mtext> m o d <mtext>   </mtext> x 2 n ) 2 f 0 A f 0 2 ( <mtext>   </mtext> m o d <mtext>   </mtext> x 2 n ) f\equiv f_0-\dfrac{\dfrac{1}{f_0}-A}{-\dfrac{1}{f_0^2}}\left(\ mod\ x^{2n}\right)\equiv2f_0-Af_0^2\left(\ mod\ x^{2n}\right) ff0f021f01A( mod x2n)2f0Af02( mod x2n)
至此,我们推完了,拿出来,写在下面

f 2 f 0 A f 0 2 ( <mtext>   </mtext> m o d <mtext>   </mtext> x 2 n ) f\equiv2f_0-Af_0^2\left(\ mod\ x^{2n}\right) f2f0Af02( mod x2n)

现在我们可以由 f 0 f_0 f0去推 f f f,每次这个模数 x y x^y xy y y y会乘以2,也就是说是倍增的
初始时 n = 1 n=1 n=1
时间复杂度 O ( n l o g n ) O(nlogn) O(nlogn)

多项式求ln

f = l n <mtext>   </mtext> g f=ln\ g f=ln g的前 n n n
我们对其求导
f ( x ) = g ( x ) g ( x ) f&#x27;\left( x\right) =\dfrac {g&#x27;(x)}{g\left( x\right) } f(x)=g(x)g(x)

复合求导
ln -> u
g -> v

这样,我们只要对 g g g求逆,然后对 g g g求导得 g g&#x27; g,之后我们就得到了 f f&#x27; f,再对其积分得到 f f f
求导和积分都是 O ( n ) O(n) O(n)
时间复杂度 O ( n l o g n ) O(nlogn) O(nlogn)

多项式exp

f = e A f=e^A f=eA ( A A A的常数项为 0 0 0)的前 n n n

构造 g ( f ) = l n <mtext>   </mtext> f A g(f)=ln\ f-A g(f)=ln fA
我们知道 f f f的常数项为 1 1 1
g g g求导, g ( f 0 ) = 1 f 0 g&#x27;(f_0)=\dfrac{1}{f_0} g(f0)=f01
根据牛顿迭代
<mstyle displaystyle="true" scriptlevel="0"> f </mstyle> <mstyle displaystyle="true" scriptlevel="0"> f l n f 0 A 1 f 0 ( <mtext>   </mtext> m o d <mtext>   </mtext> x 2 n ) </mstyle> <mstyle displaystyle="true" scriptlevel="0"> </mstyle> <mstyle displaystyle="true" scriptlevel="0"> f 0 ( 1 ln f 0 + A ) ( <mtext>   </mtext> m o d <mtext>   </mtext> x 2 n ) </mstyle> \begin{aligned}f&amp;\equiv f-\dfrac {lnf_{0}-A}{\dfrac {1}{f_{0}}}\left(\ mod\ x^{2n}\right)\\ &amp;\equiv f_{0}\left( 1-\ln f_{0}+A\right) \left(\ mod\ x^{2n}\right) \end{aligned} fff01lnf0A( mod x2n)f0(1lnf0+A)( mod x2n)

至此,我们推完了,拿出来,写在下面

f f 0 ( 1 ln f 0 + A ) ( <mtext>   </mtext> m o d <mtext>   </mtext> x 2 n ) f\equiv f_{0}\left( 1-\ln f_{0}+A\right) \left(\ mod\ x^{2n}\right) ff0(1lnf0+A)( mod x2n)

还是倍增
l n ln ln和多项式乘法都是 O ( n l o g n ) O(nlogn) O(nlogn)的,加法是 O ( n ) O(n) O(n)
时间复杂度 O ( n l o g n ) O(nlogn) O(nlogn)

多项式开方

f = A f=\sqrt {A} f=A ( A A A的常数项存在平方根)的前 n n n

构造 g ( f ) = f 2 A g(f)=f^2-A g(f)=f2A
我们知道 f f f的常数项为 A A A常数项的平方根
可用二次剩余方法解
g g g求导 g ( f 0 ) = 2 f 0 g&#x27;(f_0)=2f_0 g(f0)=2f0
根据牛顿迭代
f f 0 f 0 2 A 2 f 0 ( <mtext>   </mtext> m o d <mtext>   </mtext> x 2 n ) f\equiv f_{0}-\dfrac {f^{2}_{0}-A}{2f_{0}}\left(\ mod\ x^{2n}\right) ff02f0f02A( mod x2n)
时间复杂度 O ( n l o g n ) O(nlogn) O(nlogn)

如有哪里讲得不是很明白或是有错误,欢迎指正
如您喜欢的话不妨点个赞收藏一下吧
如能得到推荐博主就更开心了
您的鼓励是博主的动力

全部评论

相关推荐

09-13 14:38
已编辑
广西大学 Java
何青司:第一个项目感觉可以写好多东西,但只是简单的罗列技术和功能,我看到一种推荐写法是使用xxx实现(或解决)xxx功能(或问题)。再可以添加一些数据,例如实习经历你写到输出相关报告,前面也提到了文档撰写,可以加上数量,数量少则可以写“梳理出8000字文档资料”。查询数据库优化和缓存策略也可以加上数据对比,我的简历就写有一条“使用Redis缓存首页用户信息列表,将接口响应时长从4.5秒优化到47毫秒左右”,数据对比就凸显出缓存的重要性了。以上只是我的一点拙见。
点赞 评论 收藏
分享
头像
09-12 16:00
已编辑
山西大学 后端
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务