也许更好的阅读体验
前置知识
FFT
牛顿迭代
求导
定义
简单来说,形如 a0x0+a1x1+a2x2+⋯+anxn,的代数表达式叫做多项式
可以记作 f(x)=a0x0+a1x1+a2x2+⋯+anxn
其中 a0,a1,⋯,an叫做多项式的系数, x是一个不定元,不表示任何值
不定元在多项式中最大项的次数称作多项式的次数
多项式的表示法
系数表示法
像刚刚我们提到的那些多项式,都是以系数形式表示的,也就是将 n次多项式 f(x)的系数 a0,a1,⋯,an看作 n+1维向量 a =(a0,a1,⋯,an),其系数表示就是向量 a
点值表示法
如果 n+1个不同的数 x0,x1,⋯,xn对多项式进行求值,得到 f(x0),f(x1),⋯,f(xn),那么就称 {(xi,f(xi))∣0≤i≤n,i∈Z}为多项式 f(x)的点值表示
注意, n+1个点值只能表示 n次多项式
多项式的基本运算
两个多项式 f(x)=i=0∑∞aixi, g(x)=i=0∑∞bixi
加法
h(x)=f(x)+g(x)=i=0∑∞(ai+bi)xi
乘法
f(x)=f(x)∗g(x)=i=0∑∞j+k=i∑(aj⋅bk)xi
多项式的其它运算
基本套路
从现在开始要用到牛顿迭代了
一般基本套路是运用牛顿迭代倍增求解
- 先构造一个复合多项式 g,使 g(f)=0
- 对 g求导
- 牛顿迭代
为了方便阅读,下面把牛顿迭代再贴一次
f≡f0−g′(f0)g(f0)( mod x2n)
有一个多项式 A
多项式求逆
设 f=A1,求 f的前 n项
构造 g(f)=f1−A=0,我们知道 f的常数项为 A的常数项的逆元,接下来开始迭代
此时有 g′(f0)=−f021
g′(f0)=(f0−1−A)′,将 A看为常数项
g′(f0)=(f0−1−A)′=−f0−2=−f021
根据牛顿迭代
有 f≡f0−−f021f01−A( mod x2n)≡2f0−Af02( mod x2n)
至此,我们推完了,拿出来,写在下面
f≡2f0−Af02( mod x2n)
现在我们可以由 f0去推 f,每次这个模数 xy的 y会乘以2,也就是说是倍增的
初始时 n=1
时间复杂度 O(nlogn)
多项式求ln
求 f=ln g的前 n项
我们对其求导
f′(x)=g(x)g′(x)
复合求导
ln -> u
g -> v
这样,我们只要对 g求逆,然后对 g求导得 g′,之后我们就得到了 f′,再对其积分得到 f
求导和积分都是 O(n)的
时间复杂度 O(nlogn)
多项式exp
求 f=eA ( A的常数项为 0)的前 n项
构造 g(f)=ln f−A
我们知道 f的常数项为 1
对 g求导, g′(f0)=f01
根据牛顿迭代
f≡f−f01lnf0−A( mod x2n)≡f0(1−lnf0+A)( mod x2n)
至此,我们推完了,拿出来,写在下面
f≡f0(1−lnf0+A)( mod x2n)
还是倍增
求 ln和多项式乘法都是 O(nlogn)的,加法是 O(n)的
时间复杂度 O(nlogn)
多项式开方
求 f=A ( A的常数项存在平方根)的前 n项
构造 g(f)=f2−A
我们知道 f的常数项为 A常数项的平方根
可用二次剩余方法解
对 g求导 g′(f0)=2f0
根据牛顿迭代
f≡f0−2f0f02−A( mod x2n)
时间复杂度 O(nlogn)
如有哪里讲得不是很明白或是有错误,欢迎指正
如您喜欢的话不妨点个赞收藏一下吧
如能得到推荐博主就更开心了
您的鼓励是博主的动力