(如无特殊声明,均默认n为2的次幂)
多项式求逆
要干嘛?
已知
f
(
x
)
f(x)
f(x),求
g
(
x
)
g(x)
g(x)令
f
(
x
)
g
(
x
)
≡
1
(
m
o
d
x
n
)
f(x)g(x)\equiv 1(mod\ x^n)
f(x)g(x)≡1(mod xn).
m
o
d
x
n
mod\ x^n
mod xn指只考虑指数小于n的所有项。
怎么搞?
n
2
n^2
n2算法是显然的。
考虑
n
l
o
g
n
nlogn
nlogn算法。
设我们已经知道了满足
f
(
x
)
g
′
(
x
)
≡
1
(
m
o
d
x
n
2
)
f(x)g'(x)\equiv 1(mod\ x^{\frac{n}{2}})
f(x)g′(x)≡1(mod x2n)
显然
f
(
x
)
g
(
x
)
≡
1
(
m
o
d
x
n
2
)
f(x)g(x)\equiv 1(mod\ x^{\frac{n}{2}})
f(x)g(x)≡1(mod x2n)
那么
f
(
x
)
g
(
x
)
−
f
(
x
)
g
′
(
x
)
≡
0
(
m
o
d
x
n
2
)
f(x)g(x)-f(x)g'(x)\equiv 0(mod\ x^{\frac{n}{2}})
f(x)g(x)−f(x)g′(x)≡0(mod x2n)
则
g
(
x
)
−
g
′
(
x
)
≡
0
(
m
o
d
x
n
2
)
g(x)-g'(x)\equiv 0(mod\ x^{\frac{n}{2}})
g(x)−g′(x)≡0(mod x2n)也是显然的。
然后同时平方得到
g
2
(
x
)
−
2
g
(
x
)
g
′
(
x
)
+
g
′
2
(
x
)
≡
0
(
m
o
d
n
)
g^2(x)-2g(x)g'(x)+g'^2(x)\equiv 0(mod \ n)
g2(x)−2g(x)g′(x)+g′2(x)≡0(mod n)
此处用平方使得满足的位数上升。
左右同乘
f
(
x
)
f(x)
f(x)得
g
(
x
)
−
2
g
′
(
x
)
+
f
(
x
)
g
′
2
(
x
)
≡
0
(
m
o
d
n
)
g(x)-2g'(x)+f(x)g'^2(x)\equiv 0(mod\ n)
g(x)−2g′(x)+f(x)g′2(x)≡0(mod n)
这里左侧要得到的
g
(
x
)
g(x)
g(x)由于其性质一个和
f
(
x
)
f(x)
f(x)相抵消变成
1
(
m
o
d
n
)
1(mod\ n)
1(mod n)了
所以有
g
(
x
)
≡
2
g
′
(
x
)
−
f
(
x
)
g
′
2
(
x
)
g(x)\equiv 2g'(x)-f(x)g'^2(x)
g(x)≡2g′(x)−f(x)g′2(x)
log次FFT/NTT即可。
多项式取模(带余除法)
要干嘛?
已知f(x),g(x),求h(x)、r(x)使得其满足 g ( x ) ≡ f ( x ) ∗ h ( x ) + r ( x ) g(x)\equiv f(x)*h(x)+r(x) g(x)≡f(x)∗h(x)+r(x)
咋搞?
考虑我们对h有什么要求?
f
(
x
)
∗
h
(
x
)
f(x)*h(x)
f(x)∗h(x)在某个位以上必须和
f
(
x
)
f(x)
f(x)相同,以下不用管。
考虑我们之前求逆干了什么?
f
(
x
)
∗
h
(
x
)
f(x)*h(x)
f(x)∗h(x)第一位必须是1,某位以下都是0,某位以上无所谓。
翻转一下完事。、
h
r
(
x
)
=
g
r
(
x
)
∗
f
r
−
1
(
x
)
h_r(x)=g_r(x)*f_r^{-1}(x)
hr(x)=gr(x)∗fr−1(x),其中r表示翻转。
多项式开方
要干嘛?
已知 f ( x ) f(x) f(x),求 g 2 ( x ) ≡ f ( x ) ( m o d n ) g^2(x)\equiv f(x)(mod\ n) g2(x)≡f(x)(mod n)
咋搞?
考虑
g
′
(
x
)
g'(x)
g′(x)使得
g
′
2
(
x
)
≡
f
(
x
)
(
m
o
d
n
2
)
g'^2(x)\equiv f(x)(mod\ \frac{n}{2})
g′2(x)≡f(x)(mod 2n)
由于
n
2
\frac{n}{2}
2n以上的项不会对
n
2
\frac{n}{2}
2n内的平方值产生影响
则
g
′
(
x
)
≡
g
(
x
)
(
m
o
d
n
2
)
g'(x)\equiv g(x)(mod\ \frac{n}{2})
g′(x)≡g(x)(mod 2n)
同时平方得到
g
2
(
x
)
−
2
g
(
x
)
g
′
(
x
)
+
g
′
2
(
x
)
(
m
o
d
n
)
g^2(x)-2g(x)g'(x)+g'^2(x)(mod\ n)
g2(x)−2g(x)g′(x)+g′2(x)(mod n)注意此处利用平方使得满足
发现
g
2
(
x
)
g^2(x)
g2(x)就是
f
(
x
)
f(x)
f(x)
所以
g
(
x
)
≡
f
(
x
)
+
g
′
2
(
x
)
2
g
′
(
x
)
(
m
o
d
n
)
g(x)\equiv \frac{f(x)+g'^2(x)}{2g'(x)}(mod\ n)
g(x)≡2g′(x)f(x)+g′2(x)(mod n)
递推即可。
常数项上二次剩余解决。
多项式多点快速求值
暴力
秦九韶不会的麻烦重修高中数学
引入
假设我们有一个多项式
f
(
x
)
f(x)
f(x),那么它在
x
i
x_i
xi处的取值和它膜
x
−
x
0
x-x0
x−x0(注意这是个多项式!)相等。
冷静分析我们膜的时候干了什么:把高位减掉低位加上,会发现差不多就是个正向算的过程。
我们可以对每个询问做一次多项式膜法。
n
2
l
o
g
n^2log
n2log大常数。会被
n
2
n^2
n2吊锤。
优化?
考虑复杂度瓶颈在哪。
我们每次做的是一个n次的多项式对一个1次的多项式取模。
我们希望前面的多项式式次数低一点。
怎么搞?
我们考虑一块处理。
首先有显然的
(
a
m
o
d
b
)
m
o
d
c
=
=
a
m
o
d
c
(
b
m
o
d
c
=
=
0
)
(a\ mod \ b)mod\ c==a\ mod\ c(b\ mod\ c==0)
(a mod b)mod c==a mod c(b mod c==0)
那么我们同时处理两个的话,就可以先花一次
n
l
o
g
n
nlogn
nlogn的代价用原多项式膜
(
x
−
x
0
)
(
x
−
x
1
)
(x-x_0)(x-x_1)
(x−x0)(x−x1)使得次数下降到2,然后再分别膜。
多个的话就(类)线段树分治。
注意需要先从底向上处理
(
x
−
x
l
)
(
x
−
x
l
+
1
)
(
x
−
x
l
+
2
)
.
.
.
.
.
(
x
−
x
r
)
(x-x_l)(x-x_{l+1})(x-x_{l+2}).....(x-x_{r})
(x−xl)(x−xl+1)(x−xl+2).....(x−xr)
总复杂度
n
l
o
g
2
n
nlog^2n
nlog2n
多项式插值
要干嘛?
你有若干点,要求求出满足这些点的一个多项式。
怎么搞?
拉格朗日插值公式。
h
i
(
x
)
=
(
x
−
x
1
)
(
x
−
x
2
)
(
x
−
x
3
)
.
.
.
.
.
.
(
x
−
x
i
−
1
)
(
x
−
x
i
+
1
)
.
.
.
.
.
.
(
x
−
x
n
)
(
x
i
−
x
1
)
(
x
i
−
x
2
)
.
.
.
.
.
.
(
x
i
−
x
i
−
1
)
(
x
i
−
x
i
−
2
)
.
.
.
.
.
.
(
x
i
−
x
n
)
h_i(x)=\frac{(x-x_1)(x-x_2)(x-x_3)......(x-x_{i-1})(x-x_{i+1})......(x-x_n)}{(x_i-x_1)(x_i-x_2)......(x_i-x_{i-1})(x_i-x_{i-2})......(x_i-x_{n})}
hi(x)=(xi−x1)(xi−x2)......(xi−xi−1)(xi−xi−2)......(xi−xn)(x−x1)(x−x2)(x−x3)......(x−xi−1)(x−xi+1)......(x−xn)
这个多项式在
x
=
x
j
(
j
!
=
i
)
x=x_j(j!=i)
x=xj(j!=i)时为0,在
x
=
x
i
x=x_i
x=xi时为1
一堆这个多项式叠起来就能得到所需多项式。
怎么求
考虑先求分母。
我们发现要求
(
x
i
−
x
1
)
(
x
i
−
x
2
)
(
x
i
−
x
3
)
(
x
i
−
x
4
)
.
.
.
.
(
x
i
−
x
i
−
1
)
(
x
i
−
x
i
+
1
)
.
.
.
(
x
i
−
x
n
)
(x_i-x_1)(x_i-x_2)(x_i-x_3)(x_i-x_4)....(x_i-x_{i-1})(x_i-x_{i+1})...(x_i-x_{n})
(xi−x1)(xi−x2)(xi−x3)(xi−x4)....(xi−xi−1)(xi−xi+1)...(xi−xn),要是
x
!
=
x
i
x!=x_i
x!=xi我们就可以直接拿全部的乘积除差,但是不行就利用导数的性质
f
′
(
x
i
)
f'(x_i)
f′(xi)即为所求(是个值),多项式多点求值即可。
然后考虑分子,和要乘的y。
这个东西可以用线段树分治使得每个对应多项式获得应当的系数。
https://www.cnblogs.com/Tiw-Air-OAO/p/10198693.html