一个多项式求逆的卡常技巧
发布日期:2021-05-04 16:55:22 浏览次数:34 分类:技术文章

本文共 2914 字,大约阅读时间需要 9 分钟。

markdown源码https://paste.ubuntu.com/p/wyNvxb4PPQ/

假设在   m o d   x n \bmod x^n modxn下,多项式 A A A的逆元是 F F F,在   m o d   x ⌈ n / 2 ⌉ \bmod x^{\lceil n/2\rceil} modxn/2下,多项式 A A A的逆元是 F 0 F_0 F0,根据多项式求逆的基本公式

F = 2 F 0 − F 0 2 A m o d    x n F=2F_0-F_0^2A \mod x^n F=2F0F02Amodxn
首先定义,对于一个多项式 F F F F ( k ) F(k) F(k)为其在 x k x^k xk时的系数。

(当然,正确的写法是 [ x k ] F [x^k]F [xk]F,但是写起来不是很方便,因此修改了一下)

展开

F ( x ) = 2 F 0 ( x ) − ∑ j = 0 x F 0 ( j ) ∑ k = 0 x − j F 0 ( k ) A ( x − j − k ) F(x)=2F_0(x)-\sum_{j=0}^x F_0(j)\sum_{k=0}^{x-j}F_0(k)A(x-j-k) F(x)=2F0(x)j=0xF0(j)k=0xjF0(k)A(xjk)
首先假设
R ( x ) = ∑ i = 0 x F 0 ( i ) A ( x − i ) R(x)=\sum_{i=0}^x F_0(i)A(x-i) R(x)=i=0xF0(i)A(xi)
由逆元的定义可得在 x &lt; ⌈ n 2 ⌉ x&lt;\lceil \frac{n}{2}\rceil x<2n的情况下, R ( x ) = [ x = 0 ] R(x)=[x=0] R(x)=[x=0]

  • 对于 x &lt; ⌈ n 2 ⌉ x&lt;\lceil \frac{n}{2}\rceil x<2n的情况,可以得到

    F ( x ) = 2 F 0 ( x ) − ∑ j = 0 x F 0 ( j ) R ( x − j ) F(x)=2F_0(x)-\sum_{j=0}^x F_0(j)R(x-j) F(x)=2F0(x)j=0xF0(j)R(xj)
    由于 x &lt; ⌈ n 2 ⌉ x&lt;\lceil \frac{n}{2}\rceil x<2n,因此 R ( x − j ) R(x-j) R(xj)只有在 j = x j=x j=x时值为 1 1 1,其他情况都为 0 0 0,因此
    F ( x ) = 2 F 0 ( x ) − F 0 ( x ) = F 0 ( x ) F(x)=2F_0(x)-F_0(x)=F_0(x) F(x)=2F0(x)F0(x)=F0(x)

  • 对于 x ≥ ⌈ n 2 ⌉ x\geq \lceil\frac{n}{2}\rceil x2n的情况,由于 F 0 F_0 F0的次数为 ⌈ n 2 ⌉ − 1 \lceil \frac{n}{2}\rceil-1 2n1,因此 F 0 ( x ) F_0(x) F0(x) x ≥ ⌈ n 2 ⌉ x\geq \lceil \frac{n}{2}\rceil x2n时值为 0 0 0

    F ( x ) = − ∑ j = 0 x F 0 ( j ) R ( x − j ) F(x)=-\sum_{j=0}^x F_0(j)R(x-j) F(x)=j=0xF0(j)R(xj)
    x − j &lt; ⌈ n 2 ⌉ x-j&lt; \lceil \frac{n}{2}\rceil xj<2n,则 R ( x − j ) = 0 R(x-j)=0 R(xj)=0,因此
    F ( x ) = − ∑ j = 0 x − ⌈ n / 2 ⌉ F 0 ( j ) R ( x − j ) F(x)=-\sum_{j=0}^{x-\lceil n/2\rceil}F_0(j)R(x-j) F(x)=j=0xn/2F0(j)R(xj)
    定义
    G = − F 0 [ R x ⌈ n / 2 ⌉ ] x ⌈ n / 2 ⌉ G=-F_0[\frac{R}{x^{\lceil n/2\rceil}}]x^{\lceil n/2\rceil} G=F0[xn/2R]xn/2
    其中,对于一个多项式 F F F,定义 [ F ] [F] [F] F F F舍弃 ∀ k &lt; 0 , x k \forall k&lt;0,x^k k<0,xk与其系数,例如 [ 6 x − 3 + 2 + 5 x ] = 2 + 5 x [6x^{-3}+2+5x]=2+5x [6x3+2+5x]=2+5x

    展开得到

    G ( x ) = − ∑ j = 0 n − 1 F 0 ( j ) R ( x − j ) [ x − j ≥ ⌈ n 2 ⌉ ] G(x)=-\sum_{j=0}^{n-1}F_0(j)R(x-j)[x-j\geq \lceil \frac{n}{2}\rceil] G(x)=j=0n1F0(j)R(xj)[xj2n]
    G ( x ) = − ∑ j = 0 x − ⌈ n / 2 ⌉ F 0 ( j ) R ( x − j ) G(x)=-\sum_{j=0}^{x-\lceil n/2\rceil}F_0(j)R(x-j) G(x)=j=0xn/2F0(j)R(xj)
    容易发现
    G ( x ) = F ( x ) G(x)=F(x) G(x)=F(x)
    G G G在求出 R R R的基础上只需要求一个 ⌈ n 2 ⌉ \lceil \frac{n}{2}\rceil 2n次多项式和一个 n − ⌈ n 2 ⌉ n-\lceil \frac{n}{2}\rceil n2n次多项式的乘积,较为简便。

代码

inline int getinv(int *s,int len,int *res){
if(len==1) {
res[0]=quickpow(s[0],mod-2); return 0; } int k=(len+1)/2; getinv(s,k,res); for(int i=0; i

其中multi(int *a,int lena,int *b,int lenb,int *res,int k)函数代表将多项式a和多项式b乘起来并 &VeryThinSpace; m o d &VeryThinSpace; x k \bmod x^{k} modxk保存在res数组中。

转载地址:https://blog.csdn.net/wang3312362136/article/details/86160828 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:BZOJ 4913 [Sdoi2017] 遗忘的集合
下一篇:BZOJ 4916 神犇和蒟蒻

发表评论

最新留言

哈哈,博客排版真的漂亮呢~
[***.90.31.176]2024年04月23日 00时43分08秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

java.io.IOException: 连接被对方重设 Connection reset 2021-06-30
ping服务器间歇性丢包的解决方案 2021-06-30
CentOS7 Failed to start LSB: Bring up/down networking 解决方法 2021-06-30
容易被替代的几类程序员总结 2021-06-30
银河麒麟root用户登录方法 2021-06-30
银河麒麟在VMware虚拟机中如何更改窗口分辨率大小? 2021-06-30
数据库外键使用所造成的影响有哪些? 2021-06-30
每天自我提升的8个好习惯 2021-06-30
jquery.nicescroll参数说明 2021-06-30
windows查看指定的端口是否开放 2021-06-30
微信小程序开发(三)——IE盒子,Flex弹性布局,色子六面 2021-06-30
Python 技术篇-pip安装tar.gz格式的离线资源包 2021-06-30
windows 技术篇-将本地主机加入域的方法实例演示 2021-06-30
Python 图像处理篇-利用opencv库展示本地图片实例演示 2021-06-30
Python 图像处理篇-利用opencv库和numpy库读取包含中文路径下的本地图片实例演示 2021-06-30
oracle 数据回滚,恢复误删的数据,闪回表功能的使用 2021-06-30
mac 系统新功能体验-根据时间变化的动态桌面背景,看壁纸演绎风景大片中的日出与日落 2021-06-30
ADB的安装和使用教程,小米手机连接adb实例演示 2021-06-30
windows 关闭粘滞键-解决Microsoft Remote Desktop输入自动变为快捷键问题 2021-06-30
测试工具 - Postman接口测试入门使用手册,Postman如何进行数据关联、自动更新cookies、简单编程 2021-06-30