Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 基于快速傅里叶变换的多项式乘法_Algorithm_Fft_Polynomial Math - Fatal编程技术网

Algorithm 基于快速傅里叶变换的多项式乘法

Algorithm 基于快速傅里叶变换的多项式乘法,algorithm,fft,polynomial-math,Algorithm,Fft,Polynomial Math,我正在从CLRS(CORMEN)()中浏览上述主题,我在这一点上陷入了困境 谁能解释一下下面的表达方式 A(x)=A^{[0]}(x^2) +xA^{[1]}(x^2) 从 n-1 ` Σ a_j x^j j=0 在哪里, A^{[0]} = a_0 + a_2x + a_4a^x ... a_{n-2}x^{\frac{n}{2-1}} A^{[1]} = a_1 + a_3x + a_5a^x ... a_{n-1}x^{\frac{n

我正在从CLRS(CORMEN)()中浏览上述主题,我在这一点上陷入了困境

谁能解释一下下面的表达方式

A(x)=A^{[0]}(x^2) +xA^{[1]}(x^2)

n-1                       `
 Σ  a_j x^j
j=0
在哪里,

A^{[0]} = a_0 + a_2x + a_4a^x ... a_{n-2}x^{\frac{n}{2-1}}  
A^{[1]} = a_1 + a_3x + a_5a^x ... a_{n-1}x^{\frac{n}{2-1}}

如果你把多项式分成“奇数指数”和“偶数指数”,你会发现一个恼人的事实,A[1]多项式(有奇数指数的那一个)有很多奇数指数!对于FFT,甚至指数也更容易使用。因此,可以简单地从[1]中的所有值中取出一个“x”,并将其移出表达式

FFT只喜欢处理指数多项式。因此,当你进行除法和征服时,你需要将A[1]表达式转化为一个“偶数指数”多项式,然后在该多项式上递归,然后在该x上相乘。您将在实际算法的内部循环中看到这种情况

编辑:我意识到你的困惑可能源于这样一个事实,即它们作为多项式中的值“传入”(x^2)。[1]和[0]中的“x”与(x^2)表达式中的x不同。你会看到这是怎么回事,因为当原始多项式A上升到指数N时,A[1]和A[0]都只上升到指数(N/2)。

多项式
A(x)
定义为

A(x) = a_0 + a_1 x + a_2 x^2 + a_3 x^3 + ...
为了通过FFT开始多项式乘法的分治策略,CLRS引入了两个新多项式:一个是称为
x
的偶数幂系数
A[0]
,另一个是称为
x
的奇数幂系数
A[1]

A[0](x) = a_0 + a_2 x + a_4 x^2 + ...
A[1](x) = a_1 + a_3 x + a_5 x^2 + ...
现在,如果我们将
x^2
替换为
A[0]
A[1]
,那么

A[0](x^2) = a_0 + a_2 x^2 + a_4 x^4 + ...
A[1](x^2) = a_1 + a_3 x^2 + a_5 x^4 + ...
x A[1](x^2) = a_1 x + a_3 x^3 + a_5 x^5 + ...
A[0](x^2) + x A[1](x^2) = (a_0 + a_2 x^2 + a_4 x^4 + ...) + (a_1 x + a_3 x^3 + a_5 x^5 + ...)
                        = a_0 + a_1 x + a_2 x^2 + a_3 x^3 + ...
                        = A(x)
如果我们将
A[1](x^2)
乘以
x
,我们得到

A[0](x^2) = a_0 + a_2 x^2 + a_4 x^4 + ...
A[1](x^2) = a_1 + a_3 x^2 + a_5 x^4 + ...
x A[1](x^2) = a_1 x + a_3 x^3 + a_5 x^5 + ...
A[0](x^2) + x A[1](x^2) = (a_0 + a_2 x^2 + a_4 x^4 + ...) + (a_1 x + a_3 x^3 + a_5 x^5 + ...)
                        = a_0 + a_1 x + a_2 x^2 + a_3 x^3 + ...
                        = A(x)
现在,如果我们添加
A[0](x^2)
xa[1](x^2)
,我们得到

A[0](x^2) = a_0 + a_2 x^2 + a_4 x^4 + ...
A[1](x^2) = a_1 + a_3 x^2 + a_5 x^4 + ...
x A[1](x^2) = a_1 x + a_3 x^3 + a_5 x^5 + ...
A[0](x^2) + x A[1](x^2) = (a_0 + a_2 x^2 + a_4 x^4 + ...) + (a_1 x + a_3 x^3 + a_5 x^5 + ...)
                        = a_0 + a_1 x + a_2 x^2 + a_3 x^3 + ...
                        = A(x)
Q.E.D

A(x)分为偶数x^2和奇数x部分, 例如,如果A(x)=21x^5+17x^4+33x^3+4x^2+8x+7 那么A0=17 y^2+4 y+7 所以A0(x^2)=17x^4+4x^2+7 A1=21y^2+33y+8 所以A1(x^2)=21x^4+33x^2+8 或x*A1(x^2)=21x^5+33x^3+8x 显然,在这种情况下,A(x)=A0(x^2)+xa1(x^2)=偶数+奇数部分
我不会回答你的问题,因为我觉得以前的人已经回答过了。我将尝试解释FFT的目的

首先,FFT是计算两个向量之间卷积的一种方法。也就是说,假设x=和y=是1xn向量,那么x和y的卷积是

\和{i=0}^n{xiy{n-i}

您必须接受这样一个事实,即计算该值在广泛的应用程序中非常有用

现在考虑以下内容:

假设我们构造了两个多项式

A(z)=x0+x1*z+x2*z^2+..+xn^z^n B(z)=y0+y1*z+y2*z^2+..+yn^z^n

那么乘法就是

AB(z)=A(z)B(z)=\sum{i=0}^n(\sum{k=0}^i xk*y{i-k})z^i

其中,内和显然是不同k值的不同大小的卷积

现在我们可以用蛮力法在n^2时间内清楚地计算AB的系数(卷积)

然而,我们也可以更加聪明。考虑n个多项式的任何多项式可以用n+1点唯一地描述。在给定n+1点的情况下,我们可以构造通过所有n+1点的唯一n次多项式。进一步考虑n+ 1点形式的2个多项式。您可以通过简单地将n+1y值相乘并保持x值来计算它们的乘积,从而得到点形式的乘积。现在给出一个n+1点形式的多项式,你可以找到唯一的多项式,它在O(n)时间内描述它(实际上我不确定,它可能是O(nlogn)时间,但肯定不会更多。)


这正是FFT所做的。然而,为了得到多项式A和B所描述的n+1点而选择的点是非常仔细的。有些点确实很复杂,因为考虑这些点可以节省计算多项式的时间。也就是说,如果只选择真实点而不是FFT使用的仔细选择的点,则需要O(n^2)时间来计算n+1点。如果选择FFT,则只需要O(nlogn)时间。这就是FFT的全部内容。哦,FFT选择点的方式有一个独特的副作用。给定一个n次多项式,必须选择2^m点,其中m的选择应确保2^m是大于或等于n的2的最小幂。

定义CLR。可能需要一个家庭作业标签?CLRS=算法教科书,有时称为Cormen's,标题实际上是“算法简介”。我很乐意帮忙,除非尽管我喜欢书名,但我没有记住这本书,而且我发现从一开始就很难阅读这个问题。这是算法导论(第二版)通常被称为CLRS或COREMAN,下面的表达式是如何从何而来的?@Eric:虽然《金融时报》需要比大多数人多得多的数学,但我想说,没有数学,你真的无法做任何重要的理论算法(证明正确性、运行时等)。此外,由于FFT被认为是迄今为止最重要的算法之一,我认为任何与之相关的问题都与此相关。@mawia如果Agor回答了你的问题,此时最常见的礼貌是接受他的回答。@las3rjock,谢谢你的关心,但你能告诉我如何接受答案吗……我的意思是我已经接受了答案,但有没有办法在这条线上显示或标记这一点?我承认写这篇文章有点尴尬,因为这有点自私。>,但是:在每个帖子的向上和向下投票选项下(即每个帖子当前投票数上方和下方的三角形),应该有一个检查的大纲。无论你想将哪个答案标记为答案,只需点击该帖子的复选框。