首页 > 其他分享 >FWT 学习笔记

FWT 学习笔记

时间:2023-12-24 16:33:53浏览次数:30  
标签:text sum t2 笔记 times 学习 FWT t1

解决的问题

\(\rm FWT\) 是用来解决位运算卷积的。

啥是位运算卷积呢?

常见的多项式乘法可以认为是一种加法卷积,即 \(A_{i+j}=\sum B_i \times C_j\)。

位运算卷积就是 \(A_{i \ \text{Or/And/Xor} \ j}=\sum B_i \times C_j\)。

主要思想

现在以异或卷积为例,默认 \(n=2^k\)。

回忆 \(\rm FFT/NTT\) 的过程,最重要的一步就是把多项式转成点值表示,然后卷积就变成了点积。

所以,我们希望 \(\rm FWT\) 也能把卷积转成点积。

设 \(\text{FWT}(A)\) 表示幂级数 \(A\) 通过 \(\rm FWT\) 转化成的幂级数。

我们想让 \(\rm FWT\) 满足若 \(A * B = C\),则

\[\text{FWT}(A) ⋅ \text{FWT}(B)=\text{FWT}(C) \]

设 \(c(i,j)\) 为 \(A_j\) 贡献到 \(\text{FWT}(A)_j\) 的系数。

那么有 \(\text{FWT}(A)_i = \sum A_j \times c(i,j)\)。

带入原式,得到:

\[\sum A_j \times c(i,j) \times \sum B_k \times c(i,k) = \sum C_p \times c(i,p) \]

\[\sum \sum c(i,j)c(i,k)A_jB_k=\sum C_p \times c(i,p) \]

又由于 \(A * B = C\),所以:

\[C_p = \sum_{t1 \oplus t2=p} A_{t1} \times B_{t2} \]

\[\sum \sum c(i,j)c(i,k)A_jB_k=\sum_{p=0}^{n-1} c(i,p) \times \sum_{t1 \oplus t2=p} A_{t1} \times B_{t2} \]

又因为:

\[\sum \sum c(i,j)c(i,k)A_jB_k=\sum_{p=0}^{n-1} \sum_{t1 \oplus t2=p} c(i,t1)c(i,t2)A_{t1}B_{t2}=\sum_{p=0}^{n-1} \sum_{t1 \oplus t2=p} c(i,t1) \times c(i,t2) \sum_{t1 \oplus t2=p} A_{t1} \times B_{t2} \]

然后就得到:

\[\sum_{p=0}^{n-1} c(i,p) \times \sum_{t1 \oplus t2=p} A_{t1} \times B_{t2}=\sum_{p=0}^{n-1} \sum_{t1\oplus t2=p} c(i,t1) \times c(i,t2) \sum_{t1 \oplus t2=p} A_{t1} \times B_{t2} \]

所以 \(c\) 只需满足 \(c(i,j) \times c(i,k)=c(i,j \oplus k)\)。

又因为位运算的独立性,所以 \(c(i,j)\) 可以分位考虑。

设 \(d(0/1,0/1)\) 表示某种满足要求的变换。

那么把每一位乘起来,设 \(x_i\) 表示 \(x\) 的二进制第 \(i\) 位,得到

\[c(i,j) = d(i_0,j_0) \times d(i_1,j_1) \times ... \]

实现

假设我们已经求出 \(c\) 和 \(d\),那么我们现在需要快速求解。

\[\text{FWT}(A)_i=\sum c(i,j) \times A_j \]

那么根据位运算的优秀性质,设 \(x'\) 表示 \(x\) 去掉二进制首位后变成的数,我们可以从中间劈开来,得到:

\[\text{FWT}(A)_i=\sum_{j=0}^{\frac{n}{2}-1} c(i,j) \times A_j + \sum_{j=\frac{n}{2}}^{n-1} c(i,j) \times A_j \]

\[\text{FWT}(A)_i=\sum_{j=0}^{\frac{n}{2}-1} d(i_0,j_0) \times c(i,j) \times A_j + \sum_{j=\frac{n}{2}}^{n-1} d(i_0,j_0) \times c(i,j) \times A_j \]

\[\text{FWT}(A)_i=d(i_0,0) \times \sum_{j=0}^{\frac{n}{2}-1} c(i,j) \times A_j + d(i_0,1) \times \sum_{j=\frac{n}{2}}^{n-1} c(i,j) \times A_j \]

设 \(A_0\) 为幂级数下标首位为零的部分,\(A_1\) 为幂级数下标首位为一的部分。

如果 \(i_0=0\),那么有:

\[\text{FWT}(A)_i=d(0,0) \text{FWT}(A_0)_i + d(0,1) \text{FWT}(A_1)_i \]

如果 \(i_0=1\),那么有:

\[\text{FWT}(A)_i=d(1,0) \text{FWT}(A_0)_i + d(1,1) \text{FWT}(A_1)_i \]

这里 \(\text{FWT}(A_{0/1})_i\) \(i\) 的范围都是 \([0,\frac{n}{2})\)。

这样我们就可以 \(\mathcal O(n)\) 合并 \(A_0\) 和 \(A_1\) 了,而 \(A_0\) 和 \(A_1\) 的规模都是原问题的一半,所以复杂度为 \(\mathcal O(n \log n)\)。

\(\rm FWT\) 逆变换就相当于矩阵求逆。

inline void FWT(mint *f,const mint d[2][2],int n){
	for (int len=1;len<n;len<<=1)
		for (int p=0;p<n;p+=len+len)
			for (int i=p;i<p+len;++i){
				mint A=f[i],B=f[i+len];
				f[i]=d[0][0]*A+d[0][1]*B;
				f[i+len]=d[1][0]*A+d[1][1]*B;
			}
}
inline void get(mint *a,mint *b,const mint d[2][2],const mint id[2][2]){
	FWT(a,d,n),FWT(b,d,n);
	for (int i=0;i<n;++i) a[i]*=b[i];
	FWT(a,id,n);
}

求解 \(d\) 矩阵

根据定义直接硬推,过程不放了,放几个结论。

\(\rm Or\) 运算的矩阵为:\(\left[\begin{matrix}1 & 0\\1 & 1\end{matrix}\right]\),逆矩阵为:\(\left[\begin{matrix}1 & 0\\-1 & 1\end{matrix}\right]\)。
\(\rm And\) 运算的矩阵为:\(\left[\begin{matrix}1 & 1\\0 & 1\end{matrix}\right]\),逆矩阵为:\(\left[\begin{matrix}1 & -1\\0 & 1\end{matrix}\right]\)。
\(\rm Xor\) 运算的矩阵为:\(\left[\begin{matrix}1 & 1\\1 & -1\end{matrix}\right]\),逆矩阵为:\(\left[\begin{matrix}0.5 & 0.5\\0.5 & -0.5\end{matrix}\right]\)。

参考资料

cmd 博客

标签:text,sum,t2,笔记,times,学习,FWT,t1
From: https://www.cnblogs.com/tx-lcy/p/17924502.html

相关文章

  • 2023-2024-1 学号20231310《计算机基础与程序设计》第十三周学习总结
    作业信息这个作业属于哪个课程2023-2024-1-计算机基础与程序设计这个作业要求在哪里2023-2024-1计算机基础与程序设计第十三周作业这个作业的目标自学教材《C语言程序设计》第12章并完成云班课测试作业正文2023-2024-120231310《计算机基础与程序设计》第十三......
  • 2023-2024-1 20231420 《计算机基础与程序设计》第十三周学习总结
    2023-2024-120231420《计算机基础与程序设计》第十三周学习总结1.作业信息这个作业属于哪个课程2023-2024-1《计算机基础与程序设计》这个作业要求在哪里2023-2024-1计算机基础与程序设计第十三周作业这个作业的目标学习《C语言程序设计》第12章并完成云班课测......
  • Microsoft Azure AI 机器学习笔记-1
    机器学习基础:数据与建模:数据统计和数学建模是处理数据和描述现实情况的关键工具。观测值是记录的数据实例,而特征是描述观测对象的属性。标签则代表监督式学习中的已知输出值。学习类型:监督式学习包括回归(预测数值标签)和分类(预测类别标签),其中分类又分为二元分类和多类......
  • 微信小程序开发学习日志
    文件夹:pages:index:首页logs:日志json配置文件:app.json:app.json为全局配置,包括了所有页面路径(pages)、窗口外观(window)、界面表现(style)、底部tab等。#页面配置会覆盖全局配置project.config.json:"setting": 本地设置"es6": JS编译成ES5是否开启"postcss": 上传代码时样......
  • 强化学习算法真的适合于你的应用吗 —— 强化学习研究方向(研究领域)现有的不足(短板、
    外文原文:WhyYou(Probably)Shouldn’tUseReinforcementLearning地址:https://towardsdatascience.com/why-you-shouldnt-use-reinforcement-learning-163bae193da8中文翻译版本(ChatGPT3.5翻译:)有关这项技术存在很大的炒作,而且理由充分,因为这可能是实现通用人工智能的......
  • 2023-2024-1 20211319《计算机基础与程序设计》第十三周学习总结
    2023-2024-120211319《计算机基础与程序设计》第十三周学习总结作业信息这个作业属于哪个课程<班级的链接>(如2023-2024-1-计算机基础与程序设计)这个作业要求在哪里https://www.cnblogs.com/rocedu/p/9577842.html#WEEK13这个作业的目标<写上具体方面>作业正......
  • 微信小程序开发笔记[6]-蓝牙ble扫描设备
    摘要使用微信小程序扫描BLE设备,找到指定设备后弹窗.平台信息微信开发者工具Stable1.06.2310080原理typescript+less开发模式[https://developers.weixin.qq.com/miniprogram/dev/devtools/compilets.html][https://blog.csdn.net/Boale_H/article/details/121360082]......
  • # 2023-2024-1 20231308 《计算机基础与程序设计》第十三周学习总结
    2023-2024-120231308《计算机基础与程序设计》第十三周学习总结作业信息这个作业属于哪个课程2023-2024-1-计算机基础与程序设计这个作业要求在哪里2023-2024-1计算机基础与程序设计第十三周作业这个作业的目标自学教材《C语言程序设计》第12章并完成云班课测试......
  • exgcd 学习笔记
    定义又名扩展欧几里得算法(辗转相除法)是用来求\(ax+by=gcd(a,b)\)中未知数的算法算法证明拿到一组\(a,b\),设\(G=gcd(a,b)\)目标:求出满足\(ax+by=G(1)\)的\(x\)与\(y\)如果已知一组\(x2,y2\),满足\(bx2+\)\((a\)\(mod\)\(b)y2=G(2)\)此时结合\((1)(2)\)得\(a......
  • Go 语言学习指南:变量、循环、函数、数据类型、Web 框架等全面解析
    学习基础知识掌握Go语言的常见概念,如变量、循环、条件语句、函数、数据类型等等。深入了解Go基础知识的好起点是查阅Go官方文档文章链接:Go编程语言详解:用途、特性、与Python和C++的比较基本语法了解Go语言的基本语法,包括Go程序的执行方式、包引入、主函数等Go......