介绍与基本概念
多项式求逆元是多项式除法、多项式开根和多项式取模的必要过程,用快速傅里叶变换及倍增算法可以做到用 O O ( log l o g n n )的时间复杂度求出一个多项式的逆元。
对于一个多项式 ,称其最高项的次数为这个多项式的度(
degree
d
e
g
r
e
e
),记作
degA
d
e
g
A
对于多项式
A(x)
A
(
x
)
,
B(x)
B
(
x
)
,存在唯一的
Q(x)
Q
(
x
)
,
R(x)
R
(
x
)
满足
A(x)
A
(
x
)
=
Q(x)
Q
(
x
)
*
B(x)
B
(
x
)
+
R(x)
R
(
x
)
,其中
degR
d
e
g
R
<
degB
d
e
g
B
,我们称
Q(x)
Q
(
x
)
为
B(x)
B
(
x
)
除
A(x)
A
(
x
)
的商,
R(x)
R
(
x
)
为
B(x)
B
(
x
)
除
A(x)
A
(
x
)
的余数。
多项式求逆
对于一个多项式 A(x) A ( x ) ,存在 B(x) B ( x ) 满足 degB d e g B ≤ degA d e g A 并且
A(x)
A
(
x
)
B(x)
B
(
x
)
≡
1
1
(
xn
x
n
)
那么称
B(x)
B
(
x
)
为
A(x)
A
(
x
)
在(
mod
m
o
d
xn
x
n
)意义下的逆元,记作
A−1(x)
A
−
1
(
x
)
。
接下来讲一下如何求多项式的逆元。
当
n
n
=时,直接求常数项的逆元即可。
当
n
n
>时,考虑如何从(
mod
m
o
d
xn
x
n
)意义下的逆元推到(
mod
m
o
d
x2n
x
2
n
)意义下的逆元。
假设 A(x)在 A ( x ) 在 ( mod m o d xn x n )意义下的逆元为 H(x) H ( x ) , A(x) A ( x ) 在( mod m o d x2n x 2 n )意义下的逆元为 G(x) G ( x ) ,那我们就是已知 H(x) H ( x ) 求 G(x) G ( x ) 。
由定义可知,
移项得,
考虑对此式子的两边平方,这样就能变成在( mod m o d x2n x 2 n )意义下了,便有
移项便得
所以
这样就求出 G(x) G ( x ) 了,时间复杂度为 T(n) T ( n ) = O O ( log l o g n n )+( n2 n 2 )= O O ( log l o g n n )。
多项式开根
给定,求
B(x)
B
(
x
)
满足
B2(x)
B
2
(
x
)
≡
1
1
(
xn
x
n
)
当
n
n
=时,这个比较麻烦,待会再说。
当
n
n
>时,假设已求出了
B2(x)
B
2
(
x
)
≡
1
1
(
xn
x
n
),现在要求出
G2(x)
G
2
(
x
)
≡
1
1
(
x2n
x
2
n
)
同样两式相减可得
一样的套路,为了使其变成在( mod m o d x2n x 2 n )意义下,对式子两边平方,得
此时两边都能化成平方的形式,妙哉
由 G2(x) G 2 ( x ) ≡ 1 1 ( x2n x 2 n )可得
两边同时除掉 2G(x) 2 G ( x ) ,可得
那只用求 B−1(x) B − 1 ( x ) 即可,求多项式逆元的复杂度是 O O ( log l o g n n )的,因而总的时间复杂度为= O O ( log l o g n n )+( n2 n 2 )= O O ( log l o g n n )。
现在回到问题当= 1 1 时该怎么求,其实问题等同于已知, c c ,求满足 a2 a 2 ≡ b b ( c c ),这里推介一位大佬的二次剩余Cipolla算法,这里就不细讲了。
若有地方写错了,还望各大佬指出。