快速沃尔什变换与k进制FWT
这是一篇用来卖萌的文章QAQ
考虑以下三类卷积
\(C_k = \sum \limits_{i \;or\;j = k} A_i * B_j\)
\(C_k = \sum \limits_{i\;and\;j = k} A_i * B_j\)
\(C_k = \sum \limits_{i\;xor\;j = k}A_i * B_j\)
由于前两种可以用FMT(高维前缀和)解决,那我们就谈谈第三种吧
下文中的\(n\)都是形如\(2^i - 1\)的数
下标的开与闭是根据好不好写来定的,但是还是可以意会的...
虽然有人知道为什么了,但是我还是不知道为什么要这么做
我们尝试寻找一个矩阵\(T\),其\((i, j)\)元为\(w(i, j)\),使得
\[TA \cdot TB = TC\]
我们不妨记\(TA = fwt(A)\)
自然的,\(fwt(A)[x] = \sum \limits_{i = 0}^n w(x, i) * A_i\)
那么,等式两边同时展开,我们可以得到
\[fwt(A)[x] \cdot fwt(B)[x] = fwt(C)[x]\]
\[\sum \limits_{i = 0}^n w(x, i) * A_i \sum \limits_{j = 0}^n w(x, j) * B_j = \sum \limits_{k = 0}^n w(x, k) * C_k\]
对比两边\(C_k\)的表达式, 我们自然希望这个变换满足
\[\sum \limits_{i \oplus j = k} A_i * B_j * w(x, i) * w(x, j) = C_k * w(x, k)\]
如果有\(w(x, i) * w(x, j) = w(x, k) \;(i \oplus j = k)\),那么我们就能得到\(\sum \limits_{i \oplus j = k} A_i * B_j = C_k\)
这不就是我们想要的式子嘛....,
那我就构造一个满足\(w(x, i) * w(x, j) = w(x, k) \;(i \oplus j = k)\)的\(T\)矩阵
不仅如此,我们还需要可以快速地计算出\(fwt(A)\)
\[
\begin{aligned}
fwt(A)[i] &= \sum \limits_{k = 0}^n w(i, k) A_k \\
&= \sum \limits_{k = 0}^{n / 2} w(i, k) w(i, 0) A_k + \sum \limits_{k = n / 2}^n w(i, k) w(i, n / 2)\\
\end{aligned}
\]
不难注意到,前半部分已经成为了一个子问题,然而后半部分还没有
我们希望通过\(w\)的某些性质,能够使得右边成为一个子问题
联想到\(w\)需要满足异或的性质,因此,我们不妨让\(w\)拥有可以按位拆分的性质
\[w(i, j) = \prod_{k = 0}^{...} w(i\;\&\;2^k, j \;\&\;2^k)\]
下面的化式子来源于rqy神仙
如果有上面的性质,我们记\(i\)的二进制的最高位为\(i_1\),其他位为\(i_0\),\(k\)同理
那么,原本的式子可以转化成
\[
\begin{aligned}
fwt(A)[i] &= \sum \limits_{k = 0}^{n / 2} w(i_1, 0) w(i_0, k_0) A_k + \sum \limits_{k = n / 2}^n w(i_1, 1) w(i_0, k_0) A_k \\
&= w(i_1, 0) fwt(A_0)[i_0] + w(i_1, 1) fwt(A_1)[i_0]\\
\end{aligned}
\]
应该看得出\(A_0\)和\(A_1\)是什么吧...
复杂度为\(T(n) = 2T(n / 2) + O(n) = O(n \log n)\)
那么,考虑构造\(w\),其实只要构造一个\(2 * 2\)的矩阵,由于\(C\)需要逆变换,因此矩阵还要有逆
\[
\begin{bmatrix}
w(0, 0) & w(0,1)\\
w(1,0)& w(1,1)
\end{bmatrix}
\]
根据上面的异或性质,我们有
\[
w(0, 0) * w(0, 0) = w(0, 0) \;\;\;\;...(1)\\
w(0, 1) * w(0, 0) = w(0, 1) \;\;\;\;...(2)\\
w(0, 1) * w(0, 1) = w(0, 1) \;\;\;\;...(3)\\
w(1, 0) * w(1, 1) = w(1, 1) \;\;\;\;...(4)\\
w(1, 1) * w(1, 1) = w(1, 0)\;\;\;\; ...(5)\\
w(1, 0) * w(1, 0) = w(1, 0) \;\;\;\;... (6)
\]
注意到矩阵要有逆,因此秩需要为\(2\)
然后就可以弄出这么一个矩阵
\[
\begin{bmatrix} 1& 1\\ 1& -1 \end{bmatrix} = \begin{bmatrix}
0.5& 0.5\\
0.5& -0.5\\
\end{bmatrix}^{-1}
\]
然后代进程序即可
\(k\)进制\(FWT\)
计算\(C_k = \sum \limits_{i \oplus j = k} A_i * B_j\)
由于\(K\)进制下,FMT仍然能解决或卷积以及和卷积,因此FWT一般用来解决异或卷积
在下文中,\(n = K^i - 1\)
自然地,还是希望构造\(TA \cdot TB = TC\)
还是一样的展开
\[fwt(A)[x] \cdot fwt(B)[x] = fwt(C)[x]\]
\[\sum \limits_{i = 0}^n w(x, i) * A_i \sum \limits_{j = 0}^n w(x, j) * B_j = \sum \limits_{k = 0}^n w(x, k) * C_k\]
还是一样的对比系数,然后我们能够得出,当\(w(x, i) * w(x, j) = w(x, k) \;(i \oplus j = k)\)时,这样子做的正确性有保证
并且,同样的,不妨设\(i = (i_0 i_1 i_2 ... i_m)_k\)
那么,我们构造\[w(i, j) = \prod \limits_{t = 0}^{m} w(i_t, j_t)\]
我们根据\(i\)在\(k\)进制下的最高位来讨论,我们记一个数\(x\)在\(k\)进制下的最高位为\(x'\),其余位为\(x''\)
\[
\begin{aligned}
fwt(A)[i] &= \sum \limits_{t = 0}^n w(i, t) A_t \\
&= \sum \limits_{t = 0}^{k - 1} w(i', t) \sum \limits_{x' = t} w(i'', x'') A_x \\
&= \sum \limits_{t = 0}^{k - 1} w(i', t) fwt(A_t)[i'']
\end{aligned}
\]
复杂度是\(T(n) = kT(n / K) + O(Kn) = O(nK \log_K n)\)(\(n\)是\(K\)的幂)
我们需要考虑\(K * K\)的\(T\)矩阵是什么
由于\(w(x, i) * w(x, j) = w(x, k) (i \oplus j = k)\),也就是\(w(x, i) * w(x, j) = w(x, k) ([K | i + j - k])\)
注意到单位根在复平面意义下有循环的意义
因此,我们尝试取\(w(x, i) = w_k^{xi}\),那么我们取出来的实际上就是范德蒙德矩阵!
\[
\begin{bmatrix}
1& 1 & 1& ... & 1\\
1& w_k^1& w_k^2& ... & w_k^{k - 1}\\
1& w_k^2 & w_k^4& ... & w_k^{2(k - 1)}\\
...& ...& ...& ...& ...\\
1& w_k^{k - 1}& w_k^{2(k - 1)} & ... & w_k^{(k - 1)(k - 1)}
\end{bmatrix}
\]
由于范德蒙德卷积的行列式为\(\prod \limits_{i < j} (x_i - x_j)\),在这个单位根矩阵中,不存在两两相等的数
因此这个有逆,事实上, 在FFT中,我们早已经见过这个矩阵的逆矩阵了,它是
\[
\frac{1}{k} \begin{bmatrix}
1& 1 & 1& ... & 1\\
1& w_k^{-1}& w_k^{-2}& ... & w_k^{-(k - 1)}\\
1& w_k^{-2} & w_k^{-4}& ... & w_k^{-2(k - 1)}\\
...& ...& ...& ...& ...\\
1& w_k^{-(k - 1)}& w_k^{-2(k - 1)} & ... & w_k^{-(k - 1)(k - 1)}
\end{bmatrix}
\]
原因是\([n | t] = \sum \limits_{i = 0}^{n - 1} w_n^{ti}\)
这样,我们就可以成功的计算出k进制FWT啦!
感谢rqy和dkw的提示
快速沃尔什变换与k进制FWT的更多相关文章
- 2019.7.3模拟 七星连珠(行列式+随机+k进制FWT)
题目大意: 给一个\(n*n\)的矩阵,对于所有排列p,记录\(a[i][p[i]]\)的k进制下不进位加法的结果,问所有被记录过的数. \(n<=50,p=2.3,0<=a[i][j]& ...
- 快速沃尔什变换(FWT)及K进制异或卷积&快速子集变换(FST)讲解
前言: $FWT$是用来处理位运算(异或.与.或)卷积的一种变换.位运算卷积是什么?形如$f[i]=\sum\limits_{j\oplus k==i}^{ }g[j]*h[k]$的卷积形式(其中$\ ...
- CF459C Pashmak and Buses (构造d位k进制数
C - Pashmak and Buses Codeforces Round #261 (Div. 2) C. Pashmak and Buses time limit per test 1 seco ...
- P1066 2^k进制数
传送门 题目描述 设r是个2^k 进制数,并满足以下条件: (1)r至少是个2位的2^k 进制数. (2)作为2^k 进制数,除最后一位外,r的每一位严格小于它右边相邻的那一位. (3)将r转换为2进 ...
- 洛谷 P1066 2^k进制数
P1066 2^k进制数 题目描述 设r是个2^k 进制数,并满足以下条件: (1)r至少是个2位的2^k 进制数. (2)作为2^k 进制数,除最后一位外,r的每一位严格小于它右边相邻的那一位. ( ...
- 洛谷P1066 2^k进制数(题解)(递推版)
https://www.luogu.org/problemnew/show/P1066(题目传送) (题解)https://www.luogu.org/problemnew/solution/P106 ...
- K进制数
题目描述 考虑包含N位数字的K-进制数. 定义一个数有效, 如果其K-进制表示不包含两连续的0. 考虑包含N位数字的K-进制数. 定义一个数有效, 如果其K-进制表示不包含两连续的0. 例: 1010 ...
- 【洛谷p1066】2^k进制数
(不会敲键盘惹qwq) 2^k进制数[传送门] 算法标签: (又是一个提高+省选-的题) 如果我说我没听懂你信吗 代码qwq: #include<iostream> #include< ...
- Ecust DIV3 k进制 【暴力不断优化】
K进制 Description 给定一个正整数n,请你判断在哪些进制下n的表示恰好有2位是1,其余位都是0. Input 输入第一行为整数TT,表示有TT组数据(1 \le T \le 50)(1≤T ...
随机推荐
- HTTP header location 重定向 URL
http头信息 头信息的作用很多,最主要的有下面几个:1.跳转当浏览器接受到头信息中的 Location: xxxx 后,就会自动跳转到 xxxx 指向的URL地址,这点有点类似用 js 写跳转.但是 ...
- RestFul风格接口示例
REST是英文representational state transfer(表象性状态转变)或者表述性状态转移;Rest是web服务的一种架构风格;使用HTTP,URI,XML,JSON,HTML等 ...
- 2018年5月6日GDCPC (广东赛区)总结
试机是队友浩哥一个人去的,因为觉得华工去了不少次了,环境也比较熟悉了.直到看到了现场环境,感觉有些拥挤,不如从前那样宽敞,增加了一些紧张的不适感. 比赛开始时,我们三人分头读题,虽说题目比较简短,但第 ...
- jdk1.8.0_45源码解读——Map接口和AbstractMap抽象类的实现
jdk1.8.0_45源码解读——Map接口和AbstractMap抽象类的实现 一. Map架构 如上图:(01) Map 是映射接口,Map中存储的内容是键值对(key-value).(02) A ...
- 图的最短路径-----------Dijkstra算法详解(TjuOj2870_The Kth City)
做OJ需要用到搜索最短路径的题,于是整理了一下关于图的搜索算法: 图的搜索大致有三种比较常用的算法: 迪杰斯特拉算法(Dijkstra算法) 弗洛伊德算法(Floyd算法) SPFA算法 Dijkst ...
- 洛谷 P1609 最小回文数 题解
这题其实并不难,重点在你对回文数的了解,根本就不需要高精度. 打个比方: 对于一个形如 ABCDEFGH 的整数 有且仅有一个比它大的最小回文数 有且仅有一个比它小的最大回文数 而整数 ABCDDCB ...
- 【项目部署】部署项目以war包部署和解开以目录部署的区别
我们都知道最简单的部署web项目的方式是打成war包直接仍在tomcat的webapps目录下,我上个项目也确实是这样做的,可是这给我们后期的维护带来了极大的不便,下面就简单研究一下以war包部署和解 ...
- expect学习笔记及实例详解【转】
1. expect是基于tcl演变而来的,所以很多语法和tcl类似,基本的语法如下所示:1.1 首行加上/usr/bin/expect1.2 spawn: 后面加上需要执行的shell命令,比如说sp ...
- 关于iTerm2中颜色配置及快捷键使用技巧(亲测)
https://github.com/mbadolato/iTerm2-Color-Schemes http://chriskempson.com/projects/base16 (同事用的) 按照g ...
- php ++测试
2014年4月27日 12:17:47 结论暂时没有组织语言去表述,但是看看测试结果大家都会明白的 $x = 1; $y = empty($x) ? 3 : $x++; var_dump($x,$y) ...