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}Cn​Cn​Cn​Cn​Cn​​=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}ck​C=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​))A​n>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​))A​n>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}ck​C=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​))A​n>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​))A​n>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}ck​C=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​))A​n>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​)​)A​n>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相关推荐

  1. 虚幻引擎的数学知识学习教程 Math for Unreal Engine (Early Preview)

    通过做真实世界的 Unreal Engine项目来学习数学 你会学到什么 理解游戏开发对数学的基本需求 将数学直接应用到用例中,而不是钻研理论(用我们的示例项目进行实践) 正确编辑短视频,节省您的时间 ...

  2. 为什么您不需要精通数学就可以学习编程

    by Pau Pavón 通过保罗·帕文(PauPavón) 为什么您不需要精通数学就可以学习编程 (Why you don't need to excel at math to learn how ...

  3. parallels desktop big sur 网络_初中生数学网络学习哪个好

    初中生数学网络学习哪个好?去试听一下简单学习网课程,注册就可以免费学习7天了,语文李华老师,数学傲德老师.黄炜老师,英语麻雪玲老师,课程都讲得很好,还是封闭课堂听课,特别适合自制力没那么好的同学. 初 ...

  4. 数学建模学习交流论文写作课件

    数学建模学习交流论文写作课件 参考资料:数学建模清风:论文写作方法课程 https://www.bilibili.com/video/BV1Na411w7c2

  5. 美赛整理之Matlab的工程数学计算学习笔记(高等数学)

    美赛整理之Matlab的工程数学计算学习笔记(高等数学) 1.极限的定义和判别: 2.绘制特殊曲面 3.求两个空间曲面的交线 4.定积分的计算 5.多重积分的计算 1.截面法: 2.定义法 (1)先画 ...

  6. 数学建模学习思维导图

    数学建模学习 建模方法框架总结

  7. 数学建模学习记录——数学规划模型

    数学建模学习记录--数学规划模型 一.线性规划问题 MatLab中线性规划的标准型 MatLab中求解线性规划的命令 二.整数线性规划问题 三.非线性规划问题 MatLab中非线性规划的标准型 Mat ...

  8. 以信息技术促进小学数学探究学习

    以信息技术促进小学数学探究学习 宁剑峰 [摘要] 教师在数学教学中,要善于运用现代信息技术手段,创设生动具体的学习情境,激发学生学习热情,唤起学生的参与欲望,引发学生的好奇心,使学生产生兴趣,自主探索 ...

  9. 数学建模学习——回归分析

    1.多元线性回归 回归分为:解释型回归.预测型回归 解释型回归:只需知道相对重要程度 预测型回归:关注预测出来有多准 需要考虑异方差 BP检验相应的Stata命令:estat hettest,rhs, ...

最新文章

  1. SpringBoot实战(四)之使用JDBC和Spring访问数据库
  2. python 零代码快速开发平台_现在低代码开发平台和零代码平台区别是什么?
  3. word 编辑域中的汉字_word中插入的cad对象无法双击编辑问题解决记录
  4. linux那些事之zero page
  5. 爬虫-csdn博客爬虫-打造具有搜索功能的小工具
  6. thinkphp extend.php,【ThinkPHP5.1】如何引用extend的类库
  7. Oracle 10g RMAN 跨平台迁移
  8. 基于Springboot+MyBatisPlus+Vue前后端分离大学生毕业论文答辩系统
  9. 如何在线免费获取RStudio Conference 2020研讨会资料
  10. 夕四今晚加班到2点30,而王二还不打算走《打工人的那些事》
  11. 麒麟810处理器_华为携7nm麒麟810处理器 剑指高通
  12. android5.1 取消录制屏幕跳出的权限对话框
  13. [毅周总结]数据结构(1)
  14. mysql:mysql数据库下载及安装(详细)
  15. 思科链路聚合Port
  16. 一篇文章详细介绍元宇宙
  17. PTA 1056 Mice and Rice (25分)
  18. 忠告360安全卫士督导委员:小心沦为周鸿一的工具(zz)
  19. “源”来是你-Vol.32 | 知名图数据平台 Neo4j 招聘中国社区经理
  20. 五色石FCS周报 2019.6.3-2019.6.9

热门文章

  1. 程序 数列求和 c语言,[编程入门]有规律的数列求和-题解(C语言代码)
  2. [转载]实时 Java,第 4 部分: 实时垃圾收集
  3. wps插入C/C++代码
  4. 学习ios Metal(9)—iphone X真实感深度相机True Depth Camera的调用和metal GPGPU
  5. 关于RK3288开发板的学习(1)
  6. 使用NSIS脚本制作一个安装包
  7. NR 5G 系统信息
  8. 第十三章:Sqlserver2019数据库之Transact-SQL 语法基础及常用 SQL 函数总结
  9. C++将二进制转换为十进制
  10. 为什么计算机二级未来教育评分低,未来教育计算机Msoffice二级, PPT评分总是说文件不存在, 分数总是0分, 到底是为什么?...