多项式求逆元
已知多项式
F
(
x
)
F(x)
F(x),求
F
(
x
)
F(x)
F(x)在保留前n项(当然n要是2的次幂)的情况下的逆元
G
(
x
)
G(x)
G(x),也就是:
F
(
x
)
G
(
x
)
≡
1
(
m
o
d
x
n
)
F(x)G(x)\equiv 1 \pmod{x^n}
F(x)G(x)≡1(modxn)
首先,如果
n
=
1
n=1
n=1,那么直接就是常数项的逆元,
如果
n
>
1
n>1
n>1,那么怎么办?
设:
G
′
(
x
)
G'(x)
G′(x)使得
F
(
x
)
G
′
(
x
)
≡
1
(
m
o
d
x
n
/
2
)
F(x)G'(x)\equiv 1 \pmod{x^{n/2}}
F(x)G′(x)≡1(modxn/2),且我们已知
G
′
(
x
)
G'(x)
G′(x)
第一个式子可以变成:
F
(
x
)
G
(
x
)
≡
1
(
m
o
d
x
n
/
2
)
F(x)G(x)\equiv 1 \pmod{x^{n/2}}
F(x)G(x)≡1(modxn/2)
(把模数开了个方,依旧成立)
把两个式子相减:
F
(
x
)
(
G
(
x
)
−
G
′
(
x
)
)
≡
0
(
m
o
d
x
n
/
2
)
F(x)(G(x)-G'(x))\equiv 0 \pmod{x^{n/2}}
F(x)(G(x)−G′(x))≡0(modxn/2)
G
(
x
)
−
G
′
(
x
)
≡
0
(
m
o
d
x
n
/
2
)
G(x)-G'(x)\equiv 0 \pmod{x^{n/2}}
G(x)−G′(x)≡0(modxn/2)
同时平方:(当然模数也平方依旧成立)
(
G
(
x
)
−
G
′
(
x
)
)
2
≡
0
(
m
o
d
x
n
)
(G(x)-G'(x))^2\equiv 0 \pmod{x^n}
(G(x)−G′(x))2≡0(modxn)
G
2
(
x
)
+
G
′
2
(
x
)
−
2
G
(
x
)
G
′
(
x
)
≡
0
(
m
o
d
x
n
)
G^2(x)+G'^2(x)-2G(x)G'(x)\equiv 0 \pmod{x^n}
G2(x)+G′2(x)−2G(x)G′(x)≡0(modxn)
两边同时乘上
F
(
x
)
F(x)
F(x),消掉部分
G
(
x
)
G(x)
G(x):
G
(
x
)
+
G
′
2
(
x
)
F
(
x
)
−
2
G
′
(
x
)
≡
0
(
m
o
d
x
n
)
G(x)+G'^2(x)F(x)-2G'(x)\equiv 0 \pmod{x^n}
G(x)+G′2(x)F(x)−2G′(x)≡0(modxn)
G
(
x
)
≡
2
G
′
(
x
)
−
G
′
2
(
x
)
F
(
x
)
(
m
o
d
x
n
)
G(x)\equiv 2G'(x)-G'^2(x)F(x) \pmod{x^n}
G(x)≡2G′(x)−G′2(x)F(x)(modxn)
那么,
G
(
x
)
G(x)
G(x)就可以快速求出了,
(同时发现,只要常数项有逆元,这个多项式就有逆元)
复杂度:
T
(
n
)
=
T
(
n
/
2
)
+
O
(
n
log
(
n
)
)
=
O
(
n
log
(
n
)
)
T(n)=T(n/2)+O(n\log(n))=O(n\log(n))
T(n)=T(n/2)+O(nlog(n))=O(nlog(n))
多项式开方
多项式的开方同样可以以这种方法做出来,
已知多项式
F
(
x
)
F(x)
F(x),求
F
(
x
)
F(x)
F(x)在保留前n项(当然n要是2的次幂)的情况下的平方根
G
(
x
)
G(x)
G(x),也就是:
G
2
(
x
)
≡
F
(
x
)
(
m
o
d
x
n
)
G^2(x)\equiv F(x) \pmod{x^n}
G2(x)≡F(x)(modxn)
首先,如果
n
=
1
n=1
n=1,那么直接就是常数项的开方,可以暴力枚举,也可以用二次项剩余(CZY的二次剩余Cipolla算法学习小记),
对于
n
>
1
n>1
n>1的情况,
设:
G
′
(
x
)
G'(x)
G′(x)使得
G
′
(
x
)
2
≡
F
(
x
)
(
m
o
d
x
n
/
2
)
G'(x)^2\equiv F(x) \pmod{x^{n/2}}
G′(x)2≡F(x)(modxn/2),且我们已知
G
′
(
x
)
G'(x)
G′(x),
(把平方写在后面好看QuQ)
第一个式子可以变成:
G
2
(
x
)
≡
F
(
x
)
(
m
o
d
x
n
/
2
)
G^2(x)\equiv F(x) \pmod{x^{n/2}}
G2(x)≡F(x)(modxn/2)
(把模数开了个方,依旧成立)
把两个式子相减:
G
2
(
x
)
−
G
′
(
x
)
2
≡
0
(
m
o
d
x
n
/
2
)
G^2(x)-G'(x)^2\equiv 0 \pmod{x^{n/2}}
G2(x)−G′(x)2≡0(modxn/2)
因式分解:
(
G
(
x
)
+
G
′
(
x
)
)
(
G
(
x
)
−
G
′
(
x
)
)
≡
0
(
m
o
d
x
n
/
2
)
(G(x)+G'(x))(G(x)-G'(x))\equiv 0 \pmod{x^{n/2}}
(G(x)+G′(x))(G(x)−G′(x))≡0(modxn/2)
可得
G
(
x
)
G(x)
G(x)有两个解(平方嘛),讨论
G
(
x
)
−
G
′
(
x
)
≡
0
(
m
o
d
x
n
/
2
)
G(x)-G'(x)\equiv 0 \pmod{x^{n/2}}
G(x)−G′(x)≡0(modxn/2)的情况,
G
(
x
)
−
G
′
(
x
)
≡
0
(
m
o
d
x
n
/
2
)
G(x)-G'(x)\equiv 0 \pmod{x^{n/2}}
G(x)−G′(x)≡0(modxn/2)
(历史总是惊人的相识)
同时平方:(当然模数也平方依旧成立)
(
G
(
x
)
−
G
′
(
x
)
)
2
≡
0
(
m
o
d
x
n
)
(G(x)-G'(x))^2\equiv 0 \pmod{x^n}
(G(x)−G′(x))2≡0(modxn)
G
2
(
x
)
+
G
′
(
x
)
2
−
2
G
(
x
)
G
′
(
x
)
≡
0
(
m
o
d
x
n
)
G^2(x)+G'(x)^2-2G(x)G'(x)\equiv 0 \pmod{x^n}
G2(x)+G′(x)2−2G(x)G′(x)≡0(modxn)
因为:
G
2
(
x
)
≡
F
(
x
)
(
m
o
d
x
n
)
G^2(x)\equiv F(x) \pmod{x^n}
G2(x)≡F(x)(modxn)
F
(
x
)
+
G
′
(
x
)
2
−
2
G
(
x
)
G
′
(
x
)
≡
0
(
m
o
d
x
n
)
F(x)+G'(x)^2-2G(x)G'(x)\equiv 0 \pmod{x^n}
F(x)+G′(x)2−2G(x)G′(x)≡0(modxn)
G
(
x
)
≡
F
(
x
)
+
G
′
(
x
)
2
2
G
′
(
x
)
(
m
o
d
x
n
)
G(x)\equiv \frac{F(x)+G'(x)^2}{2G'(x)} \pmod{x^n}
G(x)≡2G′(x)F(x)+G′(x)2(modxn)
那么,
G
(
x
)
G(x)
G(x)就可以快速求出了,
(同时发现,只要常数项是二次项剩余且有逆元,这个多项式就可以开方)
复杂度:
T
(
n
)
=
T
(
n
/
2
)
+
2
∗
O
(
n
log
(
n
)
)
=
O
(
n
log
(
n
)
)
T(n)=T(n/2)+2*O(n\log(n))=O(n\log(n))
T(n)=T(n/2)+2∗O(nlog(n))=O(nlog(n))
多项式取模
已知
A
(
x
)
,
B
(
x
)
A(x),B(x)
A(x),B(x),求
D
(
x
)
=
A
(
x
)
m
o
d
  
B
(
x
)
D(x)=A(x)\mod B(x)
D(x)=A(x)modB(x),
令
A
(
x
)
=
B
(
x
)
C
(
x
)
+
D
(
x
)
A(x)=B(x)C(x)+D(x)
A(x)=B(x)C(x)+D(x)
设
n
=
A
(
x
)
的
次
数
,
m
=
B
(
x
)
的
次
数
n=A(x)的次数,m=B(x)的次数
n=A(x)的次数,m=B(x)的次数,显然有
m
≤
n
m\leq n
m≤n,
上面的等式两边同时乘上
x
n
x^n
xn得:
x
n
A
(
1
x
)
=
x
m
B
(
1
x
)
x
n
−
m
C
(
1
x
)
+
x
n
D
(
1
x
)
x^nA(\frac{1}{x})=x^mB(\frac{1}{x})x^{n-m}C(\frac{1}{x})+x^nD(\frac{1}{x})
xnA(x1)=xmB(x1)xn−mC(x1)+xnD(x1)
(
1
x
\frac{1}{x}
x1的作用相当于是把多项式头尾翻转一下)
设 A ′ ( x ) = x n A ( 1 x ) , B ′ ( x ) = x m B ( 1 x ) , C ′ ( x ) = x n − m C ( 1 x ) , D ′ ( x ) = x n D ( 1 x ) A'(x)=x^nA(\frac{1}{x}),B'(x)=x^mB(\frac{1}{x}),C'(x)=x^{n-m}C(\frac{1}{x}),D'(x)=x^nD(\frac{1}{x}) A′(x)=xnA(x1),B′(x)=xmB(x1),C′(x)=xn−mC(x1),D′(x)=xnD(x1)
可以发现,经过翻转后,
D
′
(
x
)
D'(x)
D′(x)中只有次数
∈
[
n
−
m
+
1
,
n
]
\in[n-m+1,n]
∈[n−m+1,n]的项是有效的,其他项均为0,,
A
′
(
x
)
A'(x)
A′(x)中次数
∈
[
0
,
n
]
\in[0,n]
∈[0,n]的项是有效的,
B
′
(
x
)
B'(x)
B′(x)中次数
∈
[
0
,
m
]
\in[0,m]
∈[0,m]的项是有效的,
C
′
(
x
)
C'(x)
C′(x)中次数
∈
[
0
,
n
−
m
]
\in[0,n-m]
∈[0,n−m]的项是有效的,
现在再对原来的等式
m
o
d
  
x
n
−
m
+
1
\mod{x^{n-m+1}}
modxn−m+1,也就是
A
′
(
x
)
=
B
′
(
x
)
C
′
(
x
)
+
D
′
(
x
)
m
o
d
  
x
n
−
m
+
1
A'(x)=B'(x)C'(x)+D'(x) \mod{x^{n-m+1}}
A′(x)=B′(x)C′(x)+D′(x)modxn−m+1
这样
D
′
(
x
)
D'(x)
D′(x)这一项就能模掉了,也就是:
A
′
(
x
)
=
B
′
(
x
)
C
′
(
x
)
m
o
d
  
x
n
−
m
+
1
A'(x)=B'(x)C'(x) \mod{x^{n-m+1}}
A′(x)=B′(x)C′(x)modxn−m+1
A
′
(
x
)
B
′
(
x
)
=
C
′
(
x
)
m
o
d
  
x
n
−
m
+
1
\frac{A'(x)}{B'(x)}=C'(x) \mod{x^{n-m+1}}
B′(x)A′(x)=C′(x)modxn−m+1
因为
C
′
(
x
)
C'(x)
C′(x)的次数范围刚好在模以内,所以就可以直接求出
C
′
(
x
)
C'(x)
C′(x),变换得
C
(
x
)
C(x)
C(x),
求出了
C
(
x
)
C(x)
C(x),剩下直接减就好了
D
(
x
)
=
A
(
x
)
−
B
(
x
)
C
(
x
)
D(x)=A(x)-B(x)C(x)
D(x)=A(x)−B(x)C(x)
复杂度: O ( n log ( n ) ) O(n\log(n)) O(nlog(n))
多项式多点求值
已知多项式 F ( x ) F(x) F(x),给出 a 1 , a 2 , . . . , a n a_1,a_2,...,a_n a1,a2,...,an,要求 F ( a 1 ) , F ( a 2 ) , . . . , F ( a n ) F(a_1),F(a_2),...,F(a_n) F(a1),F(a2),...,F(an)
先抛出一个显然的结论:
F
(
a
1
)
=
F
(
x
)
m
o
d
  
(
x
+
a
1
)
F(a_1)=F(x)\mod{(x+a_1)}
F(a1)=F(x)mod(x+a1),
(意思是:多项式
F
(
x
)
F(x)
F(x)模多项式
(
x
+
a
1
)
(x+a_1)
(x+a1)的余数就是当
x
=
a
1
x=a_1
x=a1时
F
(
x
)
F(x)
F(x)的值)
有这个结论就好办了,
设多项式
C
l
,
r
(
x
)
=
∏
i
=
l
r
(
x
+
a
i
)
,
G
l
,
r
(
x
)
=
F
(
x
)
m
o
d
  
C
l
,
r
(
x
)
C_{l,r}(x)=\prod_{i=l}^r(x+a_i),G_{l,r}(x)=F(x)\mod{C_{l,r}(x)}
Cl,r(x)=∏i=lr(x+ai),Gl,r(x)=F(x)modCl,r(x),
考虑分治求解,
显然的:
G
l
,
m
i
d
(
x
)
=
G
l
,
r
(
x
)
m
o
d
  
C
l
,
r
(
x
)
G_{l,mid}(x)=G_{l,r}(x)\mod{C_{l,r}(x)}
Gl,mid(x)=Gl,r(x)modCl,r(x),右边同理,
这样当l=r时
G
l
,
l
(
x
)
G_{l,l}(x)
Gl,l(x)就是
F
(
a
l
)
F(a_l)
F(al)的值了,
做两遍分治FFT,
复杂度: O ( n log 2 ( n ) ) O(n\log^2(n)) O(nlog2(n))
多项式插值
给出 a 1 , b 1 , a 2 , b 2 , . . . , a k , b k a_1,b_1,a_2,b_2,...,a_k,b_k a1,b1,a2,b2,...,ak,bk,要求多项式 F ( x ) F(x) F(x)满足 F ( a i ) = b i F(a_i)=b_i F(ai)=bi,
考虑使用拉格朗日插值法,
F
(
x
)
=
∑
i
=
1
k
b
i
(
∏
1
≤
j
≤
k
,
i
≠
j
x
−
a
j
a
i
−
a
j
)
F(x)=\sum_{i=1}^kb_i(\prod_{1\leq j \leq k,i\ne j }\frac{x-a_j}{a_i-a_j})
F(x)=i=1∑kbi(1≤j≤k,i̸=j∏ai−ajx−aj)
将式子拆成两部分:
F
(
x
)
=
∑
i
=
1
k
b
i
(
∏
1
≤
j
≤
k
,
i
≠
j
1
a
i
−
a
j
)
(
∏
1
≤
j
≤
k
,
i
≠
j
(
x
−
a
j
)
)
F(x)=\sum_{i=1}^kb_i(\prod_{1\leq j \leq k,i\ne j }\frac{1}{a_i-a_j})(\prod_{1\leq j \leq k,i\ne j }(x-a_j))
F(x)=i=1∑kbi(1≤j≤k,i̸=j∏ai−aj1)(1≤j≤k,i̸=j∏(x−aj))
先做前面那一部分:(先取个倒数方便书写)
设
G
i
=
∏
1
≤
j
≤
k
,
i
≠
j
(
a
i
−
a
j
)
,
M
(
x
)
=
∏
j
=
1
k
(
a
i
−
a
j
)
G_i=\prod_{1\leq j \leq k,i\ne j }(a_i-a_j),M(x)=\prod_{j=1}^k(a_i-a_j)
Gi=∏1≤j≤k,i̸=j(ai−aj),M(x)=∏j=1k(ai−aj)
显然有
M
(
a
i
)
=
0
M(a_i)=0
M(ai)=0,
有:
G
i
=
lim
x
→
a
i
M
(
x
)
−
M
(
a
i
)
x
−
a
j
G_i=\lim_{x\to a_i}\frac{M(x)-M(a_i)}{x-a_j}
Gi=x→ailimx−ajM(x)−M(ai)
我们发现这个东西相当于
M
(
x
)
M(x)
M(x)在
x
=
a
i
x=a_i
x=ai处的导数,于是有:
G
i
=
lim
x
→
a
i
M
(
x
)
−
M
(
a
i
)
x
−
a
j
=
M
′
(
a
i
)
G_i=\lim_{x\to a_i}\frac{M(x)-M(a_i)}{x-a_j}=M'(a_i)
Gi=x→ailimx−ajM(x)−M(ai)=M′(ai)
所以对
M
′
(
x
)
M'(x)
M′(x)做一次多点求值即可,
这个东西还可以用洛必达法则证明,
设
f
(
x
)
=
x
−
a
i
f(x)=x-a_i
f(x)=x−ai
已知有
lim
x
→
a
i
M
(
x
)
=
0
,
lim
x
→
a
i
f
(
x
)
=
0
\lim_{x\to a_i}M(x)=0,\lim_{x\to a_i}f(x)=0
limx→aiM(x)=0,limx→aif(x)=0
所以:
lim
x
→
a
i
M
(
x
)
f
(
x
)
=
lim
x
→
a
i
M
′
(
x
)
f
′
(
x
)
=
M
′
(
a
i
)
\lim_{x\to a_i}\frac{M(x)}{f(x)}=\lim_{x\to a_i}\frac{M'(x)}{f'(x)}=M'(a_i)
x→ailimf(x)M(x)=x→ailimf′(x)M′(x)=M′(ai)
现在的原始变成了:
F
(
x
)
=
∑
i
=
1
k
b
i
G
i
(
∏
1
≤
j
≤
k
,
i
≠
j
(
x
−
a
j
)
)
F(x)=\sum_{i=1}^kb_iG_i(\prod_{1\leq j \leq k,i\ne j }(x-a_j))
F(x)=i=1∑kbiGi(1≤j≤k,i̸=j∏(x−aj))
这个东西可以直接使用分治FFT实现,分治的时候记录两个多项式分别表示是否已经空缺了一位,
复杂度: O ( n log 2 ( n ) ) O(n\log^2(n)) O(nlog2(n))
多点求值+几遍分治FFT常数爆炸
多项式牛顿迭代
已知多项式 G ( x ) G(x) G(x),要求多项式 F F F使得 G ( F ) = 0 m o d    x n G(F)=0\mod{x^n} G(F)=0modxn
前置技能:
泰勒展开
对于多项式
f
(
x
)
f(x)
f(x)它在
x
0
x_0
x0处的泰勒展开为:
f
(
x
)
=
f
(
x
0
)
+
f
′
(
x
)
1
!
(
x
−
x
0
)
+
f
′
′
(
x
)
2
!
(
x
−
x
0
)
2
+
.
.
.
.
.
f(x)=f(x_0)+\frac{f'(x)}{1!}(x-x_0)+\frac{f''(x)}{2!}(x-x_0)^2+.....
f(x)=f(x0)+1!f′(x)(x−x0)+2!f′′(x)(x−x0)2+.....
考虑倍增求 F F F
现在要求的 F F F是 m o d    x 2 n \mod x^{2n} modx2n的,假设我们已经求出了 F 0 F_0 F0表示 m o d    x n \mod x^n modxn时的答案,
把
G
(
F
)
G(F)
G(F)在
F
0
F_0
F0处展开:
G
(
F
)
=
G
(
F
0
)
+
G
′
(
F
0
)
(
F
−
F
0
)
+
1
2
G
′
′
(
F
0
)
(
F
−
F
0
)
2
m
o
d
  
x
2
n
G(F)=G(F_0)+G'(F_0)(F-F_0)+\frac{1}{2}G''(F_0)(F-F_0)^2 \mod{x^{2n}}
G(F)=G(F0)+G′(F0)(F−F0)+21G′′(F0)(F−F0)2modx2n
我们注意到是在
m
o
d
  
x
2
n
\mod{x^{2n}}
modx2n意义下的,而从第3项开始最低次项的指数均大于2n,所以可以直接省去,于是:
G
(
F
)
=
G
(
F
0
)
+
G
′
(
F
0
)
(
F
−
F
0
)
m
o
d
  
x
2
n
G(F)=G(F_0)+G'(F_0)(F-F_0)\mod{x^{2n}}
G(F)=G(F0)+G′(F0)(F−F0)modx2n
又因为
G
(
F
)
=
0
m
o
d
  
x
2
n
G(F)=0\mod{x^{2n}}
G(F)=0modx2n,
0 = G ( F 0 ) + G ′ ( F 0 ) F − G ′ ( F 0 ) F 0 m o d    x 2 n 0=G(F_0)+G'(F_0)F-G'(F_0)F_0\mod{x^{2n}} 0=G(F0)+G′(F0)F−G′(F0)F0modx2n
F = F 0 − G ( F 0 ) G ′ ( F 0 ) F=F_0-\frac{G(F_0)}{G'(F_0)} F=F0−G′(F0)G(F0)
多项式求对数
给出多项式 G ( x ) G(x) G(x),要求 F ( x ) F(x) F(x)使得 F ( x ) = ln ( G ( x ) ) m o d    x n F(x)=\ln(G(x))\mod{x^n} F(x)=ln(G(x))modxn
对两边同时求导,最后再积分回来,
有:
(
ln
(
G
(
x
)
)
)
′
=
G
′
(
x
)
G
(
x
)
(\ln(G(x)))'=\frac{G'(x)}{G(x)}
(ln(G(x)))′=G(x)G′(x)
所以
F
(
x
)
=
∫
G
′
(
x
)
G
(
x
)
d
x
F(x)=\int \frac{G'(x)}{G(x)}dx
F(x)=∫G(x)G′(x)dx
复杂度: O ( n log ( n ) ) O(n\log(n)) O(nlog(n))
多项式求EXP
给出多项式 G ( x ) G(x) G(x),求 F ( x ) F(x) F(x)满足 F ( x ) = e G ( x ) F(x)=e^{G(x)} F(x)=eG(x),
考虑使用牛顿迭代,
设多项式
g
(
x
)
=
l
n
(
x
)
−
G
(
x
)
g(x)=ln(x)-G(x)
g(x)=ln(x)−G(x),即
g
(
F
)
=
0
g(F)=0
g(F)=0
F
=
F
0
−
g
(
F
0
)
g
′
(
F
0
)
F=F_0-\frac{g(F_0)}{g'(F_0)}
F=F0−g′(F0)g(F0)
又因为
g
′
(
F
0
)
=
(
ln
(
F
0
)
)
′
−
(
A
)
′
=
1
F
0
g'(F_0)=(\ln(F_0))'-(A)'=\frac{1}{F_0}
g′(F0)=(ln(F0))′−(A)′=F01
所以:
F = F 0 − F 0 ( ln ( F 0 ) − A ) F=F_0-F_0(\ln(F_0)-A) F=F0−F0(ln(F0)−A)
复杂度: O ( n log ( n ) ) O(n\log(n)) O(nlog(n))
多项式求幂
给出多项式
F
(
x
)
F(x)
F(x),求
F
(
x
)
k
F(x)^k
F(x)k,
F
(
x
)
k
=
e
k
ln
(
F
(
x
)
)
F(x)^k=e^{k\ln(F(x))}
F(x)k=ekln(F(x))
这样如果k不为整数也能求了
复杂度: O ( n log ( n ) ) O(n\log(n)) O(nlog(n))