【learning】多项式开根详解+模板
概述
多项式开跟是一个非常重要的知识点,许多多项式题目都要用到这一算法。
用快速数论变换,多项式求逆元和倍增法可以在O(nlogn)的时间复杂度下求出一个n次多项式的开根。
前置技能
快速数论变换(NTT),多项式求逆元,二次剩余。
多项式的开根
给定一个多项式A(x),其次数为degA,若存在一个多项式B(x),使其满足degB≤degA,且B2(x)≡A(x)(mod xn),则B(x)即为A(x)在模xn意义下的的开根。
求多项式的开根
我们不妨假设,n=2k,k∈N。
若n=1,则b20≡a0(mod x)。其中a0,b0表示多项式A和多项式B的常数项。
若需要求出b0,直接用二次剩余求出即可。(不过由于大部分题目公式特别优美,常数项通常为0)
当n>1时:
我们假设在模xn2的意义下A(x)的开根B′(x)我们已经求得。
依据定义,则有
B2(x)≡A(x)(mod xn) (1)
因为多项式B′(x)满足
B′2(x)≡A(x)(mod xn2) (2)
将(1)−(2),得
B2(x)−B′2(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)+B′2(x)≡0(mod xn) (6)
考虑到式(1),我们将式(1)代入式(6),得
A(x)−2B(x)B′(x)+B′2(x)≡0(mod xn) (7)
最后对式 (7)进行移项,得到
B(x)≡A(x)+B′2(x)2B′(x)(mod xn) (8)
显然,我们可以用上述式子,通过倍增,求出n次项的B(x)。
这一步的计算我们可以使用多项式求逆元和NTT,时间复杂度为O(nlogn)。
我们可以通过递归的方法,求解出最终的N次项的B(x)
时间复杂度T(n)=T(n2)+O(nlogn)=O(nlogn)。
模板如下:(暂时还没有)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!