FFT 和 FWT 学习笔记

尝试自己理解一下原理。


首先是 FFT,解决的问题是将多项式和点值表达式在 O(nlogn) 时间内互相转化。

设要转化的多项式为 F(x),次数为 n,那么我们知道代入 n+1 个点值可以唯一确定这个多项式。

此处选用的点值为单位根,记 ωnn 次单位根,即将平面直角坐标系上的单位圆均分成 n 份,几何意义是逆时针旋转 2πnrad

由此容易得到一些性质,ω2n2k=ωnkωnk+n2=ωnk 等。

现在设多项式为 F(x)=a0+a1x1+a2x2++an1xn1,要求的是 F(ωn0),F(ωn1),,F(ωnn1) 的值。

考虑分离奇偶项,设 F0(x)=a0+a2x+a4x2+F1(x)=a1+a3x+a5x2+

那么有 F(x)=F0(x2)+xF1(x2),尝试代入 ωnk

分类讨论一下,若 k<n2,则有:

F(ωnk)=F0(ωn2k)+ωnkF1(ωn2k)=F0(ωn2k)+ωnkF1(ωn2k)

容易发现变成了两个规模减半的子问题。

kn2,则设 k=kn2,有:

F(ωnk)=F0(ωn2k)+ωnk+n2F1(ωn2k)=F0(ωn2k)ωnkF1(ωn2k)

形式相同。

优化运算可以使用位运算置换,每次是将最低位奇偶分类,可以看作是二进制位逆序后的基数排序,所以一个数字的二进制位的逆序就是最终的位置,免去了递归计算的大常数。

根据定义式:F(ωnx)=i=0n1aiωnxi 可得这是一个线性变换,等价于乘范德蒙德矩阵。

由于这个矩阵的元素非常特殊,它的逆矩阵也有特殊的性质,就是每一项取倒数,再除以变换的长度 n,就能得到它的逆矩阵。

NTT 即将 ωngp1n 代替,g 是模数 p 的原根,只因它们有相似的性质。


FWT 部分。

仿照 FFT 直接设计线性运算,设 c(i,j) 表示原多项式的第 j 项对 FWT 后多项式的第 i 项的贡献系数。

联立 FWT(A)i×FWT(B)i=FWT(A×B)iFWT(A)i=j=0nc(i,j)Aj 可得 c(i,j)c(i,k)=c(i,jk) 是等价条件,其中 是任意位运算,而位运算的一大优点在于其每位独立,故 c(i,j) 相当于 i,j 每一位的变换系数相乘。

计算 FWT(A)i=j=0n1c(i,j)Aj 仍然考虑分治,记 i 表示 i 去掉最高位后的值,i0 表示 i 的最高位,j 同理。

FWT(A)i=j=0n1c(i,j)Aj=j=0n21c(i,j)Aj+j=n2n1c(i,j)Aj=c(i0,0)j=0n21c(i,j)Aj+c(i0,1)j=n2n1c(i,j)Aj

转化为两个规模减半的子问题,根据 i0 的值计算即可。

推演 c([0,1],[0,1]) 的方法:

以 and 卷积为例。

首先有 c(i,0)c(i,j)=c(i,0),故有 c(i,0)=0c(i,j)=1

由于这是一个线性运算,矩阵必须满秩,所以不能存在一行或一列均为 0

由此得到合法的矩阵可能是 [0111] 或者 [1101],逆运算直接乘上矩阵的逆即可。

  • 子集卷积

解决的问题是计算 Fi=jandk=0jork=iajbk

或卷积解决不了与为 0 的条件,考虑将其转化为 |j|+|k|=|i|,那么只需要在 F 内部维护一个多项式即可。

时间复杂度 O(n22n)

作者:紊莫

出处:https://www.cnblogs.com/wenmoor/p/18689387

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   紊莫  阅读(21)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示
more_horiz
keyboard_arrow_up dark_mode palette
选择主题