一年之后好不容易又有机会学多项式,接着[学习笔记]多项式相关运算1继续说。
常数巨大警告…
多项式求导&积分
计算
没学过导数积分的可以看看这篇文章。
嗯?里面没有不定积分…所以你可以直接看下面的两个式子:
F
′
(
x
)
=
∑
i
=
1
n
i
a
i
x
i
−
1
F'(x)=\sum^{n}_{i=1}ia_ix^{i-1}
F′(x)=i=1∑niaixi−1
∫
F
(
x
)
=
∑
i
=
1
n
a
i
x
i
+
1
i
+
1
\int F(x)=\sum^{n}_{i=1}\frac{a_ix^{i+1}}{i+1}
∫F(x)=i=1∑ni+1aixi+1
容易发现它们是互逆运算。
直接算就行了。
复杂度:
O
(
n
)
O(n)
O(n)
模板
void ploy_der(int len,int *a,int *b){
for(int i=1;i<len;i++)b[i-1]=mul(i,a[i]);
b[len-1]=0;
}
void ploy_cal(int len,int *a,int *b){
for(int i=1;i<len;i++)b[i]=mul(a[i-1],fst_pow(i,MOD-2));
b[0]=0;
}
牛顿迭代
简介
牛顿迭代并不算一种多项式运算,而是一种解多项式的方法。
使用这种方法可以很容易计算多项式开根及exp等。
在学习牛顿迭代之前,你可能还要学习:
[学习笔记]泰勒多项式快速入门
问题描述
已知函数
G
(
x
)
G(x)
G(x),求一个多项式
F
(
x
)
m
o
d
x
n
F(x)\bmod \: x^n
F(x)modxn,满足:
G
(
F
(
x
)
)
≡
0
(
m
o
d
x
n
)
G(F(x))\equiv 0(\bmod \: x^n)
G(F(x))≡0(modxn)
分治
其实求
m
o
d
x
n
\bmod x^n
modxn大多都是分治法。
当
n
=
1
n=1
n=1是,
G
(
F
(
x
)
)
≡
0
(
m
o
d
x
)
G(F(x))\equiv 0(\bmod \: x)
G(F(x))≡0(modx)这需要单独求。
n
>
1
n>1
n>1按照套路,假设
G
(
F
0
(
x
)
)
≡
0
(
m
o
d
x
⌈
n
2
⌉
)
G(F_0(x))\equiv 0(\bmod \: x^{\lceil \frac{n}{2}\rceil})
G(F0(x))≡0(modx⌈2n⌉)的
F
0
(
x
)
F_0(x)
F0(x)已经解出。
注意到泰勒展开可以将
G
(
F
(
x
)
)
G(F(x))
G(F(x))中的
F
(
x
)
F(x)
F(x)换掉,我们考虑在
F
0
(
x
)
F_0(x)
F0(x)处泰勒展开
G
(
F
(
x
)
)
G(F(x))
G(F(x)):
G
(
F
(
x
)
)
=
G
(
F
0
(
x
)
)
+
G
′
(
F
0
(
x
)
)
1
!
(
F
(
x
)
−
F
0
(
x
)
)
+
G
′
′
(
F
0
(
x
)
)
2
!
(
F
(
x
)
−
F
0
(
x
)
)
2
+
.
.
.
G(F(x))=G(F_0(x))+\frac{G'(F_0(x))}{1!}(F(x)-F_0(x))+\frac{G''(F_0(x))}{2!}(F(x)-F_0(x))^2+...
G(F(x))=G(F0(x))+1!G′(F0(x))(F(x)−F0(x))+2!G′′(F0(x))(F(x)−F0(x))2+...
根据约定我们知道
F
(
x
)
−
F
0
(
x
)
F(x)-F_0(x)
F(x)−F0(x)的后
⌈
n
2
⌉
\lceil \frac{n}{2}\rceil
⌈2n⌉项等于
0
0
0,而在
(
F
(
x
)
−
F
0
(
x
)
)
2
(F(x)-F_0(x))^2
(F(x)−F0(x))2时显然
0
−
(
n
−
1
)
0-(n-1)
0−(n−1)项都为
0
0
0,在模意义下可以直接去掉。
因此有
G
(
F
(
x
)
)
≡
G
(
F
0
(
x
)
)
+
G
′
(
F
0
(
x
)
)
1
!
(
F
(
x
)
−
F
0
(
x
)
)
(
m
o
d
x
n
)
G(F(x))\equiv G(F_0(x))+\frac{G'(F_0(x))}{1!}(F(x)-F_0(x))(\bmod \: x^n)
G(F(x))≡G(F0(x))+1!G′(F0(x))(F(x)−F0(x))(modxn)
由于定义又有
G
(
F
(
x
)
)
≡
0
(
m
o
d
x
n
)
G(F(x))\equiv 0(\bmod \: x^n)
G(F(x))≡0(modxn)。
于是得到
F
(
x
)
=
F
0
(
x
)
−
G
(
F
0
(
x
)
)
G
′
(
F
0
(
x
)
)
(
m
o
d
x
n
)
F(x)=F_0(x)-\frac{G(F_0(x))}{G'(F_0(x))}(\bmod \: x^n)
F(x)=F0(x)−G′(F0(x))G(F0(x))(modxn)
有了这东西我们其实就可以直接用公式了。
多项式开根
问题描述
给定一个多项式
A
(
x
)
A(x)
A(x)
找到另一个多项式
B
(
x
)
B(x)
B(x)
使得
B
2
(
x
)
≡
A
(
x
)
(
m
o
d
B^2(x)≡A(x)(mod
B2(x)≡A(x)(mod
x
n
)
x^n)
xn)
则称
B
(
x
)
B(x)
B(x)为
A
(
x
)
A(x)
A(x)在
m
o
d
mod
mod
x
n
x^n
xn意义下的平方根。
保证
a
0
=
1
a_0=1
a0=1。
[如果没有这个条件,我们可能还需要一个二次剩余才能够解决]
分治
我们再次考虑使用分治来解决这个问题。
n
=
1
n=1
n=1时,根据题目的常数项就为
1
1
1。
n
>
1
n>1
n>1时
首先知道
B
2
(
x
)
≡
A
(
x
)
(
m
o
d
B^2(x)≡A(x)(mod
B2(x)≡A(x)(mod
x
n
)
x^n)
xn)
设
B
′
(
x
)
B'(x)
B′(x)为
A
(
x
)
A(x)
A(x)在
m
o
d
mod
mod
x
⌈
n
2
⌉
x^{\lceil \frac{n}{2} \rceil}
x⌈2n⌉的平方根,假设我们现在已经知道
B
′
(
x
)
B'(x)
B′(x),则:
B
′
2
(
x
)
≡
A
(
x
)
(
m
o
d
B'^2(x)≡A(x)(mod
B′2(x)≡A(x)(mod
x
⌈
n
2
⌉
)
x^{\lceil \frac{n}{2} \rceil})
x⌈2n⌉)
移项
B
′
2
(
x
)
−
A
(
x
)
≡
0
(
m
o
d
B'^2(x)-A(x)≡0(mod
B′2(x)−A(x)≡0(mod
x
⌈
n
2
⌉
)
x^{\lceil \frac{n}{2} \rceil})
x⌈2n⌉)
两边同时平方
B
′
4
(
x
)
−
2
B
′
2
(
x
)
A
(
x
)
+
A
2
(
x
)
≡
0
(
m
o
d
B'^4(x)-2B'^2(x)A(x)+A^2(x)≡0(mod
B′4(x)−2B′2(x)A(x)+A2(x)≡0(mod
x
n
)
x^n)
xn)
前文已经说明为什么平方可以将膜长平方,这里不做赘述。
两边同时加上
4
B
′
2
(
x
)
A
(
x
)
4B'^2(x)A(x)
4B′2(x)A(x)得
B
′
4
(
x
)
+
2
B
′
2
(
x
)
A
(
x
)
+
A
2
(
x
)
≡
4
B
′
2
(
x
)
A
(
x
)
(
m
o
d
B'^4(x)+2B'^2(x)A(x)+A^2(x)≡4B'^2(x)A(x)(mod
B′4(x)+2B′2(x)A(x)+A2(x)≡4B′2(x)A(x)(mod
x
n
)
x^n)
xn)
配方
(
B
′
2
(
x
)
+
A
(
x
)
)
2
≡
4
B
′
2
(
x
)
A
(
x
)
(
m
o
d
(B'^2(x)+A(x))^2≡4B'^2(x)A(x)(mod
(B′2(x)+A(x))2≡4B′2(x)A(x)(mod
x
n
)
x^n)
xn)
移项
(
B
′
2
(
x
)
+
A
(
x
)
2
B
′
(
x
)
)
2
≡
A
(
x
)
(
m
o
d
(\frac{B'^2(x)+A(x)}{2B'(x)})^2≡A(x)(mod
(2B′(x)B′2(x)+A(x))2≡A(x)(mod
x
n
)
x^n)
xn)
对比式子
B
2
(
x
)
≡
A
(
x
)
(
m
o
d
B^2(x)≡A(x)(mod
B2(x)≡A(x)(mod
x
n
)
x^n)
xn)
可以发现
B
(
x
)
≡
B
′
2
(
x
)
+
A
(
x
)
2
B
′
(
x
)
(
m
o
d
B(x)≡\frac{B'^2(x)+A(x)}{2B'(x)}(mod
B(x)≡2B′(x)B′2(x)+A(x)(mod
x
n
)
x^n)
xn)。
那么我们直接求
(
2
B
′
(
x
)
)
−
1
(
B
′
2
(
x
)
+
A
(
x
)
)
(2B'(x))^{-1}(B'^2(x)+A(x))
(2B′(x))−1(B′2(x)+A(x))即可。
需要用到一个逆元和几个乘法。
分析一下复杂度:
T
(
n
)
=
T
(
n
2
)
+
O
(
n
l
o
g
n
)
=
O
(
n
l
o
g
n
)
T(n)=T(\frac{n}{2})+O(nlogn)=O(nlogn)
T(n)=T(2n)+O(nlogn)=O(nlogn)
牛顿迭代
我们直接套公式就好了
首先我们构造函数
G
(
B
(
x
)
)
=
B
2
(
x
)
−
A
(
x
)
G(B(x))=B^2(x)-A(x)
G(B(x))=B2(x)−A(x)。
再求
G
′
(
B
(
x
)
)
=
2
B
(
x
)
G'(B(x))=2B(x)
G′(B(x))=2B(x)[把
A
(
x
)
A(x)
A(x)看成常数项]。
代入公式:
B
(
x
)
=
B
0
(
x
)
−
G
(
B
0
(
x
)
)
G
′
(
B
0
(
x
)
)
B
(
x
)
=
B
0
2
(
x
)
+
A
(
x
)
2
B
0
(
x
)
(
m
o
d
x
n
)
B(x)=B_0(x)-\frac{G(B_0(x))}{G'(B_0(x))}\\ B(x)=\frac{B_0^2(x)+A(x)}{2B_0(x)}(\bmod \: x^n)
B(x)=B0(x)−G′(B0(x))G(B0(x))B(x)=2B0(x)B02(x)+A(x)(modxn)
你会发现我们得到的结果是一样的…
模板
void ploy_sqr(int n,int *a,int *b){
static int c[MAXN+5],F[MAXN+5];
if(n==1){b[0]=1;return ;}
ploy_sqr((n+1)>>1,a,b);
fill(F,F+(n<<1),0),ploy_inv(n,b,F);
int len=1;while(len<(n<<1))len<<=1;
copy(a,a+n,c);
fill(c+n,c+len,0),NTT(c,len,1);
fill(F+n,F+len,0),NTT(F,len,1);
for(int i=0;i<len;i++)c[i]=mul(mul(c[i],inv2),F[i]);
NTT(c,len,-1);
for(int i=0;i<n;i++)
b[i]=add(mul(b[i],inv2),c[i]);
}
多项式ln
问题描述
给出
n
−
1
n-1
n−1 次多项式
A
(
x
)
A(x)
A(x),求一个
m
o
d
x
n
\bmod{\:x^n}
modxn下的多项式
B
(
x
)
B(x)
B(x),满足
B
(
x
)
≡
ln
A
(
x
)
B(x) \equiv \ln A(x)
B(x)≡lnA(x).
在
mod
998244353
\text{mod } 998244353
mod 998244353 下进行,且
a
i
∈
[
0
,
998244353
]
∩
Z
a_i \in [0, 998244353] \cap \mathbb{Z}
ai∈[0,998244353]∩Z
n
≤
1
0
5
n\leq 10^5
n≤105
保证
a
0
=
1
a_0=1
a0=1
求导
思路很简单…
为了书写方便我们令
f
(
x
)
=
ln
x
f(x)=\ln x
f(x)=lnx。
那么原式就为
B
(
x
)
≡
f
(
A
(
x
)
)
(
m
o
d
x
n
)
B(x)\equiv f(A(x))(\bmod{\:x^n})
B(x)≡f(A(x))(modxn)。
ln
x
\ln x
lnx有一个很重要的性质就是它的导数为
1
x
\frac{1}{x}
x1,这样我们就把
ln
\ln
ln去掉了。
因此对原式求导[用到了复合函数求导,上一部分有]:
B
′
(
x
)
≡
f
′
(
A
(
x
)
)
A
′
(
x
)
(
m
o
d
x
n
)
B
′
(
x
)
≡
A
′
(
x
)
A
(
x
)
(
m
o
d
x
n
)
B
(
x
)
≡
∫
A
′
(
x
)
A
(
x
)
(
m
o
d
x
n
)
B'(x)\equiv f'(A(x))A'(x)(\bmod{\:x^n})\\ B'(x)\equiv \frac{A'(x)}{A(x)}(\bmod{\:x^n})\\ B(x)\equiv \int \frac{A'(x)}{A(x)}(\bmod{\:x^n})\\
B′(x)≡f′(A(x))A′(x)(modxn)B′(x)≡A(x)A′(x)(modxn)B(x)≡∫A(x)A′(x)(modxn)
于是多项式导数&积分+多项式求逆就好了。
细节:
其实我们求导+积分是会把常数项给去掉的,所以这题钦定了常数项为 a 0 = 1 a_0=1 a0=1,这时候 ln ( 1 ) = 0 \ln(1)=0 ln(1)=0,所以我们直接在积分结束后将常数项设为 0 0 0即可。
复杂度: O ( n log n ) O(n\log n) O(nlogn)
模板
void ploy_ln(int n,int *a,int *b){
static int A[MAXN+5],B[MAXN+5];
fill(A,A+(n<<1),0),fill(B,B+(n<<1),0);
ploy_der(n,a,A),ploy_inv(n,a,B);
int len=1;while(len<(n<<1))len<<=1;
NTT(A,len,1),NTT(B,len,1);
for(int i=0;i<len;i++)A[i]=mul(A[i],B[i]);
NTT(A,len,-1),ploy_cal(n,A,b);
}
多项式exp
问题描述
给出
n
−
1
n−1
n−1 次多项式
A
(
x
)
A(x)
A(x),求一个
m
o
d
x
n
\bmod{\:x^n}
modxn下的多项式
B
(
x
)
B(x)
B(x),满足
B
(
x
)
≡
e
A
(
x
)
B(x) \equiv \text e^{A(x)}
B(x)≡eA(x)。系数对
998244353
998244353
998244353 取模。
保证
a
0
=
0
a_0=0
a0=0[跟上面一样的道理]
牛顿迭代
转化一下式子:
ln
B
(
x
)
−
A
(
x
)
≡
0
(
m
o
d
x
n
)
\ln B(x) -A(x)\equiv 0(\bmod{\:x^n})
lnB(x)−A(x)≡0(modxn)
同样地,构造函数
G
(
B
(
x
)
)
=
ln
B
(
x
)
−
A
(
x
)
G(B(x))=\ln B(x) -A(x)
G(B(x))=lnB(x)−A(x)。
求
G
′
(
B
(
x
)
)
=
1
B
(
x
)
G'(B(x))=\frac{1}{B(x)}
G′(B(x))=B(x)1。
B
(
x
)
=
B
0
(
x
)
−
G
(
B
0
(
x
)
)
G
′
(
B
0
(
x
)
)
B
(
x
)
=
B
0
(
x
)
(
1
−
ln
B
0
(
x
)
+
A
(
x
)
)
(
m
o
d
x
n
)
B(x)=B_0(x)-\frac{G(B_0(x))}{G'(B_0(x))}\\ B(x)=B_0(x)(1-\ln B_0(x)+A(x))(\bmod \: x^n)
B(x)=B0(x)−G′(B0(x))G(B0(x))B(x)=B0(x)(1−lnB0(x)+A(x))(modxn)
然后就没了,需要用到多项式ln和。
复杂度同样是
T
(
n
)
=
T
(
n
2
)
+
O
(
n
l
o
g
n
)
=
O
(
n
l
o
g
n
)
T(n)=T(\frac{n}{2})+O(nlogn)=O(nlogn)
T(n)=T(2n)+O(nlogn)=O(nlogn)。
模板
void ploy_exp(int n,int *a,int *b){
static int F[MAXN+5];
if(n==1){b[0]=1;return ;}
ploy_exp((n+1)>>1,a,b);
fill(F,F+(n<<1),0),ploy_ln(n,b,F);
for(int i=0;i<n;i++)F[i]=dec(a[i],F[i]);
F[0]=add(F[0],1);
int len=1;while(len<(n<<1))len<<=1;
fill(b+n,b+len,0),NTT(b,len,1);
fill(F+n,F+len,0),NTT(F,len,1);
for(int i=0;i<len;i++)b[i]=mul(b[i],F[i]);
NTT(b,len,-1),fill(b+n,b+len,0);
}
多项式快速幂
问题描述
给定一个
n
−
1
n-1
n−1 次多项式
A
(
x
)
A(x)
A(x),求一个在
m
o
d
x
n
\bmod\ x^n
mod xn意义下的多项式
B
(
x
)
B(x)
B(x),使得
B
(
x
)
≡
A
k
(
x
)
(
m
o
d
x
n
)
B(x)\equiv A^k(x) \ (\bmod\ x^n)
B(x)≡Ak(x) (mod xn)。
多项式的系数在
m
o
d
998244353
\bmod\ 998244353
mod 998244353的意义下进行运算。
计算
很简单,我们之前学了求ln,exp,所以直接换底就行了。
G
(
x
)
=
F
k
(
x
)
ln
G
(
x
)
=
k
ln
F
(
x
)
G
(
x
)
=
e
k
ln
F
(
x
)
G(x)=F^k(x)\\ \ln G(x)=k\ln F(x)\\ G(x)=e^{k\ln F(x)}
G(x)=Fk(x)lnG(x)=klnF(x)G(x)=eklnF(x)
复杂度:
O
(
n
log
n
)
O(n\log n)
O(nlogn)。
模板
void ploy_ksm(int n,int k,int *a,int *b){
static int C[MAXN+5];
ploy_ln(n,a,C);
for(int i=0;i<n;i++)C[i]=mul(C[i],k);
ploy_exp(n,C,b);
}
拉格朗日反演
简介
若两个多项式
f
(
x
)
,
g
(
x
)
f(x),g(x)
f(x),g(x),满足都没有常数项且一次项系数互为逆元,且
f
(
g
(
x
)
)
=
x
f(g(x))=x
f(g(x))=x,那么称
f
(
x
)
f(x)
f(x)为
g
(
x
)
g(x)
g(x)的复合逆。
根据反演
这个名字我们也知道
f
(
g
(
x
)
)
f(g(x))
f(g(x))会等于
g
(
f
(
x
)
)
g(f(x))
g(f(x))。
然后就有结论:
[ x n ] f ( x ) = 1 n [ x n − 1 ] ( x g ( x ) ) n [x^n]f(x)=\frac{1}{n}[x^{n-1}](\frac{x}{g(x)})^n [xn]f(x)=n1[xn−1](g(x)x)n
还有一个叫扩展拉格朗日反演的东西:
[ x n ] H ( F ( x ) ) = 1 n [ x n − 1 ] H ′ ( x ) ( x G ( x ) ) n [x^n]H(F(x))=\frac{1}{n}[x^{n-1}]H'(x)(\frac{x}{G(x)})^n [xn]H(F(x))=n1[xn−1]H′(x)(G(x)x)n
PS: [ x n ] f ( x ) [x^n]f(x) [xn]f(x)表示 f ( x ) f(x) f(x)第 n n n项的系数。
证明???很多知识都没学过…就算了吧…
细节:
注意到根据定义 g ( x ) g(x) g(x)是没有常数项的,因此没有 g ( x ) g(x) g(x)的逆元,所以我们一般在做拉格朗日反演之前对多项式向右平移一位再求逆。
复杂度: O ( n log n ) O(n\log n) O(nlogn)
模板
int ploy_Lagrange(int n,int k,int *a){
static int C[MAXN+5],D[MAXN+5];
ploy_inv(n,a,C);
ploy_ksm(n,k,C,D);
return mul(D[k-1],pinv[k]);
}
简单总结-多项式全家桶
名称 | 公式 | 解决方法 | 复杂度 |
---|---|---|---|
多项式乘法 | F ( x ) = A ( x ) B ( x ) F(x)=A(x)B(x) F(x)=A(x)B(x) | NTT/FFT | O ( n log n ) O(n\log n) O(nlogn) |
多项式求逆 | B ( x ) ≡ 2 B 1 ( x ) − B 1 2 ( x ) A ( x ) ( m o d x n ) B(x)\equiv2B_1(x)-B_1^2(x)A(x)(\mod x^n) B(x)≡2B1(x)−B12(x)A(x)(modxn) | 分治+多项式乘法 | O ( n log n ) O(n\log n) O(nlogn) |
多项式除法 | A R ( x ) B R − 1 ( x ) ≡ D R ( x ) ( m o d x n − m + 1 ) A^R(x)B^{R^{-1}}(x)≡D^R(x)(\mod x^{n-m+1}) AR(x)BR−1(x)≡DR(x)(modxn−m+1) | 多项式求逆 | O ( n log n ) O(n\log n) O(nlogn) |
多项式取模 | P ( x ) = A ( x ) − D ( x ) B ( x ) P(x)=A(x)-D(x)B(x) P(x)=A(x)−D(x)B(x) | 多项式乘法 | O ( n log n ) O(n\log n) O(nlogn) |
多项式求导 | F ′ ( x ) = ∑ i = 1 n i a i x i − 1 F'(x)=\sum^{n}_{i=1}ia_ix^{i-1} F′(x)=∑i=1niaixi−1直接算 | —— | O ( n ) O(n) O(n) |
多项式积分 | ∫ F ( x ) = ∑ i = 1 n a i x i + 1 i + 1 \int F(x)=\sum^{n}_{i=1}\frac{a_ix^{i+1}}{i+1} ∫F(x)=∑i=1ni+1aixi+1直接算 | —— | O ( n ) O(n) O(n) |
多项式开根 | B ( x ) ≡ B 1 2 ( x ) + A ( x ) 2 B 1 ( x ) ( m o d x n ) B(x)≡\frac{B_1^2(x)+A(x)}{2B_1(x)}(\mod x^n) B(x)≡2B1(x)B12(x)+A(x)(modxn) | 分治+多项式求逆 | O ( n log n ) O(n\log n) O(nlogn) |
多项式ln | l n ( F ( x ) ) = ∫ F ′ ( x ) F − 1 ( x ) ln(F(x))=\int F'(x)F^{-1}(x) ln(F(x))=∫F′(x)F−1(x) | 多项式求逆 | O ( n log n ) O(n\log n) O(nlogn) |
多项式exp | F ( x ) ≡ F 0 ( x ) ( 1 − ln F 0 ( x ) + A ( x ) ) ( m o d x n ) F(x)\equiv F_0(x)(1-\ln F_0(x)+A(x))(\mod x^n) F(x)≡F0(x)(1−lnF0(x)+A(x))(modxn) | 多项式ln | O ( n log n ) O(n\log n) O(nlogn) |
多项式多点求值
分成点集 X [ 0 ] = { x 0 , x 1 , x 2 , . . . , x ⌊ n 2 ⌋ } X^{[0]}=\{x_0,x_1,x_2,...,x_{\lfloor \frac{n}{2} \rfloor}\} X[0]={x0,x1,x2,...,x⌊2n⌋}
X [ 1 ] = { x ⌊ n 2 ⌋ + 1 , x ⌊ n 2 ⌋ + 2 , x ⌊ n 2 ⌋ + 3 , . . . , x n − 1 } X^{[1]}=\{x_{\lfloor \frac{n}{2} \rfloor+1},x_{\lfloor \frac{n}{2} \rfloor+2},x_{\lfloor \frac{n}{2} \rfloor+3},...,x_{n-1}\} X[1]={x⌊2n⌋+1,x⌊2n⌋+2,x⌊2n⌋+3,...,xn−1}
构造多项式: P [ 0 ] ( x ) = ∏ i = 0 ⌊ n 2 ⌋ ( x − x i ) P^{[0]}(x)=\prod^{\lfloor \frac{n}{2} \rfloor}_{i=0}{(x-x_i)} P[0](x)=∏i=0⌊2n⌋(x−xi)和 P [ 1 ] ( x ) = ∏ i = ⌊ n 2 ⌋ + 1 n ( x − x i ) P^{[1]}(x)=\prod^{n}_{i=\lfloor \frac{n}{2} \rfloor+1}{(x-x_i)} P[1](x)=∏i=⌊2n⌋+1n(x−xi)
有 A [ 0 ] ( x ) ≡ A ( x ) ( m o d P [ 0 ] ( x ) ) A^{[0]}(x)≡A(x)(\bmod P^{[0]}(x)) A[0](x)≡A(x)(modP[0](x))和 A [ 1 ] ( x ) ≡ A ( x ) ( m o d P [ 1 ] ( x ) ) A^{[1]}(x)≡A(x)(\bmod P^{[1]}(x)) A[1](x)≡A(x)(modP[1](x))
分治即可(打不打得出来我也不知道了qwq…)
复杂度: O ( n log 2 n ) O(n\log^2 n) O(nlog2n)
多项式快速插值
分成点集 X [ 0 ] = { ( x 0 , y 0 ) , ( x 1 , y 1 ) , . . . , ( x ⌊ n 2 ⌋ , y ⌊ n 2 ⌋ ) } X^{[0]}=\{(x_0,y_0),(x_1,y_1),...,(x_{\lfloor \frac{n}{2} \rfloor},y_{\lfloor \frac{n}{2} \rfloor})\} X[0]={(x0,y0),(x1,y1),...,(x⌊2n⌋,y⌊2n⌋)}
X [ 1 ] = { ( x ⌊ n 2 ⌋ + 1 , y ⌊ n 2 ⌋ + 1 ) , ( x ⌊ n 2 ⌋ + 2 , y ⌊ n 2 ⌋ + 2 ) , . . . , ( x n − 1 , y n − 1 ) } X^{[1]}=\{(x_{\lfloor \frac{n}{2} \rfloor+1},y_{\lfloor \frac{n}{2} \rfloor+1}),(x_{\lfloor \frac{n}{2} \rfloor+2},y_{\lfloor \frac{n}{2} \rfloor+2}),...,(x_{n-1},y_{n-1})\} X[1]={(x⌊2n⌋+1,y⌊2n⌋+1),(x⌊2n⌋+2,y⌊2n⌋+2),...,(xn−1,yn−1)}
构造多项式: X [ 0 ] = { ( x 0 , y 0 ) , ( x 1 , y 1 ) , . . . , ( x ⌊ n 2 ⌋ , y ⌊ n 2 ⌋ ) } X^{[0]}=\{(x_0,y_0),(x_1,y_1),...,(x_{\lfloor \frac{n}{2} \rfloor},y_{\lfloor \frac{n}{2} \rfloor})\} X[0]={(x0,y0),(x1,y1),...,(x⌊2n⌋,y⌊2n⌋)}
X [ 1 ] = { ( x ⌊ n 2 ⌋ + 1 , y ⌊ n 2 ⌋ + 1 ) , ( x ⌊ n 2 ⌋ + 2 , y ⌊ n 2 ⌋ + 2 ) , . . . , ( x n − 1 , y n − 1 ) } X^{[1]}=\{(x_{\lfloor \frac{n}{2} \rfloor+1},y_{\lfloor \frac{n}{2} \rfloor+1}),(x_{\lfloor \frac{n}{2} \rfloor+2},y_{\lfloor \frac{n}{2} \rfloor+2}),...,(x_{n-1},y_{n-1})\} X[1]={(x⌊2n⌋+1,y⌊2n⌋+1),(x⌊2n⌋+2,y⌊2n⌋+2),...,(xn−1,yn−1)}
设 A ( x ) , A [ 1 ] ( x ) A(x),A^{[1]}(x) A(x),A[1](x)都未知。
有 A [ 1 ] ( x i ) = y i − A [ 0 ] ( x i ) P ( x i ) A^{[1]}(x_i)=\frac{y_i-A{[0]}(x_i)}{P(x_i)} A[1](xi)=P(xi)yi−A[0](xi)
可以得到一个新的点集 X ′ [ 1 ] X'^{[1]} X′[1]。
用插值法求出 A [ 1 ] ( x ) A^{[1]}(x) A[1](x),再求 A ( x ) A(x) A(x)。
[现在都没调出来…]
复杂度: O ( n log 2 n ) O(n\log^2 n) O(nlog2n)
感谢
感谢以下dalao的帮助:
1.Miskcoo大佬:牛顿迭代法在多项式运算的应用
2.CaptainHarryChen学长:多项式的各种操作(逆元,除法,取模,开根,对数,exp,多点求值,插值,牛顿迭代法)
3.alan_cty大佬:拉格朗日反演
同时,也用作学习资料供大家参考。