计算离散傅立叶变换的复杂性?


18

计算整数的向量的标准离散傅里叶变换的复杂度(在标准整数RAM上)是多少?n

经典的算法快速傅立叶变换,不适当[1]归因于库利和Tukey,通常被描述为在运行时间。但是,此算法中执行的大多数算术运算均始于第个复数的单位根(对于大多数)是无理的,因此在恒定时间内进行准确的评估是不合理的。朴素的 -时间算法(乘以具有复数单位根的Vandermonde矩阵也会出现相同的问题。n n O n 2O(nlogn)nnO(n2)

甚至还不清楚如何准确表示DFT的输出(以任何有用的形式)。换句话说,尚不清楚计算DFT实际上是否可行!

因此,假设我们在每个输出值中只需要位精度。 作为的函数,计算离散傅里叶变换的复杂度是多少? (具体而言,请随意假设是的幂。)n b n 2bnbn2

还是文献中“ FFT”的每个实例实际上意味着“快速数论变换 ”?[2]

有关高斯消去欧几里得最短路径的复杂性,请参阅我的相关问题。

[1]它应该真正被称为(Gauss-Runge-König-Yates-Stumpf-Danielson-Lánczos-Cooley-Tukey算法的(其前缀)。

[2]如果是这样,为什么大多数教科书只描述复数算法?


1
我认为这就是他的观点:从理论上讲,您不必担心,但是在任何ACTUAL实现中,您都不必担心以及可能发生的错误。b
Suresh Venkat

1
实际上,这是一个很好的问题,每增加一个精度位,信号强度就会增加(乘以)。因此,我认为如果可以扩展中间单词的大小,这个问题将是最有用的!23dB2
vs

3
可计算分析已经考虑了这一点以及相关问题。 本文在Weirauch的Type II有效性框架内为计算Fourier变换提供了一个复杂的界限。局限在于它在(无限,实值)输入的表示中是线性的。在此系统中,输入和输出均由wrt精度参数定义,因此可能存在一种将其转换为RAM模型的方法。
亚伦·斯特林

3
看看Schönhage和Strassen论文中关于整数乘法的方法A。它使用具有有限精度的复杂傅立叶变换。我认为,这在Knuth卷中也有介绍。2.
MarkusBläser2011年

2
马库斯,亚伦:转换为答案?
Suresh Venkat

Answers:


9

这个答案是Schönhage和Strassen对长整数乘法的第一种算法(“ Methode A”)分析的一种变体。

假设我们要计算长度为的FFT 。缩放您的输入,使其所有值都小于1。首先让我们假设我们使用位定点算法(二进制点后位)进行计算。令为最小位置的(“复杂”)单位。令。δ = 2 1 / 2 - ω = EXP 2 π / ķ K=2kmmδ=21/2mω=exp(2πi/K)

1)可以计算近似值,使得 均为。这可以在时间,其中是乘以位数字所需的时间。(参见Knuth第2卷,第3版,第309页)。 | ω ' Ĵ - ω Ĵ | 2 ķ - 1 δ 0 Ĵ ķ - 1 Ö ķ 中号中号ωj|ωjωj|(2k1)δ0jK1O(KM(m))M(m)m

如果标准整数RAM表示对数成本,则。如果标准整数RAM表示字RAM,则。(Schönhage和Strassen的在“了Methode A”示出了如何在时间线性的乘法减少位编号,以的乘法的位号。后者可以在单位成本来进行。)M m = O m m m O log m M(m)=O(mlogm)M(m)=O(m)mmO(logm)

2)经典的Cooley-Tukey FFT计算形式为运算 。我们使用位定点算法,这些运算变为。如果我们知道和的误差为,则得到的误差为。一个' = - [R Ü Ñ Ç ë b ' + ω ' Ĵ ç 'b ' ç ' ε 一个' 2 ε + 2 ķ δa=b+ωjcma=truncate(b+ωjc)bcϵa2ϵ+2kδ

3)使用归纳法,很容易看到我们得到了误差为的最终结果。为了最终获得精度, 。 b ķ + 日志ķ + b + Ö 1 (2k1)2kδbmk+logk+b+O(1)

4)因此,最终运行时间为。O(KkM(k+b))

这也适用于浮点数:1)仍然可以使用定点算术完成,2)对于浮点数也适用。


我认为,在定点算法中,它甚至可以更快地完成。首先,我们使用Bluestein的技巧将FFT的计算简化为多项式的乘法。获得所需精度所需的系数的长度应为。然后,我们将多项式的乘法减少为长整数的乘法。(将系数附加为一个长整数,然后用零个长度为的块将它们分开。)整数的长度为。O k + b O K k + b O(k+b)O(k+b)O(K(k+b))


因此,从点(4)开始,设置K = n和b = O(log n),并假设我们在字RAM上运行,我们得到的运行时间为。对?O(nlog2n)
Jeffε

是。假设精度足够,第二种算法甚至产生。(我看不出为什么这还不够,但是我没有做细节。)O k + b O(nlogn)O(k+b)
MarkusBläser2011年

2
顺便说一句,如果小于,那么第一个算法也会给出运行时间因为。O log n O n log n M O log n = 1bO(logn)O(nlogn)M(O(logn))=1
MarkusBläser2011年

我碰巧看了Aho,Hopcroft和Ullman的书“算法的设计和分析”,他们详细讨论了位模型中的算法和相关问题。
Chandra Chekuri 2011年

但据我所记得,他们只讨论了位模型中的“数论FFT”。
MarkusBläser2011年

8

这不是一个完整的答案,但我可以为您指出一些相关的论文,并部分地解释为什么从文献中提取您的特定问题的答案并不那么容易。

首先让我问,为什么要知道这个问题的答案?通常,发现自己关心此类问题的人们是为实际应用实际实现高性能FFT的人们。这样的人不太关心某些理想化计算模型中的渐进复杂性,而不太关心在其特定的硬件和软件约束下使性能最大化。例如,西方最快的傅立叶变换的开发者在他们的论文中写道:

最佳选择取决于硬件细节,例如寄存器的数量,指令的等待时间和吞吐量,高速缓存的大小和关联性,处理器管线的结构等。

这些是理论家通常不愿意屈服的问题,但在实际实现中非常重要。如果一位理论家宣称:“我已经找出RAM模型中绝对最佳的渐近位复杂度”,那么从业者可能会说:“很好”,但可能会发现这样的理论结果对他或她的目的毫无用处。

话虽如此,我认为您最好的选择是看一下数值分析文献。例如,Tasche和Zeuner仔细研究了FFT算法的数值稳定性。这可能仍然不是您想要的,因为从业人员之间的普遍共识似乎是要达到给定的数值精度,最好的实践方法是预先精确地计算某些称为“旋转因子”的数字。如果您仅执行一次 FFT,那么这将不是最快的方法,因为您无需在大量FFT计算上分摊一次性预计算的成本。尽管如此,他们对最坏情况下舍入误差的分析仍应与您的问题相关。


11024100

1
作为一个纯粹的理论问题,我对正确和诚实的奖学金感兴趣。在其他纯粹是组合算法的中间,阅读“在这里我们使用FFT,众所周知,它以O(n log n)时间运行”是很常见的,否则将根据指针遍历和O(log n位整数运算。实际上,如果可以使用FFT的微小变化在O(n log n)时间内执行整数卷积,则这也许是可以原谅的,但仍然草率。如果不是这样,任何试图实现该算法的可怜的笨蛋都会得到“错误答案”。
Jeffε

当然,我不希望我的问题的答案对实践产生任何影响。
Jeffε

2
就诚实的学问而言,杰夫仅仅说FFT需要O(n log n)振铃操作还不够吗?这是测量FFT算法复杂度的自然方法。我看不出将所有内容转换为一种特定的计算模型的动机。您是否有一些定理试图证明跟踪精度位数至关重要?至于你可怜的笨蛋,我不相信他会得到“错误的答案”。在任何实际的实现中,您在这里提出的问题都不太可能成为主要问题。
Timothy Chow

O(nlogn)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.