算法学习FFT系列(1):初习快速傅里叶变换

本文是算法学习FFT系列的第一篇,介绍快速傅里叶变换的基础知识,包括多项式乘法、单位复根的概念,以及DFT和IDFT的转换。通过欧拉公式和单位复根的性质,阐述了FFT如何加速计算,详细讲解了DFT和IDFT的关系以及FFT的递推过程。文章最后提到了代码实现和后续的FFT系列博文。
摘要由CSDN通过智能技术生成

算法学习FFT系列(1):初习快速傅里叶变换

引入

这个坑已经在我脑海里占了很久了,但是一直没有水平写,今天尝试着写写看FFT的算法学习。
FFT在OI中最大的作用是加速卷积。理论上背板子是没毛病的,但是仍然遇到了一些考定义的毒瘤题,所以还是理解比较好。

多项式乘法

定义

多项式 A(x)=inaixi,B(x)=inbixi A ( x ) = ∑ i n a i ∗ x i , B ( x ) = ∑ i n b i ∗ x i
多项式乘法就是

C(x)=i2n1(jiajbij)xi C ( x ) = ∑ i 2 n − 1 ( ∑ j i a j ∗ b i − j ) x i

显然,多项式乘法需要 O(n2) O ( n 2 ) 的复杂度。

表示方法

普通的多项式表示方法把n阶多项式 A(x) A ( x ) 表示为向量 A A
这里需要引入一种全新的表示方法——点值表示法。
也就是 A ( x ) 表示为 A(A(x0),A(x1),A(x2)A(xn)) A ( A ( x 0 ) , A ( x 1 ) , A ( x 2 ) ⋯ A ( x n ) )
n阶多项式和n个互不相同的点值表示一一对应。
这样的表示方法的优点是什么?考虑多项式乘法的过程。

C(x)=i2n1(jiajbij)xi C ( x ) = ∑ i 2 n − 1 ( ∑ j i a j ∗ b i − j ) x i
=i2n1ji(ajxj)(bijxij) = ∑ i 2 n − 1 ∑ j i ( a j ∗ x j ) ∗ ( b i − j ∗ x i − j )
=j2n1(ajxj)i2n1(bixi) = ∑ j 2 n − 1 ( a j ∗ x j ) ∗ ∑ i 2 n − 1 ( b i ∗ x i )

转化成点值表示的两个式子,不难发现,其乘法复杂度是 O(n) O ( n )

FFT的总路线:系数表达式->点值表达式->乘法->点值表达式->系数表达式

插值(*)

这个东西是顺便一提,FFT中系数表达式<->点值表达式过程并不是FFT的专属,但是确是FFT的关键。这一过程被称之为插值。证明插值的唯一性(也就是n阶多项式和n个互不相同的点值表示一一对应。)需要通过范德蒙德矩阵的可逆性。
111x0x1xnx20x21x2nxn0xn1xnna0a1an=y0y1yn [ 1 x 0 x 0 2 … x 0 n 1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值