FFT快速傅里叶变换 超详细的入门学习总结

本文是关于FFT快速傅里叶变换的入门学习总结,介绍了FFT的基本概念、用途、复数理论及其在多项式乘法中的应用。通过点值表示法和单位根的性质,阐述了FFT如何实现O(nlogn)的时间复杂度,讨论了优化方法,包括常数优化和去除DFS。
摘要由CSDN通过智能技术生成

FFT快速傅里叶变换

说明

参考&鸣谢

小学生都能看懂的FFT!!!
十分简明易懂的FFT(快速傅里叶变换)
浅谈 FFT (终于懂一点了~~)
数学黑科技1——FFT

什么是FFT?
  • FFT(Fast Fourier Transformation) 是离散傅氏变换(DFT)的快速算法。即为快速傅氏变换。它是根据离散傅氏变换的奇、偶、虚、实等特性,对离散傅立叶变换的算法进行改进获得的。——百度百科
  • 这是什么并不重要。。。
用来做什么?
  • 标准的FFT模板题,
  • 设两个多项式:
  • A = ∑ i = 0 n a i ∗ x i = a n ∗ x n + a n − 1 ∗ x n − 1 + . . . + a 1 ∗ x + a 0 A=\sum_{i=0}^na_i*x^i=a_n*x^n+a_{n-1}*x^{n-1}+...+a_1*x+a_0 A=i=0naixi=anxn+an1xn1+...+a1x+a0
  • B = ∑ i = 0 m b i ∗ x i = b n ∗ x m + b m − 1 ∗ x m − 1 + . . . + b 1 ∗ x + b 0 B=\sum_{i=0}^mb_i*x^i=b_n*x^m+b_{m-1}*x^{m-1}+...+b_1*x+b_0 B=i=0mbixi=bnxm+bm1xm1+...+b1x+b0
  • A ∗ B A*B AB的值?
  • 难道不就是 A n s = ∑ i = 0 n + m s i ∗ x i = ∑ i = 0 n + m ∑ j = 0 i a j ∗ b i − j ∗ x i Ans=\sum_{i=0}^{n+m}s_i*x^i=\sum_{i=0}^{n+m}\sum_{j=0}^{i}a_j*b_{i-j}*x^i Ans=i=0n+msixi=i=0n+mj=0iajbijxi
  • 是的,用 A A A的每一项和 B B B的每一项分别相乘,时间复杂度 O ( n m ) O(nm) O(nm).
  • 但如何跑得更快呢?
  • ——用FFT!
  • 经典的应用,
  • 高精度乘法(是不是十分显然)。
关于多项式
  • 上面的多项式表示法是最普通的,也就是平时课本上看到的,称为“系数表示法“,因为显而易见每一项的系数分别是多少。
  • 现在介绍另一种表示法——“点值表示法”,
  • 一个 n n n n + 1 n+1 n+1项式,可以将其看做是 n n n次函数的解析式,
  • 为了唯一确定这个 n n n次多项式,需要选取 n + 1 n+1 n+1个不同的 x x x代入该式子,分别得到一个对应的 y y y
  • 也就是,
  • a n ∗ x 0 n + a n − 1 ∗ x 0 n − 1 + . . . + a 1 ∗ x 0 + a 0 = y 0 a_n*x_0^n+a_{n-1}*x_0^{n-1}+...+a_1*x_0+a_0=y_0 anx0n+an1x0n1+...+a1x0+a0=y0
  • a n ∗ x 1 n + a n − 1 ∗ x 1 n − 1 + . . . + a 1 ∗ x 1 + a 0 = y 1 a_n*x_1^n+a_{n-1}*x_1^{n-1}+...+a_1*x_1+a_0=y_1 anx1n+an1x1n1+...+a1x1+a0=y1
  • … … ……
  • a n ∗ x n n + a n − 1 ∗ x n n − 1 + . . . + a 1 ∗ x n + a 0 = y n a_n*x_n^n+a_{n-1}*x_n^{n-1}+...+a_1*x_n+a_0=y_n anxnn+an1xnn1+...+a1xn+a0=yn
  • 那么就有两个多项式分别表示为(注意要取相同的且个数相同的 x x x),
  • A = ( ( x 0 , y A 0 ) ) , ( x 1 , y A 1 ) , . . . , ( x n , y A n ) ) A=((x_0,{y_A}_0)),(x_1,{y_A}_1),...,(x_n,{y_A}_n)) A=((x0,yA0)),(x1,yA1),...,(xn,yAn))
  • B = ( ( x 0 , y B 0 ) ) , ( x 1 , y B 1 ) , . . . , ( x n , y B n ) ) B=((x_0,{y_B}_0)),(x_1,{y_B}_1),...,(x_n,{y_B}_n)) B=((x0,yB0)),(x1,yB1),...,(xn,yBn))
  • 则它们的积为,
  • A n s = ( ( x 0 , y A 0 ∗ y B 0 ) , ( x 1 , y A 1 ∗ y B 1 ) , . . . , ( x n , y A n ∗ y B n ) ) Ans=((x_0,{y_A}_0*{y_B}_0),(x_1,{y_A}_1*{y_B}_1),...,(x_n,{y_A}_n*{y_B}_n)) Ans=((x0,yA0yB0),(x1,yA1yB1),...,(xn,yAnyBn))
  • 把系数表示法变为点值表示法的运算叫做点值运算
  • 把点值表示法变为系数表示法的运算叫做插值运算
  • 这两种运算是互逆的,同时也一定是可逆的。
  • 仿佛发现什么不可告人的秘密(难道就这么简单
  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值