文章目录
- 前置知识
- 定义
- 多项式的表示法
- 系数表示法
- 点值表示法
- 多项式的基本运算
- 加法
- 乘法
- 多项式的其它运算
- 基本套路
- 多项式求逆
- 多项式求ln
- 多项式exp
- 多项式开方
前置知识
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 , ⋯   , a n a_0,a_1,\cdots,a_n a0,a1,⋯,an看作 n + 1 n+1 n+1维向量 a → = ( a 0 , a 1 , ⋯   , a n ) \overrightarrow{a}=(a_0,a_1,\cdots,a_n) a =(a0,a1,⋯,an),其系数表示就是向量 a → \overrightarrow{a} a
点值表示法
如果 n + 1 n+1 n+1个不同的数 x 0 , x 1 , ⋯   , x n x_0,x_1,\cdots,x_n x0,x1,⋯,xn对多项式进行求值,得到 f ( x 0 ) , f ( x 1 ) , ⋯   , 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))∣0≤i≤n,i∈Z}为多项式 f ( x ) f(x) f(x)的点值表示
注意, n + 1 n+1 n+1个点值只能表示 n n n次多项式
多项式的基本运算
两个多项式 f ( x ) = ∑ i = 0 ∞ a i x i \begin{aligned}f(x)=\sum_{i=0}^{\infty}a_ix^i\end{aligned} f(x)=i=0∑∞aixi, g ( x ) = ∑ i = 0 ∞ b i x i \begin{aligned}g(x)=\sum_{i=0}^{\infty}b_ix^i\end{aligned} g(x)=i=0∑∞bixi
加法
h ( x ) = f ( x ) + g ( x ) = ∑ i = 0 ∞ ( a i + b i ) x i \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
乘法
f ( x ) = f ( x ) ∗ g ( x ) = ∑ i = 0 ∞ ∑ j + k = i ( a j ⋅ b k ) x i \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=0∑∞j+k=i∑(aj⋅bk)xi
多项式的其它运算
基本套路
从现在开始要用到牛顿迭代了
一般基本套路是运用牛顿迭代倍增求解
- 先构造一个复合多项式g gg,使g ( f ) = 0 g(f)=0g(f)=0
- 对g求导
- 牛顿迭代
为了方便阅读,下面把牛顿迭代再贴一次
f ≡ f 0 − g ( f 0 ) g ′ ( f 0 ) ( m o d x 2 n ) f\equiv f_{0}-\dfrac {g\left( f_{0}\right) }{g'\left( f_{0}\right) }\left(\ mod\ x^{2n}\right) f≡f0−g′(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)=f1−A=0,我们知道 f f f的常数项为 A A A的常数项的逆元,接下来开始迭代
此时有 g ′ ( f 0 ) = − 1 f 0 2 g'(f_0)=-\dfrac{1}{f_0^2} g′(f0)=−f021
g ′ ( f 0 ) = ( f 0 − 1 − A ) ′ g'(f_0)=(f_0^{-1}-A)' g′(f0)=(f0−1−A)′,将 A A A看为常数项
g ′ ( f 0 ) = ( f 0 − 1 − A ) ′ = − f 0 − 2 = − 1 f 0 2 g'(f_0)=(f_0^{-1}-A)'=-f^{-2}_0=-\dfrac{1}{f_0^2} g′(f0)=(f0−1−A)′=−f0−2=−f021
根据牛顿迭代
有 f ≡ f 0 − 1 f 0 − A − 1 f 0 2 ( m o d x 2 n ) ≡ 2 f 0 − A f 0 2 ( m o d 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) f≡f0−−f021f01−A( mod x2n)≡2f0−Af02( mod x2n)
至此,我们推完了,拿出来,写在下面
f ≡ 2 f 0 − A f 0 2 ( m o d x 2 n ) f\equiv2f_0-Af_0^2\left(\ mod\ x^{2n}\right) f≡2f0−Af02( 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 g f=ln\ g f=ln g的前 n n n项
我们对其求导
f ′ ( x ) = g ′ ( x ) g ( x ) f'\left( x\right) =\dfrac {g'(x)}{g\left( x\right) } f′(x)=g(x)g′(x)
复合求导
ln -> u
g -> v
这样,我们只要对 g g g求逆,然后对 g g g求导得 g ′ g' g′,之后我们就得到了 f ′ f' 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 f − A g(f)=ln\ f-A g(f)=ln f−A
我们知道 f f f的常数项为 1 1 1
对 g g g求导, g ′ ( f 0 ) = 1 f 0 g'(f_0)=\dfrac{1}{f_0} g′(f0)=f01
根据牛顿迭代
f ≡ f − l n f 0 − A 1 f 0 ( m o d x 2 n ) ≡ f 0 ( 1 − ln f 0 + A ) ( m o d x 2 n ) \begin{aligned}f&\equiv f-\dfrac {lnf_{0}-A}{\dfrac {1}{f_{0}}}\left(\ mod\ x^{2n}\right)\\ &\equiv f_{0}\left( 1-\ln f_{0}+A\right) \left(\ mod\ x^{2n}\right) \end{aligned} f≡f−f01lnf0−A( mod x2n)≡f0(1−lnf0+A)( mod x2n)
至此,我们推完了,拿出来,写在下面
f ≡ f 0 ( 1 − ln f 0 + A ) ( m o d x 2 n ) f\equiv f_{0}\left( 1-\ln f_{0}+A\right) \left(\ mod\ x^{2n}\right) f≡f0(1−lnf0+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)=f2−A
我们知道 f f f的常数项为 A A A常数项的平方根
可用二次剩余方法解
对 g g g求导 g ′ ( f 0 ) = 2 f 0 g'(f_0)=2f_0 g′(f0)=2f0
根据牛顿迭代
f ≡ f 0 − f 0 2 − A 2 f 0 ( m o d x 2 n ) f\equiv f_{0}-\dfrac {f^{2}_{0}-A}{2f_{0}}\left(\ mod\ x^{2n}\right) f≡f0−2f0f02−A( mod x2n)
时间复杂度 O ( n l o g n ) O(nlogn) O(nlogn)
如有哪里讲得不是很明白或是有错误,欢迎指正
如您喜欢的话不妨点个赞收藏一下吧
您的鼓励是博主的动力