• 再探 FWT


    再探 FWT

    写一下我的简单理解吧

    设集合幂级数

    [F = sum_{S subseteq U}f_sx^{S} ]

    其中 (x^S) 表示 (prod_{iin S} x_i),不难看出这是个多元生成函数

    或卷积

    [h_t = sum_{t = i | j}f_i * g_j ]

    对于所有的 (2^n) 个集合,我们设它的特征向量为 (S_i = [i in S]),求所有向量的点值,容易发现就是

    [f'_S = sum_{s in S}f_s ]

    两个特征向量相乘,因为 (s_i in [0,1]),所以重复的部分乘机不变,也就是 (s_i * s_i = s_i)

    因此我们有

    [large f * g = sum_{s}sum_{t}f_sx^s*g_tx^t\ large f * g = sum_{s}sum_{t}f_sg_t*x^{s cup t}\ large f * g= sum_{T}x^Tsum_{scup t = T}f_sg_t ]

    也就是我们对两个多项式分别求点值然后相乘最后在插值回去即可

    求点值的过程就是 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 代入两边点值都不变

    [f(s+0)=l(s)*1+r(s)*0 = l(s)\ f(s+x^{{n}})=l(s)*1+r(s)*1=l(s)+r(s) ]

    现在考虑 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。

    异或卷积

    [h_t=sum_{i oplus j = t}f_i*g_i ]

    对于所有的 (2^n) 个集合,我们设它的特征向量为 (S_i = (-1)^{[i in S]}),求所有向量的点值,容易发现就是

    [f'_S = sum_{s}f_s(-1)^{|S&s|} ]

    两个特征向量相乘,因为 (s_i in [0,1]),所以重复的部分乘机变成 1,也就是 (s_i * s_i = 1)

    可以发现两个向量本来没有的部分是 1,重叠的部分也变成了 1,剩下的部分就是 -1 了

    [large f * g = sum_{s}sum_{t}f_sx^s*g_tx^t\ large f * g = sum_{s}sum_{t}f_sg_t*x^{s oplus t}\ large f * g= sum_{T}x^Tsum_{soplus t = T}f_sg_t ]

    再次考虑 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

    [f(s+0)=1*l(s)+1*r(s)\ f(s+x^{{n}})=1*l(s)+(-1)*r(s) ]

    考虑和或卷积一样的 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)

    应用

    为什么要用点值来理解它,因为在一些其他的变化中比较好理解

    比如我每一位可以是不同的三种操作杂糅,但事实上因为是点值所以每一位互不影响,但如果用不同的拆式子可能比较麻烦

  • 相关阅读:
    log4j基本使用方法
    Spring MVC中页面向后台传值的几种方式
    JXL操作Excel
    模板
    url&视图
    Git for PyCharm
    ServletConfig和ServletContext
    Exception和IOException之间的使用区别
    java学习一目了然——异常必知
    java学习一目了然——IO
  • 原文地址:https://www.cnblogs.com/Hs-black/p/13408474.html
Copyright © 2020-2023  润新知