【多项式】多项式逆元/开方

来源:互联网 发布:南宁广电网络资费 编辑:程序博客网 时间:2024/05/21 05:38

逆元

已知多项式F(x),求F(x)在保留前n项(当然n要是2的次幂)的情况下的逆元G(x),也就是:

F(x)G(x)1(modxn)

首先,如果n=1,那么直接就是常数项的逆元,

如果n>1,那么怎么办?
设:G(x)使得F(x)G(x)1(modxn/2),且我们已知G(x)
第一个式子可以变成:

F(x)G(x)1(modxn/2)

(把模数开了个方,依旧成立)
把两个式子相减:
F(x)(G(x)G(x))0(modxn/2)

G(x)G(x)0(modxn/2)

同时平方:(当然模数也平方依旧成立)
(G(x)G(x))20(modxn)

G2(x)+G2(x)2G(x)G(x)0(modxn)

两边同时乘上F(x),消掉部分G(x)
G(x)+G2(x)F(x)2G(x)0(modxn)

G(x)2G(x)G2(x)F(x)(modxn)

那么,G(x)就可以快速求出了,
(同时发现,只要常数项有逆元,这个多项式就有逆元)
复杂度:T(n)=T(n/2)+O(nlog(n))=O(nlog(n))


开方

多项式的开方同样可以以这种方法做出来,

已知多项式F(x),求F(x)在保留前n项(当然n要是2的次幂)的情况下的平方根G(x),也就是:

G2(x)F(x)(modxn)

首先,如果n=1,那么直接就是常数项的开方,可以暴力枚举,也可以用二次项剩余(CZY的二次剩余Cipolla算法学习小记),

对于n>1的情况,
设:G(x)使得G(x)2F(x)(modxn/2),且我们已知G(x)
(把平方写在后面好看QuQ)

第一个式子可以变成:

G2(x)F(x)(modxn/2)

(把模数开了个方,依旧成立)
把两个式子相减:
G2(x)G(x)20(modxn/2)

因式分解:
(G(x)+G(x))(G(x)G(x))0(modxn/2)

可得G(x)有两个解(平方嘛),讨论G(x)G(x)0(modxn/2)的情况,
G(x)G(x)0(modxn/2)

(历史总是惊人的相识)
同时平方:(当然模数也平方依旧成立)
(G(x)G(x))20(modxn)

G2(x)+G(x)22G(x)G(x)0(modxn)

因为:G2(x)F(x)(modxn)
F(x)+G(x)22G(x)G(x)0(modxn)

G(x)F(x)+G(x)22G(x)(modxn)

那么,G(x)就可以快速求出了,
(同时发现,只要常数项是二次项剩余且有逆元,这个多项式就可以开方)
复杂度:T(n)=T(n/2)+2O(nlog(n))=O(nlog(n))
(这个的常数可就大多了)

原创粉丝点击