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数学解释相关推荐

  1. MACD 的数学解释

    目录 MACD 的数学解释 MACD 的一般定义 引入延迟算子 Taylor 展开 权重分析 共振? MACD 的数学解释 MACD 的一般定义 \[ \begin{align*} DIF & ...

  2. 万向锁的简单数学解释

    我们知道用欧拉角表示空间的旋转,容易产生万向锁(Gimbal Lock)问题,这常常不太容易理解.下面给出一个直观的数学解释. 欧拉角表示的空间旋转,可以用绕三个坐标轴的旋转矩阵的乘积表示 万向锁问题 ...

  3. 【数学与算法】凸函数、凸集、凸函数的一二阶数学解释

    1. 凸函数的定义 1.1 凸函数的几何解释 所谓凸函数,其实指的是下凸函数,从几何意义上看,凸函数就是任意两点之间的弦(即这两点构成的线段)都在该函数图像(此处是指这两点之间的函数图像,而非全部的函 ...

  4. 7-35 猴子吃桃问题(含数学解释)

    7-35 猴子吃桃问题 题目 代码 小贴士 题目 一只猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个:第二天早上又将剩下的桃子吃掉一半,又多吃了一个.以后每天早上都吃了前一天剩下的一半 ...

  5. 线性化微分数学解释Einstein狭义相对论质能方程E=MC^2

    线性化微分数学解释Einstein狭义相对论质能方程E=MC^2 要理解爱因斯坦在狭义相对论中的质能方程是如何推导出来的,需要先了解数学中的微分方程及其线性化方程的知识.现在先从最简单的微分方程开始. ...

  6. Google BBR拥塞控制算法背后的数学解释 | 深度

    参加 2019 Python开发者日,请扫码咨询 ↑↑↑ 作者 | 赵亚 转载自CSDN网站 杭州待了一段时间,回到深圳过国庆假期,无奈温州皮鞋?厂老板过节要回温州和上海,不在深圳,也就没有见着,非常 ...

  7. 【Brain】脑智前沿科普|用数学解释大脑学习的过程

    来源:脑与心智毕生发展研究中心 原文作者:Kate Nussenbaum,Alexandra O. Cohen 原文编辑:David Sheinberg 小小评阅人:Brown University ...

  8. Google BBR拥塞控制算法背后的数学解释

    杭州待了一段时间,回到深圳过国庆假期,无奈温州皮鞋?厂老板过节要回温州和上海,不在深圳,也就没有见着,非常遗憾! 国庆节当天,就写这个了.经理不会弹琴,但是经理会弹琴. 我原本可能会在想国庆节的凌晨到 ...

  9. [吴恩达机器学习笔记]12支持向量机3SVM大间距分类的数学解释

    12.支持向量机 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考资料 斯坦福大学 2014 机器学习教程中文笔记 by 黄海广 12.3 大间距分类背后的数学原理- Mathematic ...

  10. 补码计算方式和数学解释

    负数在实际应用时多采用补码来表示,求一个负数-A时,可以先求出A得二进制xxxx,之后对每一位取反后在对结果加1即得到-A得补码,下面用4位来演示 3的二进制为0011,按位取反后为1100,加1后为 ...

最新文章

  1. Nat. Med.:iHMP之“微生物组与早产”
  2. 基于VC++开发串口通信的方法
  3. ubuntu16.04字体安装
  4. DOM-8 【兼容】冒泡捕获流、事件与事件源对象、事件委托
  5. Java中遍历删除ArrayList中多个元素
  6. ubuntu18安装vnpyv1.9.2之二
  7. 不能bostype没有元数据异常_金蝶EAS - BOS工作笔记
  8. PhotoShop大师之路视频
  9. Bad Rabbit
  10. 英语数字听力学习软件操作
  11. 科研伦理与学术规范(笔记)
  12. 互联网界的IT巨变:从DOS的编辑器,到如今的无代码开发
  13. 系统映像还原失败 找不到可用于恢复系统盘的磁盘
  14. php解析视频_【教程】php实现百度网盘视频解析
  15. EventSource 引发的一系列事件
  16. It is time you did something (注意这里要用过去式)
  17. mp4转换成gif无损画质,MP4转换gif一键搞定
  18. 什么是上网行为,上网行为管理的作用,为什么要上网行为管理
  19. Fiddler利用Edxposed框架+TrustMeAlready来突破SSL pinning抓取手机APP数据
  20. Java项目:教务处学生成绩管理系统(java+JSP+bootstrap+servlet+Mysql)

热门文章

  1. linux后台开发核心技术
  2. 1.2 不停机升级困难
  3. hibernate查询list结果集结果都是一样
  4. 【转载】大型网站性能
  5. NAnt0.92版本首次在windows 8.1的机子上运行报错的问题解决
  6. Ubuntu下Chrome打不开解决办法
  7. ORACLE 11g r2   RAC 安装实施规划
  8. Windows集群网络负载均衡
  9. 职场这样发邮件,你死定了!
  10. [转]以绝招应对损招 查***