关于一类位运算多项式相乘的做法

本文介绍了一种解决特定多项式乘法问题的方法,通过快速沃尔什-哈达玛变换(FWHT)处理位运算(或、异或、与)。采用递归方式将多项式分为两部分,并针对不同位运算的特点进行计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目大意

给定两个下标均为[0..2n1]的多项式A,B,数组C=A×B,满足
Ci=(j op k)=iAjBk

其中op可以为三种位运算符号or,and,xor

题解

这种问题有一个经典的做法,Fast Walsh-Hadamard Transform,但很难记忆,下面是种比较好推的做法。三种符号分类讨论。

Or

设当前A,B长度为2LA=a+bxL,B=c+dxL,其实就是拆成两半。而且由于操作符是Or,所以可以直接通过xL实现左移L位。

那么AB=(a+bxL)(c+dxL)=ac+xL(bc+ad)+xLxLbd

因为是Or,所以xLxL=xL,因此AB=ac+xL(bc+ad+bd)

那么我们可以先求出(a+b)(c+d)以及ac,然后用O(L)的时间就可以求出AB了。

时间复杂度T(L)=2T(L2)+O(L)=O(LlogL)

Xor

设当前A,B长度为2LA=a+bxL,B=c+dxL,其实就是拆成两半。而且由于操作符是Xor,所以可以直接通过xL实现左移L位。

那么AB=(a+bxL)(c+dxL)=ac+xL(bc+ad)+xLxLbd

因为是Xor,所以xLxL=x0=1,因此AB=ac+xL(bc+ad)+bd

那么设X=(a+b)(c+d),Y=(ab)(cd),可以惊奇的发现bc+ad=XY2,ac+bd=X+Y2。于是一样用O(L)的时间就可以求出了。

时间复杂度T(L)=2T(L2)+O(L)=O(LlogL)

And

一样把A,B分为两半,但现在不能用xL来左移了,因为是and

但是可以发现的是,AB的左边只能由bd做出贡献,而且右边的贡献就是bc+ad+ac

那么我们可以算出(a+b)(c+d),bd,然后拼接一下就好了。

时间复杂度T(L)=2T(L2)+O(L)=O(LlogL)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值