数学板块学习之FWT
FWT
快速沃尔什变换,在计算数学中,一个与阿达马变换有高度相关的快速沃尔什转换(fast Walsh–Hadamard transform,FWHTh)是一个十分有效率的算法,目的是计算阿达马变换。快速沃尔什转换是一个分而治之的算法,是一个常见的递回方法,将大小N的沃尔什转换拆成两个大小为N/2 的沃尔什转换。——百度百科
参考博客:
https://www.cnblogs.com/cjyyb/p/9065615.html
https://blog.csdn.net/zhouyuheng2003/article/details/84728063
首先,我们要弄明白我们为什么要用FWT,用它求什么。
对于Cn=∑i+j=nAi∗BjCn=∑i∗j=nAi∗BjCn=∑i∣j=nAi∗BjCn=∑i&j=nAi∗BjCn=∑i⊕j=nAi∗Bj\begin{aligned} C_n&=\sum_{i+j=n}A_i*B_j\\ C_n&=\sum_{i*j=n}A_i*B_j\\ C_n&=\sum_{i|j=n}A_i*B_j\\ C_n&=\sum_{i\&j=n}A_i*B_j\\ C_n&=\sum_{i\oplus j=n}A_i*B_j\\ \end{aligned}CnCnCnCnCn=i+j=n∑Ai∗Bj=i∗j=n∑Ai∗Bj=i∣j=n∑Ai∗Bj=i&j=n∑Ai∗Bj=i⊕j=n∑Ai∗Bj
对于这几个公式,第一个的i+j=ni+j=ni+j=n是可以使用FFT来求取的,第二个的i∗j=ni*j=ni∗j=n的特殊情况下也是可以使用FFT的。但是后面三个是无法使用FFT的。所以也就有了FWT
定义:
A−B=(a0−b0,a1−b1,⋯ ,an−1−bn−1)A+B=(a0+b0,a1+b1,⋯ ,an−1+bn−1)A∗B=(a0∗b0,a1∗b1,⋯ ,an−1∗bn−1)A@B=(∑i@j=0ai∗bj,∑i@j=1ai∗bj,⋯ ,∑i@j=n−1ai∗bj)\begin{aligned} A-B&=(a_0-b_0,a_1-b_1,\cdots,a_{n-1}-b_{n-1})\\ A+B&=(a_0+b_0,a_1+b_1,\cdots,a_{n-1}+b_{n-1})\\ A*B&=(a_0*b_0,a_1*b_1,\cdots,a_{n-1}*b_{n-1})\\ A@B&=(\sum_{i@j=0}a_i*b_j,\sum_{i@j=1}a_i*b_j,\cdots,\sum_{i@j=n-1}a_i*b_j) \end{aligned}A−BA+BA∗BA@B=(a0−b0,a1−b1,⋯,an−1−bn−1)=(a0+b0,a1+b1,⋯,an−1+bn−1)=(a0∗b0,a1∗b1,⋯,an−1∗bn−1)=(i@j=0∑ai∗bj,i@j=1∑ai∗bj,⋯,i@j=n−1∑ai∗bj)
其中@@@属于集合{∣(或),&(与),∧(异或)}\{ |(或),\&(与), \wedge(异或) \}{∣(或),&(与),∧(异或)}
并且@@@运算具有分配率A@(B+C)=A@B+A@CA@(B+C)=A@B+A@CA@(B+C)=A@B+A@C也具有交换律A∣B=B∣AA|B=B|AA∣B=B∣A
另外定义A0A_0A0为多项式AAA(A有2n2^n2n项)的前2n−12^{n-1}2n−1项,A1A_1A1为多项式AAA的后2n−12^{n-1}2n−1项
A=(A0,A1)A=(A_0,A_1)A=(A0,A1)表示多项式A0A_0A0后面加上A1A_1A1多项式形成多项式AAA
思路
和FFT一样,先进行FWT求出两个多项式的FWT(A),FWT(B)FWT(A),FWT(B)FWT(A),FWT(B),然后对应相乘得到FWT(C)FWT(C)FWT(C),最后逆运算IFWT得到答案多项式C
1.OR 或卷积
ck=∑i∣j=kai∗bjC=A∣B=(∑i∣j=0ai∗bj,∑i∣j=1ai∗bj,⋯ ,∑i∣j=n−1ai∗bj)\begin{aligned} c_k&=\sum_{i|j=k}a_i*b_j\\ C=A|B&=(\sum_{i|j=0}a_i*b_j,\sum_{i|j=1}a_i*b_j,\cdots,\sum_{i|j=n-1}a_i*b_j)\\ \end{aligned}ckC=A∣B=i∣j=k∑ai∗bj=(i∣j=0∑ai∗bj,i∣j=1∑ai∗bj,⋯,i∣j=n−1∑ai∗bj)
正变换FWT(A)={(FWT(A0),FWT(A0+A1))n>0An=0FWT(A)=\begin{cases} (FWT(A_0),FWT(A_0+A_1))&\text{n>0}\\ A&\text{n=0} \end{cases}FWT(A)={(FWT(A0),FWT(A0+A1))An>0n=0
对应项相乘
FWT(C)=FWT(A)∗FWT(B)FWT(C)=FWT(A)*FWT(B)FWT(C)=FWT(A)∗FWT(B)
逆变换
IFWT(A)={(IFWT(A0),IFWT(A1)−IFWT(A0))n>0An=0IFWT(A)=\begin{cases} (IFWT(A_0),IFWT(A_1)-IFWT(A_0))&\text{n>0}\\ A&\text{n=0} \end{cases}IFWT(A)={(IFWT(A0),IFWT(A1)−IFWT(A0))An>0n=0
2.AND 与卷积
ck=∑i&j=kai∗bjC=A&B=(∑i&j=0ai∗bj,∑i&j=1ai∗bj,⋯ ,∑i&j=n−1ai∗bj)\begin{aligned} c_k&=\sum_{i\&j=k}a_i*b_j\\ C=A\&B&=(\sum_{i\&j=0}a_i*b_j,\sum_{i\&j=1}a_i*b_j,\cdots,\sum_{i\&j=n-1}a_i*b_j)\\ \end{aligned}ckC=A&B=i&j=k∑ai∗bj=(i&j=0∑ai∗bj,i&j=1∑ai∗bj,⋯,i&j=n−1∑ai∗bj)
正变换FWT(A)={(FWT(A0+A1),FWT(A1))n>0An=0FWT(A)=\begin{cases} (FWT(A_0+A_1),FWT(A_1))&\text{n>0}\\ A&\text{n=0} \end{cases}FWT(A)={(FWT(A0+A1),FWT(A1))An>0n=0
对应项相乘
FWT(C)=FWT(A)∗FWT(B)FWT(C)=FWT(A)*FWT(B)FWT(C)=FWT(A)∗FWT(B)
逆变换
IFWT(A)={(IFWT(A0)−IFWT(A1),IFWT(A0))n>0An=0IFWT(A)=\begin{cases} (IFWT(A_0)-IFWT(A_1),IFWT(A_0))&\text{n>0}\\ A&\text{n=0} \end{cases}IFWT(A)={(IFWT(A0)−IFWT(A1),IFWT(A0))An>0n=0
3.XOR 异或卷积
ck=∑i⊕j=kai∗bjC=A⊕B=(∑i⊕j=0ai∗bj,∑i⊕j=1ai∗bj,⋯ ,∑i⊕j=n−1ai∗bj)\begin{aligned} c_k&=\sum_{i\oplus j=k}a_i*b_j\\ C=A\oplus B&=(\sum_{i\oplus j=0}a_i*b_j,\sum_{i\oplus j=1}a_i*b_j,\cdots,\sum_{i\oplus j=n-1}a_i*b_j)\\ \end{aligned}ckC=A⊕B=i⊕j=k∑ai∗bj=(i⊕j=0∑ai∗bj,i⊕j=1∑ai∗bj,⋯,i⊕j=n−1∑ai∗bj)
正变换FWT(A)={(FWT(A0+A1),FWT(A0−A1))n>0An=0FWT(A)=\begin{cases} (FWT(A_0+A_1),FWT(A_0-A_1))&\text{n>0}\\ A&\text{n=0} \end{cases}FWT(A)={(FWT(A0+A1),FWT(A0−A1))An>0n=0
对应项相乘
FWT(C)=FWT(A)∗FWT(B)FWT(C)=FWT(A)*FWT(B)FWT(C)=FWT(A)∗FWT(B)
逆变换
IFWT(A)={(IFWT(A0)+IFWT(A1)2,IFWT(A0)−IFWT(A1)2)n>0An=0IFWT(A)=\begin{cases} (\cfrac{IFWT(A_0)+IFWT(A_1)}{2},\cfrac{IFWT(A_0)-IFWT(A_1)}{2})&\text{n>0}\\ A&\text{n=0} \end{cases}IFWT(A)=⎩⎨⎧(2IFWT(A0)+IFWT(A1),2IFWT(A0)−IFWT(A1))An>0n=0
代码
/*
*opt = 1 正变换
*opt = -1 逆变换
*/
void FWT_or(int *a,int opt,int N){for(int i = 1; i < N; i <<= 1){for(int p = i<<1,j = 0; j < N; j += p){for(int k = 0; k < i; ++k){int x = a[j+k],y = a[i+j+k];if(opt == 1) a[i+j+k] = (x+y)%MOD;else a[i+j+k] = (y-x+MOD)%MOD;}}}
}void FWT_and(int *a,int opt,int N){for(int i = 1; i < N; i <<= 1){for(int p = i<<1, j = 0; j < N; j += p){for(int k = 0; k < i; ++k){int x = a[j+k],y = a[i+j+k];if(opt == 1) a[i+j+k] = (x+y)%MOD;else a[i+j+k] = (x-y+MOD)%MOD;}}}
}void FWT_xor(int *a,int opt,int N){for(int i = 1; i < N; i <<= 1){for(int p = i<<1,j = 0; j < N; j += p){for(int k = 0; k < i; ++k){int x = a[j+k],y = a[i+j+k];a[j+k] = (x+y)%MOD;a[i+j+k] = (x-y+MOD)%MOD;//inv2表示2在模mod下的逆元,如果不是在模意义下的话,开一个long long,然后把乘逆元变成直接除二if(opt == -1) a[j+k] = 1LL*a[j+k]*inv2%MOD,a[i+j+k] = 1LL*a[i+j+k]*inv2%MOD;}}}
}
数学板块学习之FWT相关推荐
- 虚幻引擎的数学知识学习教程 Math for Unreal Engine (Early Preview)
通过做真实世界的 Unreal Engine项目来学习数学 你会学到什么 理解游戏开发对数学的基本需求 将数学直接应用到用例中,而不是钻研理论(用我们的示例项目进行实践) 正确编辑短视频,节省您的时间 ...
- 为什么您不需要精通数学就可以学习编程
by Pau Pavón 通过保罗·帕文(PauPavón) 为什么您不需要精通数学就可以学习编程 (Why you don't need to excel at math to learn how ...
- parallels desktop big sur 网络_初中生数学网络学习哪个好
初中生数学网络学习哪个好?去试听一下简单学习网课程,注册就可以免费学习7天了,语文李华老师,数学傲德老师.黄炜老师,英语麻雪玲老师,课程都讲得很好,还是封闭课堂听课,特别适合自制力没那么好的同学. 初 ...
- 数学建模学习交流论文写作课件
数学建模学习交流论文写作课件 参考资料:数学建模清风:论文写作方法课程 https://www.bilibili.com/video/BV1Na411w7c2
- 美赛整理之Matlab的工程数学计算学习笔记(高等数学)
美赛整理之Matlab的工程数学计算学习笔记(高等数学) 1.极限的定义和判别: 2.绘制特殊曲面 3.求两个空间曲面的交线 4.定积分的计算 5.多重积分的计算 1.截面法: 2.定义法 (1)先画 ...
- 数学建模学习思维导图
数学建模学习 建模方法框架总结
- 数学建模学习记录——数学规划模型
数学建模学习记录--数学规划模型 一.线性规划问题 MatLab中线性规划的标准型 MatLab中求解线性规划的命令 二.整数线性规划问题 三.非线性规划问题 MatLab中非线性规划的标准型 Mat ...
- 以信息技术促进小学数学探究学习
以信息技术促进小学数学探究学习 宁剑峰 [摘要] 教师在数学教学中,要善于运用现代信息技术手段,创设生动具体的学习情境,激发学生学习热情,唤起学生的参与欲望,引发学生的好奇心,使学生产生兴趣,自主探索 ...
- 数学建模学习——回归分析
1.多元线性回归 回归分为:解释型回归.预测型回归 解释型回归:只需知道相对重要程度 预测型回归:关注预测出来有多准 需要考虑异方差 BP检验相应的Stata命令:estat hettest,rhs, ...
最新文章
- SpringBoot实战(四)之使用JDBC和Spring访问数据库
- python 零代码快速开发平台_现在低代码开发平台和零代码平台区别是什么?
- word 编辑域中的汉字_word中插入的cad对象无法双击编辑问题解决记录
- linux那些事之zero page
- 爬虫-csdn博客爬虫-打造具有搜索功能的小工具
- thinkphp extend.php,【ThinkPHP5.1】如何引用extend的类库
- Oracle 10g RMAN 跨平台迁移
- 基于Springboot+MyBatisPlus+Vue前后端分离大学生毕业论文答辩系统
- 如何在线免费获取RStudio Conference 2020研讨会资料
- 夕四今晚加班到2点30,而王二还不打算走《打工人的那些事》
- 麒麟810处理器_华为携7nm麒麟810处理器 剑指高通
- android5.1 取消录制屏幕跳出的权限对话框
- [毅周总结]数据结构(1)
- mysql:mysql数据库下载及安装(详细)
- 思科链路聚合Port
- 一篇文章详细介绍元宇宙
- PTA 1056 Mice and Rice (25分)
- 忠告360安全卫士督导委员:小心沦为周鸿一的工具(zz)
- “源”来是你-Vol.32 | 知名图数据平台 Neo4j 招聘中国社区经理
- 五色石FCS周报 2019.6.3-2019.6.9
热门文章
- 程序 数列求和 c语言,[编程入门]有规律的数列求和-题解(C语言代码)
- [转载]实时 Java,第 4 部分: 实时垃圾收集
- wps插入C/C++代码
- 学习ios Metal(9)—iphone X真实感深度相机True Depth Camera的调用和metal GPGPU
- 关于RK3288开发板的学习(1)
- 使用NSIS脚本制作一个安装包
- NR 5G 系统信息
- 第十三章:Sqlserver2019数据库之Transact-SQL 语法基础及常用 SQL 函数总结
- C++将二进制转换为十进制
- 为什么计算机二级未来教育评分低,未来教育计算机Msoffice二级, PPT评分总是说文件不存在, 分数总是0分, 到底是为什么?...