考虑变换

$$\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. Java进阶学习:JSON解析利器JackSon

    Java:JSON解析利器JackSon JackSon基础 1.Maven项目引入 <!-- https://mvnrepository.com/artifact/org.codehaus.j ...

  2. migrate

    数据类型 引用 # :string, :text, :integer, :float,:decimal, :datetime, :timestamp, :time, :date, # :binary, ...

  3. js之Date(日期对象)

    通过日期对象我们可以进行一些对日期时间的操作处理 一.日期对象的创建: var myDate=new Date() 二.Date对象方法: Link:http://www.w3school.com.c ...

  4. 20145229《Java程序设计》第四次实验报告

    Android开发基础 实验要求 1.基于Android Studio开发简单的Android应用并部署测试; 2.了解Android组件.布局管理器的使用: 3.掌握Android中事件处理机制. ...

  5. android6.0 外部存储设备插拔广播以及获取路径(U盘)【转】

    本文转载自:https://blog.csdn.net/zhouchengxi/article/details/53982222 这里我将U盘作为例子来说明解析. android4.1版本时U盘插拔时 ...

  6. 在Ubuntu上为Android系统的Application Frameworks层增加硬件访问服务【转】

    本文转载自:http://blog.csdn.net/luoshengyang/article/details/6578352 在数字科技日新月异的今天,软件和硬件的完美结合,造就了智能移动设备的流行 ...

  7. tkinter比较常用的组件

    1.输入框组件 输入框(Entry)用来输入单行内容,可以方便地向程序传递用户参数.这里通过一个转换摄氏度和华氏度的小程序来演示该组件的使用. import tkinter as tk def btn ...

  8. 纯css实现3D字体

    下面分别是html,css和js代码: <div class="wrapper"> <h1 contenteditable data-heading=" ...

  9. python中的enumerate()函数用法

    enumerate函数用于遍历序列中的元素以及它们的下标,可以非常方便的遍历元素. 比如我在往excel中写数据时就用到了这个函数: data = [] data.append(('预约码', '车牌 ...

  10. FEC之我见一

    顾名思义,FEC前向纠错,根据收到的包进行计算获取丢掉的包,而和大神沟通的结果就是 纠错神髓:收到的媒体包+冗余包 >= 原始媒体包数据   直到满足 收到的媒体包+ 冗余包 >= 原始媒 ...