再探 FWT
写一下我的简单理解吧
设集合幂级数
其中 (x^S) 表示 (prod_{iin S} x_i),不难看出这是个多元生成函数
或卷积
求
对于所有的 (2^n) 个集合,我们设它的特征向量为 (S_i = [i in S]),求所有向量的点值,容易发现就是
两个特征向量相乘,因为 (s_i in [0,1]),所以重复的部分乘机不变,也就是 (s_i * s_i = s_i)
因此我们有
也就是我们对两个多项式分别求点值然后相乘最后在插值回去即可
求点值的过程就是 FWT,插值就是 IFWT,我们重新考虑 FWT 的过程
想要求出 (1,2 cdots 2^n) 的点值 (f(1),f(2),f(3)cdots f(2^n))
像 FFT 一样分治下去,考虑是否有第 n 个元素 (x^{{n}})
假设我们已经求出了左半部分点值 (l(1),l(2),l(3)cdots l(2^{n-1})),右半部分点值 (r(1),r(2),r(3)cdots r(2^{n-1}))
现在一起求出 (f(s + 0),f(s+x^{{n}})),末尾加 0 会使右半部分的点值都为零,左边点值不变,而末尾为 1 代入两边点值都不变
现在考虑 IFWT,我们要求出每一位恰好就是下标的数组
让我们模拟一下,从最低位一直走向最高位,现在有两个向量的点值 (f(0+V),f(x+V))
根据 (f'_S = sum_{s in S}f_s),容易发现 (0+V) 的点值完全包含在 (x+V) 里面,所以 (x+V) 的点值减去 (0+V) 的点值就是 (sum_{sin x+V and x in s}f_s),也就是说我们刚才把不含 x 的部分减掉了,类似的,考虑某个中间过程有 (f(V_1+0+V2)) 和 (f(V_1+x+V_2)) 表示 (V_1) 一定选而不是前缀和的情况下两个点值,那么第二个减去第一个就又保证了第二个一定选了 x。
异或卷积
求
对于所有的 (2^n) 个集合,我们设它的特征向量为 (S_i = (-1)^{[i in S]}),求所有向量的点值,容易发现就是
两个特征向量相乘,因为 (s_i in [0,1]),所以重复的部分乘机变成 1,也就是 (s_i * s_i = 1)
可以发现两个向量本来没有的部分是 1,重叠的部分也变成了 1,剩下的部分就是 -1 了
再次考虑 FWT,向上面一样分治考虑最后一个元素
假设我们已经求出了左半部分点值 (l(1),l(2),l(3)cdots l(2^{n-1})),右半部分点值 (r(1),r(2),r(3)cdots r(2^{n-1}))
现在一起求出 (f(s + 0),f(s+x^{{n}})),末尾加 0 点值不变,而末尾为 1 左边不变,右边点值乘 -1
考虑和或卷积一样的 IFWT
(f(V_1+0+V2)) 表示对于所有 (V_1 in s) 的 (sum_{s}f_s(-1)^{|s&(0+V_2)|})
设 (a = f((V_1+0)+V_2),b = f((V_1+x)+V_2))
有 (f(V_1+0+V_2)=a+b,f(V_1+x+V_2)=a-b)
从而可以轻松解得 (a, b)
应用
为什么要用点值来理解它,因为在一些其他的变化中比较好理解
比如我每一位可以是不同的三种操作杂糅,但事实上因为是点值所以每一位互不影响,但如果用不同的拆式子可能比较麻烦