【learning】多项式开根详解+模板

概述

多项式开跟是一个非常重要的知识点,许多多项式题目都要用到这一算法。

用快速数论变换,多项式求逆元和倍增法可以在O(nlogn)的时间复杂度下求出一个n次多项式的开根。

 

前置技能

快速数论变换(NTT),多项式求逆元,二次剩余。

 

多项式的开根

给定一个多项式A(x),其次数为degA,若存在一个多项式B(x),使其满足degBdegA,且B2(x)A(x)(mod xn),则B(x)即为A(x)在模xn意义下的的开根。

 

求多项式的开根

我们不妨假设,n=2k,kN

n=1,则b20a0(mod x)。其中a0b0表示多项式A和多项式B的常数项。

若需要求出b0,直接用二次剩余求出即可。(不过由于大部分题目公式特别优美,常数项通常为0)

n>1时:

我们假设在模xn2的意义下A(x)的开根B(x)我们已经求得。

依据定义,则有

B2(x)A(x)(mod xn)          (1)

因为多项式B(x)满足

B2(x)A(x)(mod xn2)          (2)

(1)(2),得

B2(x)B2(x)0(mod xn2)          (3)

我们用平方差公式将(3)展开

(B(x)+B(x))(B(x)B(x))0(mod xn2)          (4)

然后我们会发现多项式B(x)有两个解,下面考虑其中一种情况

B(x)B(x)0(mod xn2)          (5)

我们将(5)式同余符号两边平方,得

B2(x)2B(x)B(x)+B2(x)0(mod xn)          (6)

考虑到式(1),我们将式(1)代入式(6),得

A(x)2B(x)B(x)+B2(x)0(mod xn)          (7)

最后对式 (7)进行移项,得到

B(x)A(x)+B2(x)2B(x)(mod xn)          (8)

 

显然,我们可以用上述式子,通过倍增,求出n次项的B(x)

这一步的计算我们可以使用多项式求逆元和NTT,时间复杂度为O(nlogn)

我们可以通过递归的方法,求解出最终的N次项的B(x)

时间复杂度T(n)=T(n2)+O(nlogn)=O(nlogn)

 

模板如下:(暂时还没有)

 

posted @   AlphaInf  阅读(2246)  评论(4编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示