FFT之串行+MPI并行实现(C语言版)

本文详细介绍了FFT算法,包括系数表示法与点值表示法的转换,复数基础知识,蝶形变换和码位倒序,以及串行与并行实现的原理与代码示例。通过实例展示如何在O(nlogn)时间内降低多项式相乘的复杂度,并探讨了MPI并行下的FFT应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

FFT(Fast Fourier Transformation),能够在时间复杂度为O(nlogn)的时间内将多项式的系数表示法转换成点值表示法。


一、系数表示法和点值表示法

1.1、系数表示法

f ( x ) = ∑ i = 0 n − 1 a i x i f(x) = \displaystyle\sum_{i=0}^{n-1} a_ix_i f(x)=i=0n1aixi 可以用每一项的系数表示,即:

f ( x ) = ( a 0 , a 1 , . . . , a n − 1 ) f(x) = (a_0, a_1, ..., a_{n-1}) f(x)=(a0,a1,...,an1)

就是平常最常使用的方法

1.2、点值表示法

  把 n 个不同 x x x 代入 f ( x ) f(x) f(x),会得出 n 个不同的值,根据插值法原理可知这 n 个点可以唯一确定一个多项式,即 f ( x ) f(x) f(x),所以:

f ( x ) = ( ( x 0 , f ( x 0 ) , ( x 1 , f ( x 1 ) . . . ( x n − 1 , f ( x n − 1 ) ) f(x) = ((x_0, f(x_0), (x_1, f(x_1) ... (x_{n-1}, f(x_{n-1})) f(x)=((x0,f(x0),(x1,f(x1)...(xn1,f(xn1))

1.3、多项式相乘时的时间复杂度

当两个 n-1 次多项式 f ( x ) , g ( x ) f(x), g(x) f(x),g(x)相乘时:
   ⋅ · 系数表示法的复杂度: O ( n 2 ) O(n^2) O(n2);
   ⋅ · 点值表示法的复杂度: O ( n l o g n ) O(n logn) O(nlogn);
所以:将系数表示法转换成点值表示法,可以有效降低复杂度;

但是 不能直接代入 n 个任意不同的 x x x值,因为从系数表示法转换到点值表示法还是 O ( n 2 ) O(n^2) O(n2)而FFT就能够在 O ( n l o g n ) O(nlogn) O(nlogn)的条件下完成这项任务

二、FFT预备知识

2.1、复数

  在复数范围内令 ω n = 1 \omega^n = 1 ωn=1,可以得到 n 个不同的复数根{ ω n 0 , ω n 1 , . . . , ω n n − 1 \omega_n^0, \omega_n^1, ..., \omega_n^{n-1} ωn0,ωn1,...,ωnn1},且均匀分布在模长为1的圆上,
摘取自:https://blog.csdn.net/enjoy_pascal/article/details/81478582单位根的性质:

  1) ω n m = ω 2 n 2 m \omega_n^m = \omega_{2n}^{2m} ωnm=ω2n2m;

  2) ω n m = − ω n m + n 2 \omega_n^m = -\omega_{n}^{m+\frac{n}{2}} ωnm=ωnm+2n;

  3) ( ω n m ) 2 = ω n 2 m (\omega_n^m)^2 = \omega_{n}^{2m} (ωnm)2=ωn2m;

  4) ω n m = c o s m n 2 π + i s i n m n 2 π \omega_n^m = cos\frac{m}{n}2π+isin\frac{m}{n}2π ωnm=cosnm2π+isinnm2π;

2.2、蝶形变换

对于 A ( x ) = ∑ i = 0 n − 1 a i x i = a 0 ​ + a 1 ​ x 1 + a 2 ​ x 2 + . . . + a n − 1 ​ x n − 1 : A(x)=\displaystyle\sum_{i=0}^{n-1} a_ix_i = a_0​+a_1​x^1+a_2​x^2+...+a_{n−1}​x^{n−1}: A(x)=i=0n1aixi=a0+a1x1+a2x2+...+an1xn1:

A ( x ) A(x) A(x) 下标的奇偶性 A ( x ) A(x) A(x)分成两半,右边再提一个 x : x: x:

   A ( x ) = ( a 0 ​ + a 2 ​ x 2

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值