FFTNTT数学解释
FFT和NTT真是噩梦呢
既然被FFT和NTT坑够了,坑一下其他的人也未尝不可呢
前置知识
- 多项式基础知识
- 矩阵基础知识(之后会一直用矩阵表达)
- FFT:复数基础知识
- NTT:模运算基础知识
单位根介绍
设有一个数a,使得an=1,其中n为满足an=1的最小正整数
满足条件的a有哪些呢?
- 复数域上的(cos(2π/n)+sin(2π/n)*i)(一般用ωn表示)
- 模运算中的原根g(mod n+1)
更宽泛地说,只要在一个集合中定义了加法和乘法,而且二者满足:
- 存在元素“0”,使得加上“0”的结果不变
- 存在元素“1”,使得乘以“1”的结果不变
- 加法/乘法结合律
- 加法/乘法交换律
- 乘法分配律
- 每个非0数都能做除数
- 每个数都能做加减乘数和被除数
- 加减乘除后的运算结果也在这个集合中
(这些基本上是小学学的吧,除了最后一点之外,其他都是废话)
那么里面满足an=1的数都是我们可以讨论的数
这样说,这些数也是可以满足要求的:
- 复数域上ωn的p次方
- 模运算中的原根g(mod n+1)的p次方
这里的a就是我们要找的单位根
好,这下我们来探讨一下FFT&NTT
FFT&NTT的数学推导
首先,我们要知道这两个是干什么的
FFT和NTT都是DFT的分治法下的优化
而DFT则是将多项式的系数表达(就是“满足f(x)=a+bx+cx2+dx3……的多项式”)变为点值表达(就是“经过(a,a'),(b,b'),(c,c')……的多项式”)的暴力算法
用矩阵表达就是:
很明显,DFT的时间复杂度为Θ(n2)的,这时单位元素的作用就体现出来了
我们把单位元素b及b的幂代替xi,其中b所对应的n和矩阵的边长相等,那么可以得到:
看上去就是换了个表示方法,但是变一下形就能分治了:
没看出来?再变一下形试试:
是不是猛然发现我们有两个相同的矩阵了?把相同的矩阵拿出来,去掉0看看:
这不就是把b2代进去的DFT式子吗,通过前面的叙述我们可以知道b2也是单位元素,那么只要一开始的n是2的幂,我们就可以分治了是不是?
事情没有这么简单,细心的可能会发现,我这里挖了一个大坑:前面那个矩阵不是一个方阵,也就是说,前面那个矩阵等于:
但是通过单位元素的定义可以知道,(b2)n/2=1,也就是说有:
下面的半边竟然和上面的一样!忽略掉下面重复的半边矩阵,转移矩阵又变成了一个方阵,我们又可以开始分治了
知道了怎么分治计算其中一个矩阵,我们再看一下另外一个矩阵
另外一个矩阵是对角矩阵,可以在更快的Θ(n)内计算完成,但是我们想要做得更好(卡一卡常),那又怎么办呢?
这时我们可以发现,既然bn=1,n又是2的幂,那么就有bn/2=-1,也就是说:
我们只要后面半边转移时用减号代替加号,而不需要再计算后面半边的幂了,常数减半
到了这一步,基本的FFT&NTT框架就到这里了
IFFT&INTT的变化
说了这么多,把系数表达变成点值表达又有什么用呢?对广大OIer来说当然是加快多项式乘法了
对系数表达式暴力相乘当然是要Θ(n2)的,但是点值表达式就只要Θ(n)了:
但是又怎么把点值表达变回平常的系数表达呢?这就要用到一个公式了(只要记,不用证)
这就给我们了一个IFFT&INTT的方法:把这个新的矩阵和系数再乘回去,我们熟悉的系数表达就回来了
不仅如此,既然b是单位元素,那么b-1就也是单位元素,恩……IFFT&INTT干脆就可以用FFT&NTT的代码嘛
卡常优化
DFT&IDFT的优化介绍完毕了,但是还是很慢,那有什么办法卡常呢?
递归转倍增
我们可以发现,每次分治的时候,原多项式的系数都会移动到不同的矩阵,而且系数移动和计算可以分离,可不可以先移动,再计算呢?
当然!分析之后可以发现,如果把序号为偶数的向量放在序号为奇数的向量前面,那么原来位置为p的系数会移动到rev(p)处,用图来说就是:
(用的是n=16时的例子,因为实在不好表示)
那么我们可以先移动系数,再从下向上倍增地计算,那么就能优化常数了
代码(摘自洛谷日报):
for(int i=0;i<n;i++)r[i]=(r[i>>1]>>1)|((i&1)?n>>1:0);
多项式乘法FFT的“三次变两次”优化
当用FFT计算实系数多项式乘法时,我们可以用这样一个公式快速计算结果:
这样我们就可以把两个多项式相乘变成单个多项式的平方,因此可以偷懒少算一次FFT
参考资料
洛谷日报:https://www.luogu.org/blog/command-block/fft-xue-xi-bi-ji
PS:这里只写了其数学解释,加强理解,并不会对代码实现进行深究
——会某人
转载于:https://www.cnblogs.com/Iamafool/p/10957765.html
FFTNTT数学解释相关推荐
- MACD 的数学解释
目录 MACD 的数学解释 MACD 的一般定义 引入延迟算子 Taylor 展开 权重分析 共振? MACD 的数学解释 MACD 的一般定义 \[ \begin{align*} DIF & ...
- 万向锁的简单数学解释
我们知道用欧拉角表示空间的旋转,容易产生万向锁(Gimbal Lock)问题,这常常不太容易理解.下面给出一个直观的数学解释. 欧拉角表示的空间旋转,可以用绕三个坐标轴的旋转矩阵的乘积表示 万向锁问题 ...
- 【数学与算法】凸函数、凸集、凸函数的一二阶数学解释
1. 凸函数的定义 1.1 凸函数的几何解释 所谓凸函数,其实指的是下凸函数,从几何意义上看,凸函数就是任意两点之间的弦(即这两点构成的线段)都在该函数图像(此处是指这两点之间的函数图像,而非全部的函 ...
- 7-35 猴子吃桃问题(含数学解释)
7-35 猴子吃桃问题 题目 代码 小贴士 题目 一只猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个:第二天早上又将剩下的桃子吃掉一半,又多吃了一个.以后每天早上都吃了前一天剩下的一半 ...
- 线性化微分数学解释Einstein狭义相对论质能方程E=MC^2
线性化微分数学解释Einstein狭义相对论质能方程E=MC^2 要理解爱因斯坦在狭义相对论中的质能方程是如何推导出来的,需要先了解数学中的微分方程及其线性化方程的知识.现在先从最简单的微分方程开始. ...
- Google BBR拥塞控制算法背后的数学解释 | 深度
参加 2019 Python开发者日,请扫码咨询 ↑↑↑ 作者 | 赵亚 转载自CSDN网站 杭州待了一段时间,回到深圳过国庆假期,无奈温州皮鞋?厂老板过节要回温州和上海,不在深圳,也就没有见着,非常 ...
- 【Brain】脑智前沿科普|用数学解释大脑学习的过程
来源:脑与心智毕生发展研究中心 原文作者:Kate Nussenbaum,Alexandra O. Cohen 原文编辑:David Sheinberg 小小评阅人:Brown University ...
- Google BBR拥塞控制算法背后的数学解释
杭州待了一段时间,回到深圳过国庆假期,无奈温州皮鞋?厂老板过节要回温州和上海,不在深圳,也就没有见着,非常遗憾! 国庆节当天,就写这个了.经理不会弹琴,但是经理会弹琴. 我原本可能会在想国庆节的凌晨到 ...
- [吴恩达机器学习笔记]12支持向量机3SVM大间距分类的数学解释
12.支持向量机 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考资料 斯坦福大学 2014 机器学习教程中文笔记 by 黄海广 12.3 大间距分类背后的数学原理- Mathematic ...
- 补码计算方式和数学解释
负数在实际应用时多采用补码来表示,求一个负数-A时,可以先求出A得二进制xxxx,之后对每一位取反后在对结果加1即得到-A得补码,下面用4位来演示 3的二进制为0011,按位取反后为1100,加1后为 ...
最新文章
- Nat. Med.:iHMP之“微生物组与早产”
- 基于VC++开发串口通信的方法
- ubuntu16.04字体安装
- DOM-8 【兼容】冒泡捕获流、事件与事件源对象、事件委托
- Java中遍历删除ArrayList中多个元素
- ubuntu18安装vnpyv1.9.2之二
- 不能bostype没有元数据异常_金蝶EAS - BOS工作笔记
- PhotoShop大师之路视频
- Bad Rabbit
- 英语数字听力学习软件操作
- 科研伦理与学术规范(笔记)
- 互联网界的IT巨变:从DOS的编辑器,到如今的无代码开发
- 系统映像还原失败 找不到可用于恢复系统盘的磁盘
- php解析视频_【教程】php实现百度网盘视频解析
- EventSource 引发的一系列事件
- It is time you did something (注意这里要用过去式)
- mp4转换成gif无损画质,MP4转换gif一键搞定
- 什么是上网行为,上网行为管理的作用,为什么要上网行为管理
- Fiddler利用Edxposed框架+TrustMeAlready来突破SSL pinning抓取手机APP数据
- Java项目:教务处学生成绩管理系统(java+JSP+bootstrap+servlet+Mysql)