多项式

也许更好的阅读体验

前置知识

FFT
牛顿迭代
求导


定义

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


多项式的表示法

系数表示法

像刚刚我们提到的那些多项式,都是以系数形式表示的,也就是将(n)次多项式(f(x))的系数(a_0,a_1,cdots,a_n)看作(n+1)维向量(overrightarrow{a}=(a_0,a_1,cdots,a_n)),其系数表示就是向量(overrightarrow{a})

点值表示法

如果(n+1)个不同的数(x_0,x_1,cdots,x_n)对多项式进行求值,得到(f(x_0),f(x_1),cdots,f(x_n)),那么就称(left{ left( x_{i},fleft( x_{i} ight) ight)|0leq ileq n,iin Z ight})为多项式(f(x))的点值表示
注意,(n+1)个点值只能表示(n)次多项式


多项式的基本运算

两个多项式(egin{aligned}f(x)=sum_{i=0}^{infty}a_ix^iend{aligned})(egin{aligned}g(x)=sum_{i=0}^{infty}b_ix^iend{aligned})

加法

(egin{aligned}h(x)=f(x)+g(x)=sum_{i=0}^{infty}(a_i+b_i)x^iend{aligned})

乘法

(egin{aligned}f(x)=f(x)*g(x)=sum_{i=0}^{infty}sum_{j+k=i} (a_jcdot b_k)x^iend{aligned})


多项式的其它运算

基本套路

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

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

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

(fequiv f_{0}-dfrac {gleft( f_{0} ight) }{g'left( f_{0} ight) }left( mod x^{2n} ight))

有一个多项式(A)

多项式求逆

(f=dfrac{1}{A}),求(f)的前(n)

构造(gleft( f ight) =dfrac {1}{f}-A=0),我们知道(f)的常数项为(A)的常数项的逆元,接下来开始迭代
此时有 (g'(f_0)=-dfrac{1}{f_0^2})

(g'(f_0)=(f_0^{-1}-A)'),将(A)看为常数项
(g'(f_0)=(f_0^{-1}-A)'=-f^{-2}_0=-dfrac{1}{f_0^2})

根据牛顿迭代
(fequiv f_0-dfrac{dfrac{1}{f_0}-A}{-dfrac{1}{f_0^2}}left( mod x^{2n} ight)equiv2f_0-Af_0^2left( mod x^{2n} ight))
至此,我们推完了,拿出来,写在下面

(fequiv2f_0-Af_0^2left( mod x^{2n} ight))

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

多项式求ln

(f=ln g)的前(n)
我们对其求导
(f'left( x ight) =dfrac {g'(x)}{gleft( x ight) })

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

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

多项式exp

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

构造(g(f)=ln f-A)
我们知道(f)的常数项为(1)
(g)求导,(g'(f_0)=dfrac{1}{f_0})
根据牛顿迭代
(egin{aligned}f&equiv f-dfrac {lnf_{0}-A}{dfrac {1}{f_{0}}}left( mod x^{2n} ight)\ &equiv f_{0}left( 1-ln f_{0}+A ight) left( mod x^{2n} ight) end{aligned})

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

(fequiv f_{0}left( 1-ln f_{0}+A ight) left( mod x^{2n} ight))

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

多项式开方

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

构造(g(f)=f^2-A)
我们知道(f)的常数项为(A)常数项的平方根
可用二次剩余方法解
(g)求导(g'(f_0)=2f_0)
根据牛顿迭代
(fequiv f_{0}-dfrac {f^{2}_{0}-A}{2f_{0}}left( mod x^{2n} ight))
时间复杂度(O(nlogn))

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

原文地址:https://www.cnblogs.com/Morning-Glory/p/11317760.html