模板题:

  给定$n = 2^k$和两个序列$A_{0..n-1}$, $B_{0..n-1}$,求

  $$C_i = \sum_{j \oplus k = i} A_j B_k$$

  其中$\oplus$是某一满足交换律的位运算,要求复杂度$O(nlogn)$。


快速沃尔什变换:

  这是什么东西?有用吗?请参阅SDOI2017r2d1-cut。

  看到这个大家是不是立刻想到了快速傅里叶变换?

  $$C_i = \sum_{j + k = i} A_j B_k$$

  我们来想想离散傅里叶变换的本质。

  $$\begin{aligned}& DFT(A)_i \\
  &= A(\omega_n^i)\\
  &=\sum_{j = 1}^n A_j * (\omega_n^i)^j\end{aligned}$$

  令$f(n, i, j) = (\omega_n^i)^j$,则

  $$DFT(A)_i = \sum_{j = 1}^n A_j f(n, i, j)$$

  它要满足$DFT(A)_i * DFT(B)_i = DFT(C)_i$,即

  $$(\sum_{j = 1}^n A_j f(n, i, j))(\sum_{k = 1}^n B_k f(n, i, k))=\sum_{l = 1}^n C_l f(n, i, l)$$

  $$\sum_{j = 1}^n \sum_{k = 1}^n A_j B_k f(n, i, j) f(n, i, k))=\sum_{l = 1}^n (\sum_{a+b=l} A_a B_b) f(n, i, l)$$

  这时我们发现左右分别有$n^2$项,令对应项系数相等,得

  $$f(n, i, j)f(n, i, k) = f(n, i, j + k)$$

  只要任意一个可以进行逆变换且满足上述条件的$f$都可以。

  现在我们把上面的$+$都改成$\oplus$,就是离散沃尔什变换即

  $$DWT(A)_i = \sum_{j = 1}^n A_j f(n, i, j)$$

  $$f(n, i, j)f(n, i, k) = f(n, i, j \oplus k)$$

  怎么样,是不是云里雾里顿开茅塞?

  然而我们还需要变快,所以快速傅里叶变换采用

  $$f(n, i, j) = (\omega_n^i)^j$$

  那它有什么优美的性质呢?

  我们发现, 由于有折半引理,$f(n, i, j)$和$f(n, i+n/2, j)$可以同时从$f(n/2,i,j)$得来。

  那么,从感性的角度,既然$\oplus$是一个位运算,那么应该更容易找到一个跟位运算有关的$f$,这样就自然有类似折半引理的东西使得我们可以做到上述事情。

  例如,当$\oplus$是位与时,可以取$f(i, j) = [i \& j = i]$, 即$j$的二进制完全包含在$i$的二进制里时为1,否则为0。

  当$\oplus$是位异或时, 可取$f(i, j) = (-1)^{count(i \& j)}$,其中$count(x)$表示$x$的二进制表示中1的个数。


逆变换:

  逆变换看上去好难啊。。。

  其实逆变换还是比较简单的。因为既然$f$跟位运算有关,我就只需要考虑某一位就好了。

  例如$\oplus$是位异或时我考虑$n=2,A=(a_0, a_1)$,

  那么$DWT(A) = (da_0 = a_0 + a_1, da_1 = a_0 - a_1)$

  我只需要解一个二元一次方程(把$da_0, da_1$作为常数, $a_0, a_1$作为变量)就可以解出$a_0, a_1$了。

  没了。


关于$f$函数的构造:

  $f$函数怎么构造。。。和逆变换的方法差不多啊。。。只需要看$n=2$的情况就行(实际上一般就是$-1$的几次幂,或者$0, 1, -1$)

  如果记忆力好可以把所有都背下来,反正满足交换律的位运算只有8个。。。

  列一些出来吧。。。(下列$f$函数均将第一个参数$n$省略, $[expr]$在布尔表达式$expr$为真时为1, 否则为假)

  $\oplus$为位与: $f(i, j) = [j \& i = i]$.

  $\oplus$为位或: $f(i, j) = [j \& i = j]$.

  $\oplus$为位异或: $f(i, j) = (-1)^{count(i \& j)}$.

  $\oplus$为位与非,位或非的时候把三个数组的下标都取反就对应位或和位与。

  $\oplus$为同或时直接求位异或卷积再把$C$的下标取反就行了。


吐槽:

  明明可以感性的理解我偏要说这么多。。。

  只是因为闲的慌。。。

  当然是要帮助大家更好的理解FWT。

  至于为什么要满足交换律。。。我才不会告诉你我还没有搞出不满足怎么做。

Fast Walsh-Hadamard Transform——快速沃尔什变换的更多相关文章

  1. Fast Walsh–Hadamard transform

    考虑变换 $$\hat{A_x} = \sum_{i\ or\ x = x}{ A_i }$$ 记 $S_{t}(A,x) = \sum_{c(i,t)\ or\ c(x,t)=c(x,t),\ i ...

  2. Fast Walsh-Hadamard Transform——快速沃尔什变换(二)

    上次的博客有点模糊的说...我把思路和算法实现说一说吧... 思路 关于快速沃尔什变换,为了方便起见,我们采用线性变换(非线性变换不会搞). 那么,就会有一个变化前各数值在变换后各处的系数,即前一篇博 ...

  3. 关于快速沃尔什变换(FWT)的一点学习和思考

    最近在学FWT,抽点时间出来把这个算法总结一下. 快速沃尔什变换(Fast Walsh-Hadamard Transform),简称FWT.是快速完成集合卷积运算的一种算法. 主要功能是求:,其中为集 ...

  4. 能轻松背板子的FWT(快速沃尔什变换)

    FWT应用 我不知道\(FWT\)的严格定义 百度百科和维基都不知道给一坨什么****东西** FWT(Fast Walsh Fransform),中文名快速沃尔什变换 然后我也不知道\(FWT\)到 ...

  5. 一个数学不好的菜鸡的快速沃尔什变换(FWT)学习笔记

    一个数学不好的菜鸡的快速沃尔什变换(FWT)学习笔记 曾经某个下午我以为我会了FWT,结果现在一丁点也想不起来了--看来"学"完新东西不经常做题不写博客,就白学了 = = 我没啥智 ...

  6. FWT快速沃尔什变换学习笔记

    FWT快速沃尔什变换学习笔记 1.FWT用来干啥啊 回忆一下多项式的卷积\(C_k=\sum_{i+j=k}A_i*B_j\) 我们可以用\(FFT\)来做. 甚至在一些特殊情况下,我们\(C_k=\ ...

  7. [学习笔记]FWT——快速沃尔什变换

    解决涉及子集配凑的卷积问题 一.介绍 1.基本用法 FWT快速沃尔什变换学习笔记 就是解决一类问题: $f[k]=\sum_{i\oplus j=k}a[i]*b[j]$ 基本思想和FFT类似. 首先 ...

  8. LG4717 【模板】快速沃尔什变换

    题意 题目描述 给定长度为\(2^n\)两个序列\(A,B\),设\(C_i=\sum_{j\oplus k}A_jB_k\)分别当\(\oplus\)是or,and,xor时求出C 输入输出格式 输 ...

  9. 快速沃尔什变换 FWT 学习笔记【多项式】

    〇.前言 之前看到异或就担心是 FWT,然后才开始想别的. 这次学了 FWT 以后,以后判断应该就很快了吧? 参考资料 FWT 详解 知识点 by neither_nor 集训队论文 2015 集合幂 ...

随机推荐

  1. 【C++】浅谈三大特性之一继承(三)

    四,派生类的六个默认成员函数 在继承关系里,如果我们没有显示的定义这六个成员函数,则编译系统会在适合场合为我们自动合成. 继承关系中构造函数和析构函数的调用顺序: class B { public: ...

  2. STM32位带操作总结---浅显易懂

    正在准备做毕业设计,配置LED_Config()的时候,又看到了位带操作的宏定义,我又嘀咕了,什么是位带操作,一年前在使用位带操作的时候,就查阅过好多资料,Core-M3也看过,但是对于博主这种“低能 ...

  3. 性能调优之剖析OutOfMemoryError

    性能调优之剖析OutOfMemoryError   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询q ...

  4. Oracle常见错误集锦

    1.ORA-12560:TNS:协议适配器错误 OracleService<SID>服务没有启动 2. ORA-12541:TNS:无监听程序 Oracle<ORACLE_HOME& ...

  5. JavaScript基础学习(八)—事件

    一.鼠标移动事件      onmouseover: 鼠标移到了上面.      onmousemove: 鼠标移动了.      onmouseout: 鼠标移走了. window.onload = ...

  6. 给我的cnblogs主页做一个响应式布局模板

    在cnblogs,一直都是使用官方自带的那些模板,而且感觉也一直很良好!不过最近用手机搜索一些相关的技术资料,很多都来自cnblogs,有些博主的页面在和机端显得很好,有些则展示得不那么友好了……忽然 ...

  7. 函数求值(swust oj0274)

    函数求值(0274) Time limit(ms): 1000 Memory limit(kb): 65535 Submission: 1767 Accepted: 324 Accepted 14级卓 ...

  8. kvc模式详解

    java利用反射机制访问类的 私有变量.OC的KVC模式也是一样,用来访问私有变量用的. 用字符串去访问对象实例变量的机制. //KVC模式-(void)KVCtest{ [_dm valueForK ...

  9. IP设置

    由于家里的IP地址与公司的不一样,每次都要修改很麻烦,所以自己只做了一个IP修改bat. 打开记事本,把一下代码复制到记事本里,保存成bat就OK了.在23行设置自己的IP地址就可以了. @echo ...

  10. 软件工程工具学习(1)---Visio

    要给15级软件工程上机了.开个系列记录软件工程开发过程中所会用到的一些工具的学习. 第一篇---软件分析与设计工具 Microsoft Visio Visio 介绍 1.Visio是一款矢量图形与图标 ...