快速沃尔什变换与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的提示

原文地址:https://www.cnblogs.com/reverymoon/p/10197711.html

时间: 2024-11-06 03:38:51

快速沃尔什变换与k进制FWT的相关文章

LG5577 算力训练 k进制FWT

题意说人话就是给出一个长度为\(n\)的数列\(a_1,a_2,...,a_n\),求\(\prod\limits_{i=1}^n (1+x^{a_i})\),其中卷积的下标加法定义为\(k\)进制不进位加法. \(k\)进制不进位加法不难想到\(k\)进制FWT,所以我们需要快速求出\(\prod\limits_{i=1}^n \mathrm{DWT}_k(1 + x^{a_i})\),这里的乘法是点积,最后IDWT回来即可. 因为要用形式幂级数做到乘单位根,所以我们获得了一个\(O(nk^m

2^k进制数

[题目描述] 设R是个2^k进制数,并满足以下条件: (1)R至少是个2位的2^k进制数: (2)作为2^k进制数,除最后一位外,R的每一位严格小于它右边相邻的那一位: (3)将R转换为2进制数q后,则q的总位数不超过w: 在这里,正整数k(1 ≤ k ≤ 9)和w(k < w ≤30000)是事先给定的. 询问满足上述条件的不同的r共有多少个. 我们再从另一角度作些解释: 设S是长度为w的01字符串(即字符串S由w个“0”或“1”组成),S对应于上述条件(3)中的q.将S从右起划分为若干个长度

[NOIP2006] 提高组 洛谷P1066 2^k进制数

题目描述 设r是个2^k 进制数,并满足以下条件: (1)r至少是个2位的2^k 进制数. (2)作为2^k 进制数,除最后一位外,r的每一位严格小于它右边相邻的那一位. (3)将r转换为2进制数q后,则q的总位数不超过w. 在这里,正整数k(1≤k≤9)和w(k<W< span>≤30000)是事先给定的. 问:满足上述条件的不同的r共有多少个? 我们再从另一角度作些解释:设S是长度为w 的01字符串(即字符串S由w个“0”或“1”组成),S对应于上述条件(3)中的q.将S从右起划分为

P1066 2^k进制数

P1066 2^k进制数 204通过 373提交 题目提供者洛谷OnlineJudge 标签数论(数学相关)高精NOIp提高组2006 难度提高+/省选- 提交该题 讨论 题解 记录 最新讨论 暂时没有讨论 题目描述 设r是个2^k 进制数,并满足以下条件: (1)r至少是个2位的2^k 进制数. (2)作为2^k 进制数,除最后一位外,r的每一位严格小于它右边相邻的那一位. (3)将r转换为2进制数q后,则q的总位数不超过w. 在这里,正整数k(1≤k≤9)和w(k<W< span>≤

SDUT 3503 有两个正整数,求N!的K进制的位数

有两个正整数,求N!的K进制的位数 题目链接:action=showproblem&problemid=3503">http://sdutacm.org/sdutoj/problem.php? action=showproblem&problemid=3503 #include <bits/stdc++.h> using namespace std; const double eps = 1e-6; const double PI = acos(-1.0); c

51nod 1116:K进制下的大数

51nod 1116:K进制下的大数 题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1116 题目大意:给定一个大数,该数在$K$进制下是$K-1$的倍数,问最小的$K$($2 \leqslant K \leqslant 36$)是多少,若无解输出No Solution. 二项式定理 这题虽然可以暴力枚举,但还有更优雅的做法. 考虑一个$K$进制的大数$A$可以被表示为$\sum_{x=0}a_xK^x$,

c++ k进制Huffman树

原址:http://blog.csdn.net/Quack_quack/article/details/46958413 题目大意:给出n个数字w[],代表n个字母出现的次数,给出k.要求用k进制的数字串si替换第i个字母,且替换之后要求替换后的文章无二义性(这里的无二义性是指对于任意的 1≤i,j≤n ,i≠j,都有: si不是sj的前缀),求替换后最短的文章的长度(长度len=sigma(w[i]*strlen(si)))和这种情况下最大的si的最小值. 数据范围:n<=100000,k<

洛谷 P1066 2^k进制数

P1066 2^k进制数 题目描述 设r是个2^k 进制数,并满足以下条件: (1)r至少是个2位的2^k 进制数. (2)作为2^k 进制数,除最后一位外,r的每一位严格小于它右边相邻的那一位. (3)将r转换为2进制数q后,则q的总位数不超过w. 在这里,正整数k(1≤k≤9)和w(k<W< span>≤30000)是事先给定的. 问:满足上述条件的不同的r共有多少个? 我们再从另一角度作些解释:设S是长度为w 的01字符串(即字符串S由w个“0”或“1”组成),S对应于上述条件(3

k进制正整数的对k-1取余与按位取余

华电北风吹 天津大学认知计算与应用重点实验室 日期:2015/8/24 先说一下结论 有k进制数abcd,有abcd%(k?1)=(a+b+c+d)%(k?1) 这是由于kn=((k?1)+1)n=∑ni=0Cin(k?1)i 因此kn 对(k-1)取余的话为1 比如10进制1425%9=3,(1+4+2+5)=12%9=3. 这个性质眼下我在两个地方见到了 (一)算法导论第11章讲散列表的时候,除法散列的时候 h(k)=kmod m 对于m的选取,若m取2p或者2p?1 均是不合适的选择,前者