多项式求逆
f
(
x
)
∗
g
(
x
)
=
1
(
m
o
d
x
n
)
f(x)*g(x)=1(mod\ x^n)
f(x)∗g(x)=1(mod xn)
先求出
f
(
x
)
∗
g
(
x
)
′
=
1
(
m
o
d
x
n
2
)
f(x)*g(x)'=1(mod\ x^{\frac{n}{2}})
f(x)∗g(x)′=1(mod x2n)
然后有
f
(
x
)
∗
g
(
x
)
′
=
f
(
x
)
∗
g
(
x
)
(
m
o
d
x
n
2
)
f(x)*g(x)'=f(x)*g(x)(mod\ x^{\frac{n}{2}})
f(x)∗g(x)′=f(x)∗g(x)(mod x2n)
移项平方,
(
g
(
x
)
−
g
′
(
x
)
)
2
=
0
(
m
o
d
x
n
)
(g(x)-g'(x))^2=0(mod\ x^{n})
(g(x)−g′(x))2=0(mod xn)
同乘
f
f
f,
g
(
x
)
−
2
∗
g
′
(
x
)
+
g
′
(
x
)
2
f
(
x
)
=
0
(
m
o
d
x
n
)
g(x)-2*g'(x)+g'(x)^2f(x)=0(mod\ x^n)
g(x)−2∗g′(x)+g′(x)2f(x)=0(mod xn)
所以
g
(
x
)
=
2
∗
g
′
(
x
)
−
g
′
(
x
)
2
f
(
x
)
(
m
o
d
x
n
)
g(x)=2*g'(x)-g'(x)^2 f(x)(mod\ x^n)
g(x)=2∗g′(x)−g′(x)2f(x)(mod xn)
于是可以倍增做,复杂度
O
(
n
l
o
g
(
n
)
)
O(nlog(n))
O(nlog(n))
多项式
l
n
ln
ln
求
f
(
x
)
=
l
n
(
g
(
x
)
)
f(x)=ln(g(x))
f(x)=ln(g(x))
两边求导,
f
(
x
)
′
=
g
(
x
)
′
g
(
x
)
f(x)'=\frac{g(x)'}{g(x)}
f(x)′=g(x)g(x)′
所以
f
(
x
)
=
∫
g
(
x
)
′
g
(
x
)
f(x)=\int \frac{g(x)'}{g(x)}
f(x)=∫g(x)g(x)′
多项式
e
x
p
exp
exp
求
f
(
x
)
=
e
g
(
x
)
f(x)=e^{g(x)}
f(x)=eg(x)
两边取对数
l
n
(
f
(
x
)
)
=
g
(
x
)
ln(f(x))=g(x)
ln(f(x))=g(x)
令
F
(
x
)
=
l
n
(
x
)
−
g
F(x)=ln(x)-g
F(x)=ln(x)−g,这里的
x
x
x 是一个函数,g 相当于一个常数
现在要求
F
F
F 的 0 点,牛顿迭代
f
(
x
)
=
f
0
(
x
)
−
F
(
f
0
(
x
)
)
F
(
f
0
(
x
)
)
′
f(x)=f_0(x)-\frac{F(f_0(x))}{F(f_0(x))'}
f(x)=f0(x)−F(f0(x))′F(f0(x))
而
F
(
f
0
(
x
)
)
′
=
1
f
0
(
x
)
F(f_0(x))'=\frac{1}{f_0(x)}
F(f0(x))′=f0(x)1
所以
f
(
x
)
=
f
0
(
x
)
(
1
−
l
n
(
x
)
+
g
(
x
)
)
f(x)=f_0(x)(1-ln(x)+g(x))
f(x)=f0(x)(1−ln(x)+g(x))
每次迭代精度翻番,证明略,可以倍增做,复杂度
O
(
n
l
o
g
(
n
)
)
O(nlog(n))
O(nlog(n))
多项式除法
求
Q
(
x
)
,
R
(
x
)
Q(x),R(x)
Q(x),R(x),满足
F
(
x
)
=
Q
(
x
)
∗
G
(
x
)
+
R
(
x
)
F(x)=Q(x)*G(x)+R(x)
F(x)=Q(x)∗G(x)+R(x)
F
(
1
x
)
=
Q
(
1
x
)
∗
G
(
1
x
)
+
R
(
1
x
)
F(\frac{1}{x})=Q(\frac{1}{x})*G(\frac{1}{x})+R(\frac{1}{x})
F(x1)=Q(x1)∗G(x1)+R(x1)
x
n
∗
F
(
1
x
)
=
x
n
−
m
Q
(
1
x
)
∗
x
m
G
(
1
x
)
+
x
n
−
m
+
1
∗
x
m
−
1
R
(
1
x
)
x^n*F(\frac{1}{x})=x^{n-m}Q(\frac{1}{x})*x^mG(\frac{1}{x})+x^{n-m+1}*x^{m-1}R(\frac{1}{x})
xn∗F(x1)=xn−mQ(x1)∗xmG(x1)+xn−m+1∗xm−1R(x1)
发现这样正好是把系数翻转
F
r
(
x
)
=
Q
r
(
x
)
∗
G
r
(
x
)
+
x
n
−
m
+
1
∗
R
r
(
x
)
F_r(x)=Q_r(x)*G_r(x)+x^{n-m+1}*R_r(x)
Fr(x)=Qr(x)∗Gr(x)+xn−m+1∗Rr(x)
所以
F
r
(
x
)
=
Q
r
(
x
)
∗
G
r
(
x
)
(
m
o
d
x
n
−
m
+
1
)
F_r(x)=Q_r(x)*G_r(x)(mod\ x^{n-m+1})
Fr(x)=Qr(x)∗Gr(x)(mod xn−m+1)
Q
r
(
x
)
=
F
r
(
x
)
∗
G
r
(
x
)
−
1
(
m
o
d
x
n
−
m
+
1
)
Q_r(x)=F_r(x)*G_r(x)^{-1}(mod\ x^{n-m+1})
Qr(x)=Fr(x)∗Gr(x)−1(mod xn−m+1)
R
(
x
)
=
F
(
x
)
−
G
(
x
)
∗
Q
(
x
)
R(x)=F(x)-G(x)*Q(x)
R(x)=F(x)−G(x)∗Q(x)
多项式快速幂
求
f
(
x
)
=
g
(
x
)
k
(
m
o
d
x
n
)
f(x)=g(x)^k(mod\ x^n)
f(x)=g(x)k(mod xn)
l
n
(
f
(
x
)
)
=
k
∗
l
n
(
g
(
x
)
)
ln(f(x))=k*ln(g(x))
ln(f(x))=k∗ln(g(x))
f
(
x
)
=
e
x
p
(
k
∗
l
n
(
g
(
x
)
)
f(x)=exp(k*ln(g(x))
f(x)=exp(k∗ln(g(x))
多项式多点求值
给一个多项式,多点求值
比如说要求
x
0
x_0
x0 的值
f
(
x
0
)
f(x_0)
f(x0)
考虑构造一个
g
(
x
)
=
x
−
x
0
g(x)=x-x_0
g(x)=x−x0,
g
(
x
0
)
=
0
g(x_0)=0
g(x0)=0
求出
f
(
x
0
)
=
g
(
x
0
)
∗
Q
(
x
0
)
+
R
(
x
0
)
=
R
(
x
0
)
=
f
(
x
0
)
%
g
(
x
0
)
f(x_0)=g(x_0)*Q(x_0)+R(x_0)=R(x_0)=f(x_0)\%g(x_0)
f(x0)=g(x0)∗Q(x0)+R(x0)=R(x0)=f(x0)%g(x0)
然后考虑分治,一起模
走左边的时候模
∏
i
=
1
n
2
g
(
x
i
)
\prod_{i=1}^{\frac{n}{2}}g(x_i)
∏i=12ng(xi)
然后那个
∏
\prod
∏ 也可以分治
n
t
t
ntt
ntt
多项式快速插值
首先有拉格朗日插值
f
(
x
)
=
∑
i
=
1
n
y
i
∏
j
!
=
i
x
−
x
j
x
i
−
x
j
f(x)=\sum_{i=1}^ny_i\prod_{j!=i}\frac{x-x_j}{x_i-x_j}
f(x)=∑i=1nyi∏j!=ixi−xjx−xj
f
(
x
)
=
∑
i
=
1
n
y
i
∏
j
!
=
i
x
i
−
x
j
∏
j
!
=
i
x
−
x
j
f(x)=\sum_{i=1}^n\frac{y_i}{\prod_{j!=i}x_i-x_j}\prod_{j!=i}x-x_j
f(x)=∑i=1n∏j!=ixi−xjyi∏j!=ix−xj
考虑求
∏
j
!
=
i
x
i
−
x
j
\prod_{j!=i}x_i-x_j
∏j!=ixi−xj,如果有
g
(
x
)
=
∏
j
=
1
n
x
−
x
j
g(x)=\prod_{j=1}^nx-x_j
g(x)=∏j=1nx−xj
那么
g
(
x
i
)
x
−
x
i
\frac{g(x_i)}{x-x_i}
x−xig(xi),根据洛必达法则就是
g
(
x
i
)
′
g(x_i)'
g(xi)′
考虑分治,令
f
l
,
r
f_{l,r}
fl,r 为考虑
[
l
,
r
]
[l,r]
[l,r] 插出来的多项式
f
l
,
r
=
∑
i
=
l
r
y
i
g
(
x
i
)
′
∏
j
!
=
i
x
−
x
j
x
i
−
x
j
f_{l,r}=\sum_{i=l}^r\frac{y_i}{g(x_i)'}\prod_{j!=i}\frac{x-x_j}{x_i-x_j}
fl,r=i=l∑rg(xi)′yij!=i∏xi−xjx−xj
=
∏
j
=
m
i
d
+
1
r
(
x
−
x
j
)
∑
i
=
l
m
i
d
y
i
g
(
x
i
)
′
∏
j
=
l
,
j
!
=
i
m
i
d
(
x
−
x
j
)
+
∏
j
=
l
m
i
d
(
x
−
x
j
)
∑
i
=
m
i
d
+
1
r
y
i
g
(
x
i
)
′
∏
j
=
m
i
d
+
1
,
,
j
!
=
i
r
(
x
−
x
j
)
=\prod_{j=mid+1}^r(x-x_j)\sum_{i=l}^{mid}\frac{y_i}{g(x_i)'}\prod_{j=l,j!=i}^{mid}(x-x_j)+\prod_{j=l}^{mid}(x-x_j)\sum_{i=mid+1}^{r}\frac{y_i}{g(x_i)'}\prod_{j=mid+1,,j!=i}^{r}(x-x_j)
=j=mid+1∏r(x−xj)i=l∑midg(xi)′yij=l,j!=i∏mid(x−xj)+j=l∏mid(x−xj)i=mid+1∑rg(xi)′yij=mid+1,,j!=i∏r(x−xj)
=
∏
j
=
m
i
d
+
1
r
(
x
−
x
j
)
f
l
,
m
i
d
+
∏
j
=
l
m
i
d
(
x
−
x
j
)
f
m
i
d
+
1
,
r
=\prod_{j=mid+1}^r(x-x_j)f_{l,mid}+\prod_{j=l}^{mid}(x-x_j)f_{mid+1,r}
=j=mid+1∏r(x−xj)fl,mid+j=l∏mid(x−xj)fmid+1,r
然后要对每个
x
i
x_i
xi 求出
g
(
x
i
)
′
g(x_i)'
g(xi)′,多点求值即可
任意模数
n
t
t
ntt
ntt
把每个数拆成
a
∗
32768
+
b
a*32768+b
a∗32768+b 的形式
那么两个数相乘就是
(
a
1
∗
32768
+
b
1
)
(
a
2
∗
32768
+
b
2
)
(a_1*32768+b_1)(a_2*32768+b_2)
(a1∗32768+b1)(a2∗32768+b2),拆开即可
发现需要求
a
1
a
2
,
a
1
b
2
,
b
1
a
2
,
b
1
b
2
a_1a_2,a_1b_2,b_1a_2,b_1b_2
a1a2,a1b2,b1a2,b1b2
做 8 次
d
f
t
dft
dft,4 次
i
d
f
t
idft
idft
然后发现只用做 4 次
d
f
t
dft
dft,4 次
i
d
f
t
idft
idft
考虑利用
f
f
t
fft
fft 的复数部分
(
a
+
b
i
)
(
c
+
d
i
)
=
a
c
−
b
d
+
(
a
d
+
b
c
)
i
(a+bi)(c+di)=ac-bd+(ad+bc)i
(a+bi)(c+di)=ac−bd+(ad+bc)i
我们设两个多项式
P
=
a
1
+
i
∗
a
2
P=a_1+i*a_2
P=a1+i∗a2
Q
=
b
1
+
i
∗
b
2
Q=b_1+i*b_2
Q=b1+i∗b2
P
∗
Q
=
(
a
1
b
1
−
a
2
b
2
)
+
i
(
a
1
b
2
+
a
2
b
1
)
P*Q=(a_1b_1-a_2b_2)+i(a_1b_2+a_2b_1)
P∗Q=(a1b1−a2b2)+i(a1b2+a2b1)
又设
P
′
=
a
1
−
i
∗
a
2
P'=a_1-i*a_2
P′=a1−i∗a2
P
′
∗
Q
=
(
a
1
b
1
+
a
2
b
2
)
+
i
(
a
1
b
2
−
b
1
a
2
)
P'*Q=(a_1b_1+a_2b_2)+i(a_1b_2-b_1a_2)
P′∗Q=(a1b1+a2b2)+i(a1b2−b1a2)
加加减减就可以得出所有的值
3 次
d
f
t
dft
dft,2 次
i
d
f
t
idft
idft