如何使用FFT实际实现多项式乘法?

时间:2017-08-10 14:27:37

标签: algorithm math fft polynomials

我一直在算法教科书中研究这个主题。

巧妙地使用复杂的统一根源似乎在数学上有效。但是,我不明白人们如何在计算机中真正代表这一点。

我可以想到两件事:

  • 使用实/虚分解来表示复数。但这意味着使用浮点数,这意味着我将算法打开为数值误差,即使我想要乘法,我也会失去精度两个具有整数系数的多项式。
  • 将exp(i 2pi / n)表示为n 。所以,我最终会得到一个omega中的元组,如果我必须保持这种形式,我基本上会再次在omega中进行多项式乘法,将我们带回原点。

我真的很想用熟悉的编程语言来看这个算法的实现。

1 个答案:

答案 0 :(得分:3)

确实如你所知,统一的根源通常不是很好的数字,可以很好地存储在计算机中。由于数值误差很小,如果您知道输出应该是整数,则舍入通常会产生正确的结果。

如果你不想(或不能)依赖它,一个确切的选项是数理论变换。它用有限域中的单位根代替复平面中的统一根.ℤ/pℤ其中p是一个合适的素数。 p必须足够大才能存在所有必要的根,并且效率受p的性质影响。如果你选择一个费马素数,那么统一的根就有了方便的形式,并且有一个技巧可以比平时更有效地减少模数p。这是所有精确的整数运算,并且值保持很小,因此在计算机中实现它没有问题。

该技术用于Schönhage-Strassen算法,因此您可以在那里查找具体信息。