素因子快速傅里叶变换

一、功能

用素因子分解算法计算复序列的离散傅里叶变换。序列的长度是数集{2,3,4,5,7,8,9,16}中的一个或几个素因子的乘机。

二、方法简介

序列\(x(n)\)的离散傅里叶变换为
\[
X(k)=\sum_{n=0}^{N-1}x(n)W_{N}^{nk}, \ k=0,1,...,N-1
\]

若\(N\)可分解为两两互素因子的乘积,即
\[
N=N_{1}\cdot N_{2}\cdot ...\cdot N_{M}, \ (N_{i},N_{j})=1 \ (i\neq j)
\]
那么素因子快速傅里叶变换算法由以下步骤组成:

1、一维DFT映射为多维DFT

对输入下标\(n\)作多因子简单映射,输出下标\(k\)作多因子孙子定理映射
\[
\left\{\begin{matrix}\begin{align*}n &\equiv \sum_{i=1}^{M}\frac{N}{N_{i}}n_{i} \ \textup{mod} \ N\\ k &\equiv \sum_{i=1}^{M}\frac{N}{N_{i}}t_{i}k_{i} \ \textup{mod} \ N\end{align*}\end{matrix}\right., (n_{i},k_{i}=0,1,...,N_{i}-1)
\]
其中\(t_i\)满足
\[
\sum_{i=1}^{M}\frac{N}{N_{i}}t_{i}\equiv 1 \ \textup{mod} \ N
\]
并记
\[
\begin{align*}x(n_{1},n_{2},...,n_{M}) &= x(\frac{N}{N_{1}}n_{1}+...+\frac{N}{N_{M}}n_{M}) \\X(k_{1},k_{2},...,k_{M}) &= X(\frac{N}{N_{1}}t_{1}k_{1}+...+\frac{N}{N_{M}}t_{M}k_{M})\end{align*}
\]
于是得到\(M\)维DFT,即
\[
\begin{align*}X(k_{1},k_{2},...,k_{M}) &= \sum_{n_{1}=0}^{N_{1}-1} \sum_{n_{2}=0}^{N_{2}-1}...\sum_{n_{M}=0}^{N_{M}-1}x(n_{1},n_{2},...,n_{M})W_{N_{1}}^{n_{1}k_{1}}W_{N_{2}}^{n_{2}k_{2}}...W_{N_{M}}^{n_{M}k_{M}} \\(k_{i} &= 0,1,...,N_{1}-1;i=1,2,...,M)\end{align*}
\]
这样原来长度为\(N\)的一维DFT映射为长度分别为\(N_1,N_2,...,N_M\)的\(M\)维DFT,从而一维长DFT可用多维短DFT实现。下面将说明,这些短DFT可用短循环卷积来计算。

2、用Rader算法将DFT转换为循环卷积

设\(p\)为素数,\(p\)点DFT为
\[
X(k)=\sum_{n=0}^{p-1}x(n)W_{N}^{nk}, \ k=0,1,...,p-1
\]
将\(n=0\)和\(k=0\)的点单独列出,则有
\[
\begin{align*}X(0)&=\sum_{=0}^{p-1}x(n),\\X(k)&=x(0)+\bar{X}(k) \ , \ k=1,2,...,p-1\end{align*}
\]
其中\(\bar{X}(k) = \sum_{n=1}^{p-1}x(n)W_{N}^{nk} \ , \ k=1,2,...,p-1\)


\[
\begin{Bmatrix}\begin{align*}n &\equiv g^{-u} \textup{mod} p\\ k &\equiv g^{u} \textup{mod} p\end{align*}\end{Bmatrix}
\]
则上面的DFT\(\bar{X}(k)\)就成为循环卷积
\[
\bar{X}(g^{v}) = \sum_{u=0}^{p-2}x(g^{-u}W_{N}^{g^{v-u}}) \ , \ v = 0,1,...,p-2
\]
3、用Winograd算法计算短卷积

三、使用说明

C语言实现方式如下

原文地址:https://www.cnblogs.com/liam-ji/p/11886068.html

时间: 2024-08-12 00:32:30

素因子快速傅里叶变换的相关文章

一维快速傅里叶变换代码

上一篇随笔,简要写了一下FFT中数组重新排序的算法.现在把完整的FFT代码分享给大家(有比较详细的注释). /*2015年11月10日于河北工业大学*/ #include <complex>#include <iostream.h>#include <math.h>#include <stdlib.h>const int N=8;      //数组的长度const double PI=3.141592653589793; //圆周率const double

codeforces #250E The Child and Binary Tree 快速傅里叶变换

题目大意:给定一个集合S,对于i=1...m求有多少二叉树满足每个节点的权值都在集合S中且权值和为i 构造答案多项式F(x)和集合S的生成函数C(x),那么 根节点的左子树是一棵二叉树,右子树是一棵二叉树,本身的权值必须在集合S中,此外还有空树的情况 故有F(x)=F2(x)C(x)+1 解得F(x)=1±1?4C(x)√2C(x)=21±1?4C(x)√ 若等式下方取减号则分母不可逆,舍去 得到F(x)=21+1?4C(x)√ 有关多项式求逆和多项式开根的内容参见Picks的博客 CF上每个点

快速傅里叶变换(FFT)算法【详解】

快速傅里叶变换(Fast Fourier Transform)是信号处理与数据分析领域里最重要的算法之一.我打开一本老旧的算法书,欣赏了JW Cooley 和 John Tukey 在1965年的文章中,以看似简单的计算技巧来讲解这个东西. 本文的目标是,深入Cooley-Tukey  FFT 算法,解释作为其根源的“对称性”,并以一些直观的python代码将其理论转变为实际.我希望这次研究能对这个算法的背景原理有更全面的认识. FFT(快速傅里叶变换)本身就是离散傅里叶变换(Discrete

研究傅里叶变换的一本好书&lt;&lt;快速傅里叶变换及其C程序&gt;&gt;

快速傅里叶变换及其C程序 <快速傅里叶变换及其C程序>是中国科学技术大学出版社出版的.本书系统地介绍了傅里叶变换的理论和技术,内容包括傅里叶变换(FT)的定义.存在条件及其性质,离散傅里叶变换(DFT)的定义.性质及由离散引起的频谱混叠和渗漏,快速傅里叶变换(FFT)算法的基本原理和复序列基2算法及其实用程序,并以此为基础,给出了实序列DFT.正弦变换.余弦变换.傅里叶级数.谱函数近似.功率谱估计.卷积和相关等的快速算法和实用程序,给出了 2D—DFT的行列算法.二维实序列2D—DFT的行列算

[学习笔记] 多项式与快速傅里叶变换(FFT)基础

引入 可能有不少OIer都知道FFT这个神奇的算法, 通过一系列玄学的变化就可以在 $O(nlog(n))$ 的总时间复杂度内计算出两个向量的卷积(或者多项式乘法/高精度乘法), 而代码量却非常小. 博主一年半前曾经因COGS的一道叫做"神秘的常数 $\pi$"的题目而去学习过FFT, 但是基本就是照着板子打打完并不知道自己在写些什么鬼畜的东西OwO 不过...博主这几天突然照着算法导论自己看了一遍发现自己似乎突然意识到了什么OwO然后就打了一道板子题还1A了OwO再加上午考试差点AK

快速傅里叶变换(FFT)

快速傅里叶变换(FFT)算法[详解] 快速傅里叶变换(Fast Fourier Transform)是信号处理与数据分析领域里最重要的算法之一.我打开一本老旧的算法书,欣赏了JW Cooley 和 John Tukey 在1965年的文章中,以看似简单的计算技巧来讲解这个东西. 本文的目标是,深入Cooley-Tukey  FFT 算法,解释作为其根源的"对称性",并以一些直观的python代码将其理论转变为实际.我希望这次研究能对这个算法的背景原理有更全面的认识. FFT(快速傅里叶

FFT —— 快速傅里叶变换

问题: 已知A[], B[], 求C[],使: 定义C是A,B的卷积,例如多项式乘法等. 朴素做法是按照定义枚举i和j,但这样时间复杂度是O(n2). 能不能使时间复杂度降下来呢? 点值表示法: 我们把A,B,C看作表达式. 即: A(x)=a0 + a1* x + a2 * x2 +... 将A={(x1,A(x1)), (x2,A(x2)), (x3,A(x3))...}叫做A的点值表示法. 那么使用点值表示法做多项式乘法就很简单了:对应项相乘. 那么,如何将A和B转换成点值表示法,再将C转

快速傅里叶变换FFT

快速傅里叶变换FFT DFT是信号分析与处理中的一种重要变换.但直接计算DFT的计算量与变换区间长度N的平方成正比,当N较大时,计算量太大,直接用DFT算法进行谱分析和信号的实时处理是不切实际的. 1.直接计算DFT 长度为N的有限长序列x(n)的DFT为: 2.减少运算量的思路和方法 思路:N点DFT的复乘次数等于N2.把N点DFT分解为几个较短的DFT,可使乘法次数大大减少.另外,旋转因子WmN具有周期性和对称性. (考虑x(n)为复数序列的一般情况,对某一个k值,直接按上式计算X(k)值需

使用快速傅里叶变换计算大整数乘法

我们知道,两个 N 位数字的整数的乘法,如果使用常规的算法,时间复杂度是 O(N2).然而,使用快速傅里叶变换,时间复杂度可以降低到 O(N logN loglogN). 假设我们要计算以下两个 N 位数字的乘积: a = (aN-1aN-2...a1a0)10 = aN-1x10N-1 + aN-2x10N-2 + ... + a1x101 + a0x100 b = (bN-1bN-2...b1b0)10 = bN-1x10N-1 + bN-2x10N-2 + ... + b1x101 + b