多项式求逆 与 多项式开方

介绍与基本概念

多项式求逆元是多项式除法、多项式开根和多项式取模的必要过程,用快速傅里叶变换及倍增算法可以做到用 O O (n log l o g n n )的时间复杂度求出一个多项式的逆元。

对于一个多项式 A(x),称其最高项的次数为这个多项式的度( 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 (mod xn x n )
那么称 B(x) B ( x ) A(x) A ( x ) 在( mod m o d xn x n )意义下的逆元,记作 A1(x) A − 1 ( x )

接下来讲一下如何求多项式的逆元。
n n =1时,直接求常数项的逆元即可。
n n >1时,考虑如何从( 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 )

由定义可知,

A(x)H(x)1(mod xn) A ( x ) H ( x ) ≡ 1 ( m o d   x n )

移项得,
A(x)H(x)10(mod xn) A ( x ) H ( x ) − 1 ≡ 0 ( m o d   x n )

考虑对此式子的两边平方,这样就能变成在( mod m o d x2n x 2 n )意义下了,便有
A2(x)H2(x)2A(x)H(x)+10(mod x2n) A 2 ( x ) H 2 ( x ) − 2 A ( x ) ∗ H ( x ) + 1 ≡ 0 ( m o d   x 2 n )

移项便得
2A(x)H(x)A2(x)H2(x)1(mod x2n) 2 A ( x ) ∗ H ( x ) − A 2 ( x ) H 2 ( x ) ≡ 1 ( m o d   x 2 n )

A(x)[2H(x)A(x)H2(x)]1(mod x2n) A ( x ) [ 2 H ( x ) − A ( x ) H 2 ( x ) ] ≡ 1 ( m o d   x 2 n )

所以
G(x)2H(x)A(x)H2(x) G ( x ) ≡ 2 H ( x ) − A ( x ) H 2 ( x )

这样就求出 G(x) G ( x ) 了,时间复杂度为 T(n) T ( n ) = O O (n log l o g n n )+T( n2 n 2 )= O O (n log l o g n n )。

多项式开根

给定A(x),求 B(x) B ( x ) 满足 B2(x) B 2 ( x ) 1 1 (mod xn x n )
n n =1时,这个比较麻烦,待会再说。
n n >1时,假设已求出了 B2(x) B 2 ( x ) 1 1 (mod xn x n ),现在要求出 G2(x) G 2 ( x ) 1 1 (mod x2n x 2 n )
同样两式相减可得

G2(x)B2(x)0(mod xn) G 2 ( x ) − B 2 ( x ) ≡ 0 ( m o d   x n )

一样的套路,为了使其变成在( mod m o d x2n x 2 n )意义下,对式子两边平方,得
G4(x)2G2(x)B2(x)+B4(x)0(mod x2n) G 4 ( x ) − 2 G 2 ( x ) B 2 ( x ) + B 4 ( x ) ≡ 0 ( m o d   x 2 n )

G4(x)+2G2(x)B2(x)+B4(x)4G2(x)B2(x)(mod x2n) G 4 ( x ) + 2 G 2 ( x ) B 2 ( x ) + B 4 ( x ) ≡ 4 G 2 ( x ) B 2 ( x ) ( m o d   x 2 n )

此时两边都能化成平方的形式,妙哉
(G2(x)+B2(x))2(2G(x)B(x))2(mod x2n) ( G 2 ( x ) + B 2 ( x ) ) 2 ≡ ( 2 G ( x ) B ( x ) ) 2 ( m o d   x 2 n )

G2(x)+B2(x)2G(x)B(x)(mod x2n) G 2 ( x ) + B 2 ( x ) ≡ 2 G ( x ) B ( x ) ( m o d   x 2 n )

G2(x) G 2 ( x ) 1 1 (mod x2n x 2 n )可得
B2(x)+A(x)2G(x)B(x)(mod x2n) B 2 ( x ) + A ( x ) ≡ 2 G ( x ) B ( x ) ( m o d   x 2 n )

两边同时除掉 2G(x) 2 G ( x ) ,可得
B(x)2+A(x)2B(x)G(x)(mod x2n) B ( x ) 2 + A ( x ) 2 B ( x ) ≡ G ( x ) ( m o d   x 2 n )

那只用求 B1(x) B − 1 ( x ) 即可,求多项式逆元的复杂度是 O O (n log l o g n n )的,因而总的时间复杂度为T(n)= O O (n log l o g n n )+T( n2 n 2 )= O O (n log l o g n n )。

现在回到问题当n= 1 1 时该怎么求,其实问题等同于已知b, c c ,求a满足 a2 a 2 b b (mod c c ),这里推介一位大佬的blog二次剩余Cipolla算法,这里就不细讲了。

若有地方写错了,还望各大佬指出。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值