考虑变换

$$\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 \le |A|}{A_i}$
则 $\hat{A} = S_{\lceil log_2n \rceil}$

初始情况下有 $S_0$ 被拆分为 $n$ 段, $S_0([A_i],i) = A_i$
考虑每次将相邻两段合并。

记 $B0 = S_t([A0,A1],x)$ 的前一半,记 $B1$ 为后一半。
则有
$$B0 = A0 \\ B1 = A0 + A1$$
从而考虑将序列长度补为 $2^t$,不停合并序列即可实现时间复杂度 $O(nt)$ 的变换方法,逆变换只需要按上述变换解方程即可。

考虑应用这个变换
试求$$C_x = \sum_{a\ or\ b = x} A_a B_b$$
考虑应用变换的性质
$$\hat{C_c} \\ = \sum{[x\ or\ c=c]C_x} \\ = \sum{[(a\ or\ b)\ or\ c = c]A_a B_b} \\= \sum{[(a\ or\ c = c)]A_a [(b\ or\ c = c)B_b ]} \\=\hat{A_c} \hat{B_c}$$

对于
$$C_x = \sum_{a\ and\ b = x}{A_a B_b}$$
我们考虑构造另外一种变换方法,$$[(a\ and\ b)\ and\ c = c] = [(a\ and\ c = c)][(b\ and\ c = c)]$$
新的变换方法同上,为$$B0 = A0 + A1 \\ B1 = A1$$
上述变换很容易推广到高维的情况,略。

那么考虑另外一种逻辑规则$$C_x = \sum_{a \oplus b = x} A_a B_b$$
类比上述两式我们应用本身的运算 $xor$,再考虑将其化为只含有0,1的逻辑函数。
尝试定义 $f(a,b) = a \oplus b$ 中一的个数取余2,从而有
$$([f(a,c)=0]-[f(a,c)=1])([f(b,c)=0] - [f(b,c)=1]) \\= [f(a \oplus b,c) = 0] - [f(a \oplus b,c) = 1]$$
我们将变换称为 $w$ 变换
从而 $w(C) = w(A)\cdot w(B)$
考虑如何求解 $w(A)$
假定,记$$B0 = B00 - B10 \\ B1 = B01 - B11$$
从而
$$B00 = A00 + A11, B01 = A10 + A01 \\ B10 = A10 + A01, B11 = A00 + A11 \\ B0 = A00+A11-A10-A01 \\ B1 = A10+A01-A00-A11$$
从而$$B0 = A0 - A1, B1 = A1 - A0$$
正确但是无法通过反解的方式进行逆变换。
可以发现关键问题在于我们要设法使得$B0, B1$的生成式不能线性相关,从而不可以使得$$f(a,b) = g(a \oplus b)$$
因为前者会导致两个递归式线性相关。
而使得$$f(a,b) = g(a\ or\ b) / g(a\ and\ b)$$
则可以得到两个并不线性相关的式子。
考虑修改 $f(a,b)$ 定义,经尝试得到$f(a,b) = a\ and\ b$ 中 1 的个数满足$$f(a\oplus b,c) = f(a,c) \oplus f(b,c)$$契合上述式子
这样我们会得到变换$$B0 = A0+A1 \\ B1 = A0-A1$$
从而逆变换为$$A0 = \frac{B0+B1}{2} \\ A1 = \frac{B0-B1}{2}$$
考虑和$fft$一样,统一正反变换,得到
$$B0 = \frac{A0+A1}{\sqrt 2} \\ B1 = \frac{A0-A1}{\sqrt 2}$$
反向变换相同。
我们考虑将原序列中各个元素对于变换后序列每一项的贡献,用矩阵写出来得到$Hadamard$ 矩阵。
$$H_n = \frac{1}{\sqrt 2}\left( \begin{array}{ccc} H{n-1} & H{n-1} \\ H{n-1} & -H{n-1} \end{array} \right)$$

后两个变换的简单测试程序:

#include <bits/stdc++.h>
using namespace std;
void W(int a[],int l,int r)
{
if(l==r) return;
int m = (l+r)>>;
W(a,l,m);
W(a,m+,r);
for(int i=l;i<=m;i++)
{
a[i]-=a[i-l++m];
a[i-l++m] = -a[i];
}
}
void FWT(int a[],int l,int r)
{
if(l==r) return;
int m = (l+r)>>;
FWT(a,l,m);
FWT(a,m+,r);
for(int i=l;i<=m;i++)
{
int x = a[i], y = a[i-l++m];
a[i] = x+y;
a[i-l++m] = x-y;
}
}
void rFWT(int a[],int l,int r)
{
if(l==r) return;
int m = (l+r)>>;
for(int i=l;i<=m;i++)
{
int x = a[i], y = a[i-l++m];
a[i] = (x+y)/;
a[i-l++m] = (x-y)/;
}
rFWT(a,l,m);
rFWT(a,m+,r);
}
int sol(int now)
{
int ans = ;
for(;now;now>>=) if(now&) ans=-ans;
return ans;
}
#define N 100010
int a[N],s[N];
int main()
{
int t;
cin >> t;
for(int i=;i<(<<t);i++) scanf("%d",&a[i]);
for(int i=;i<(<<t);i++)
{
s[i] = ;
for(int j=;j<(<<t);j++) s[i] += sol(i^j)*a[j];
}
W(a,,(<<t)-);
for(int i=;i<(<<t);i++) cout << s[i] - a[i] << endl;
return ;
}

Fast Walsh–Hadamard transform的更多相关文章

  1. h.264 fast,1/2,1/4像素运动估计与插值处理

    Hadamard Transform 在1/2,1/4像素运动估计这一阶段中,对于像素残差,可以选择采用哈达玛变换来代替离散余弦变换进行高低频的分离. 优点:哈达玛矩阵全是+1,-1,因此只需要进行加 ...

  2. H.264 Transform

    变换是视频.图像编码的核心部分.目前所采用的变换算法都是从傅里叶变换演变而来.单纯的变换并不会导致视频(图像)的码率变小,反而会增大.但是非常巧妙的一点是:变换把图像从空域转换成的时域,把由色块组成的 ...

  3. 简单的量子算法(一):Hadamard 变换、Parity Problem

    Hadamard Transform Hadamard 变换在量子逻辑门中提过,只不过那时是单量子的Hadamard门,负责把\(|1\rangle\)变成\(|-\rangle\),\(|0\ran ...

  4. paper 132:图像去噪算法:NL-Means和BM3D

    这篇文章写的非常好,确定要~认真~慎重~的转载了,具体请关注本文编辑作者:http://wenhuix.github.io/research/denoise.html   我不会告诉你这里的代码都是f ...

  5. 图像去噪算法:NL-Means和BM3D

    图像去噪是非常基础也是非常必要的研究,去噪常常在更高级的图像处理之前进行,是图像处理的基础.可惜的是,目前去噪算法并没有很好的解决方案,实际应用中,更多的是在效果和运算复杂度之间求得一个平衡,再一次验 ...

  6. X264参考手册

    艺搜简介 基本语法: x264 [options]-o outfile infile 注意与ffmpeg的输入输出文件位置恰好相反: ffmpeg[options][[infile options]- ...

  7. Video processing systems and methods

    BACKGROUND The present invention relates to video processing systems. Advances in imaging technology ...

  8. FWT,FST入门

    0.目录 目录 0.目录 1.什么是 FWT 2. FWT 怎么做 2.1. 或卷积 2.2.与卷积 2.3.异或卷积 2.4.例题 3. FST 3.1. FST 怎么做 3.2.例题 1.什么是 ...

  9. [译]处理文本数据(scikit-learn 教程3)

    原文网址:http://scikit-learn.org/stable/tutorial/text_analytics/working_with_text_data.html 翻译:Tacey Won ...

随机推荐

  1. 第二篇 dom内容操作之value

    一.内容操作的三种方式 . 详情看第一篇 innerText innerHtml . value ==>表单类的标签 input >text passwd textarea . check ...

  2. delphi的获取某坐标的颜色值

    1.通过API函数GetPixel(),获取某个点的颜色值; var PT : TPoint; C : TColor; DC : HDC; hwd : THandle; I : integer; be ...

  3. 让IE6支持max_height、max_width等等

    推荐使用min-height:500px;_height:500px;来解决IE6不能max和min属性的问题.

  4. Linux开发引导

    1.应用程序目录 /bin 用于存放启动系统时用到的程序 /usr/bin 用于存放用户使用的标准程序 /usr/local/bin 用于存放软件安装的程序 /sbin:/usr/sbin 用于存放系 ...

  5. [转]Tomcat启动分析

    [转]Tomcat启动分析 原帖 http://docs.huihoo.com/apache/tomcat/heavyz/01-startup.html 以下摘录了部分 --------------- ...

  6. HIVE- 大数据运维之hive管理

    我现在在一家公司负责大数据平台(CDH平台)的运维管理,最常遇见的问题我总结出来,并且继续在下面更新.希望方便自己以后trouble shooting以及方便各位同行解决问题与学习. 关于做运维有几个 ...

  7. 提醒程序员注意的一些事项--R

    经验丰富的程序员通常会发现R语言的某些方面不太寻常.以下是这门语言中你需要了解的一些特性. 对象名称中的句点(.)没有特殊意义.但美元符号($)却有着和其他语言中的句点类似的含义,即指定一个对象中的 ...

  8. Python Panda - 学习笔记

    #Group by Function df.groupby('Date')[['Date']].count() df.groupby('Date')[['Date']].sum() # if it c ...

  9. Eclipse_常用技巧_03_字母大小写转换快捷键

    eclipse中字母大小写转换快捷键: ctrl+shift+x 转为大写 ctrl+shift+y 转为小写

  10. Struts2 - 异常处理: exception-mapping 元素

    异常处理: exception-mapping 元素 在action方法中添加 int i=1/0; 请求action后,结果为: 在struts.xml中添加异常处理:exception-mappi ...