因子使用FFT

时间:2013-03-11 12:19:19

标签: c

我正在尝试在 C 中实施一个程序,使用 fft计算非常大的n(高达一百万)的 factorial strong>和二进制拆分方法

我已经实现了一个简单的来表示任意精度整数。 要计算 fft ifft ,我使用中的 twofft.c four1.c 例程C中的数字配方

最多一个n,一切都正确,但是当数字(浮动数组)太大时, ifft (用four1计算),在规范化和舍入后,有错误的值

例如,如果我有两个数字,其中2000个数字以40个零结尾,并且我必须将它们相互相乘(使用fft),当我计算ifft时,一些结束的零变为“一”。 发生这种情况是因为当我对其中一个“”(例如0,50009)进行舍入时,它们变为“一个”。 现在,我不知道我的实现是否错误,或者我是否必须以不同的方式舍入这些数字。 我尝试使用二元拆分方法素数因子分解,但对于 n> = 9000 ,结果是错误

有办法解决这个问题吗? 感谢您的关注,对不起我的英语不好。

2 个答案:

答案 0 :(得分:1)

你如何表示任意精度整数?

我的意思是你实际使用的是哪种类型?

你能告诉我们你的代码吗?

如果你觉得很懒,你可以克隆我几个月前做过的这个项目: https://github.com/nomadster/ESP

编辑:

通过本声明进一步阅读你的帖子

“发生这种情况是因为当我将其中一个”零“(例如0,50009)四舍五入时,它们变成了”一个“”

你还没有意识到fft乘法仅在舍入误差小于0.5时才有效。 因此,在我看来(当且仅当我正确地解释了您的神秘消息时)您使用的浮点类型不具备所需的精度。

答案 1 :(得分:1)

记录:

我还注意到来自数字配方的four1.c中ifft返回的错误值。我只测试了N = 256个复数值作为输入,以某种方式组装,它们应该产生一个真正的时域信号。

必须对得到的时域向量进行镜像(从头到尾,反之亦然......)并将其移位一,以与其他实现的IFFT对应。 (我测试了numpy.fft.ifft,octave的ifft和一个没有任何优化的逆离散傅立叶变换,只是基于IDFT公式,这应该是绝对正确的。)

数字收件人提供的版本中必须存在基本算法错误。在他们的书中没有描述与这个问题相关的内容。