FFT [FINISHED]

1 问题描述
多项式的系数表示法:设关于x的n-1次多项式,次数为i的系数为ai。

\[A\left( x \right) = \sum\limits_{j = 0}^{n - 1} {{a_j}{x^j}} \]

多项式的点值表示法:用n个点可以确定一条曲线,

\[\left( {{x_0},{y_0}} \right)\left( {{x_1},{y_1}} \right) \ldots \left( {{x_{n - 1}},{y_{n - 1}}} \right)\]

其中x值各不相同。

其中,系数表示法,对于两个多项式(设最高次数都是n-1)的加法来说,复杂度是O(n)的,而对于两个多项式的乘法来说,复杂度是O(n^2)的。而点值表示法对于多项式加法和乘法的复杂度都是O(n)。


对于给出的两个多项式是系数表示法,而要求它们的乘积。可以使用FFT首先把系数表示法转化成点值表示法(这个复杂度可以nlog(n)实现),然后用点值表示法计算乘法(复杂度O(n)),然后把最后的点值表示法转化成系数表示法(这个复杂度可以nlog(n)实现),那么最后,两个系数表示的多项式乘法的复杂度就会变成nlog(n)。

2 预备知识

方程${\omega ^n} = 1$在复数范围内有n个解(它们叫做n次单位复根)

\[{e^{\frac{{2\pi ik}}{n}}},k = 0,1, \ldots ,n - 1\]

由复数的幂的定义${e^{iu}} = \cos \left( u \right) + i\sin \left( u \right)$

可得:

\[{\left( {{e^{\frac{{2\pi ik}}{n}}}} \right)^n} = {e^{2\pi ik}} = \cos \left( {2\pi k} \right) + i\sin \left( {2\pi k} \right) = 1\]

设主n次单位根为${w_n} = {e^{\frac{{2\pi i}}{n}}}$

所有的n次单位复根都是主n次单位根的幂。n个n次单位复根在乘法运算下形成一个群,

\[w_n^n = w_n^0 = 1\]

\[w_n^iw_n^j = w_n^{i + j}\]



关于n次单位复根的一些性质。

(1)对任何整数$n\geq 0,k\geq 0,d>0$,$w_{dn}^{dk}=w_{n}^{k}$

证明:$w_{dn}^{dk} = {\left( {{e^{\frac{{2\pi i}}{{dn}}}}} \right)^{dk}} = {\left( {{e^{\frac{{2\pi i}}{n}}}} \right)^k} = w_n^k$

(2)对任意偶数$n>0$,

$w_n^{\frac{n}{2}} = {w_2} = - 1$

证明:$w_n^{\frac{n}{2}} = w_{2 \cdot \frac{n}{2}}^{1 \cdot \frac{n}{2}} = w_2^1 = {w_2} = - 1$

(3)对于任意整数$n \geq 1$和不能被n整除的非零整数k,有

$\sum\limits_{j = 0}^{n - 1} {{{\left( {w_n^k} \right)}^j}} = 0$

证明:

$\sum_{j=0}^{n-1}(w_{n}^{k})^{j}=\frac{(w_{n}^{k})^{n}-1}{w_{n}^{k}-1}=\frac{(w_{n}^{n})^{k}-1}{w_{n}^{k}-1}=0$

3 算法流程

我们设给出的多项式为

\[A\left( x \right) = \sum\limits_{j = 0}^{n - 1} {{a_j}{x^j}} \]

其中n是2的幂(如果不是,那么我们可以在后面补一些x的高次方,使得它们的系数为0),我们用向量表示这个系数

\[\bar a = \left( {{a_0},{a_1}, \ldots ,{a_{n - 1}}} \right)\]

我们的目的是将它表示成一个点值,

\[\left( {{x_0},{y_0}} \right)\left( {{x_1},{y_1}} \right) \ldots \left( {{x_{n - 1}},{y_{n - 1}}} \right)\]

在这里,我们设

\[{x_i} = w_n^i\]

我们后面可以发现这样假设,可以使得计算的复杂度变为nlog(n)。如果确定了x,那么最后就是要求出这样一个向量:

\[\bar y = \left( {{y_0},{y_1}, \ldots ,{y_{n - 1}}} \right)\]

其中

\[{y_i} = A\left( {{x_i}} \right) = \sum\limits_{j = 0}^{n - 1} {{a_j}w_n^{ij}} \]

那么现在我们的问题变成给出向量$\bar{a}$,求向量$\bar{y}$

我们发现,这个直接计算的复杂度是O(n^2)的。FFT(快速傅里叶变换)运用了分治的方法,我们把这个$\bar{a}$按照奇数偶数分成两个新的向量

\[{{\bar a}^0} = \left( {{a_0},{a_2},{a_4} \ldots ,{a_{n - 2}}} \right)\]

\[{{\bar a}^1} = \left( {{a_1},{a_3},{a_5} \ldots ,{a_{n - 1}}} \right)\]

它们对应的方程为:

${A^0}\left( x \right) = {a_0} + {a_2}x + ...+ {a_{n - 2}}{x^{\frac{n}{2} - 1}}$

${A^1}\left( x \right) = {a_1} + {a_3}x + ...+ {a_{n - 1}}{x^{\frac{n}{2} - 1}}$

显然

\[A\left( x \right) = {A^0}\left( {{x^2}} \right) + x{A^1}\left( {{x^2}} \right) \to \left[ * \right]\]

对于这两个向量,假设现在我们求出了它们对应的点值表示(注意它们现在是两个最高次数为n/2-1的多项式)

\[{{\bar y}^0} = \left( {{y_0},{y_1},{y_2} \ldots ,{y_{\frac{n}{2} - 1}}} \right)\]

\[{{\bar y}^1} = \left( {{y_0},{y_1},{y_2} \ldots ,{y_{\frac{n}{2} - 1}}} \right)\]

最后,我们由这两个来计算我们最后的答案$\bar{y}$.为方便,我们用$\bar{y_{i}}$来表示$\bar{y}$的第i个元素.

那么,我们有:

(1)对于k属于[0,n/2-1],

\[{{\bar y}_k} = {{\bar y}^0}_k + w_n^k{{\bar y}^1}_k\]

证明:

$\bar{y}_{k}^{0}+w_{n}^{k}\bar{y}_{k}^{1}$
$=A^{0}(w_{\frac{n}{2}}^{k})+w_{n}^{k}A^{1}(w_{\frac{n}{2}}^{k})$
$=\sum_{j=0}^{\frac{n}{2}-1}a_{2j}w_{\frac{n}{2}}^{kj}+w_{n}^{k}\sum_{j=0}^{\frac{n}{2}-1}a_{2j+1}w_{\frac{n}{2}}^{kj}$
$=\sum_{j=0}^{\frac{n}{2}-1}a_{2j}w_{n}^{2kj}+w_{n}^{k}\sum_{j=0}^{\frac{n}{2}-1}a_{2j+1}w_{n}^{2kj}$
$=\sum_{j=0}^{\frac{n}{2}-1}a_{2j}w_{n}^{k(2j)}+\sum_{j=0}^{\frac{n}{2}-1}a_{2j+1}w_{n}^{k(2j+1)}$
$=\sum_{j=0}^{n-1}a_{j}w_{n}^{kj}=\bar{y}_{k}$
(2)对于k属于[n/2,n-1],

\[{{\bar y}_k} = {{\bar y}^0}_{k - \frac{n}{2}} - w_n^{k - \frac{n}{2}}{{\bar y}^1}_{k - \frac{n}{2}}\]

证明:令k=n/2+t,t属于[0,n/2-1],

$\bar{y}_{k-\frac{n}{2}}^{0}+w_{n}^{k-\frac{n}{2}}\bar{y}_{k-\frac{n}{2}}^{1}$
$=\bar{y}_{t}^{0}+w_{n}^{t}\bar{y}_{t}^{1}$
$=A^{0}(w_{\frac{n}{2}}^{t})-w_{n}^{t}A^{1}(w_{\frac{n}{2}}^{t})$
$=\sum_{j=0}^{\frac{n}{2}-1}a_{2j}w_{\frac{n}{2}}^{tj}-w_{n}^{t}\sum_{j=0}^{\frac{n}{2}-1}a_{2j+1}w_{\frac{n}{2}}^{tj}$
$=\sum_{j=0}^{\frac{n}{2}-1}a_{2j}w_{n}^{2kj}-w_{n}^{t}\sum_{j=0}^{\frac{n}{2}-1}a_{2j+1}w_{n}^{2tj}$


因为$w_{n}^{t+\frac{n}{2}}=w_{n}^{t}w_{n}^{\frac{n}{2}}=-w_{n}^{t}$

所以上式
$=\sum_{j=0}^{\frac{n}{2}-1}a_{2j}w_{n}^{2tj}+w_{n}^{t+\frac{n}{2}}\sum_{j=0}^{\frac{n}{2}-1}a_{2j+1}w_{n}^{2tj}$
$=\sum_{j=0}^{\frac{n}{2}-1}a_{2j}w_{n}^{2tj}+\sum_{j=0}^{\frac{n}{2}-1}a_{2j+1}w_{n}^{2tj+t+\frac{n}{2}}$
$=\sum_{j=0}^{\frac{n}{2}-1}a_{2j}w_{n}^{2tj+jn}+\sum_{j=0}^{\frac{n}{2}-1}a_{2j+1}w_{n}^{2tj+jn+t+\frac{n}{2}}$
$=\sum_{j=0}^{\frac{n}{2}-1}a_{2j}w_{n}^{2j(t+\frac{n}{2})}+\sum_{j=0}^{\frac{n}{2}-1}a_{2j+1}w_{n}^{(2j+1)(t+\frac{n}{2})}$
$=\sum_{j=0}^{n-1}a_{j}w_{n}^{(t+\frac{n}{2})j}$
$=\sum_{j=0}^{n-1}a_{j}w_{n}^{kj}=\bar{y}_{k}$


到此位置,我们就得到了如何将系数表示法转化成点值表示法的方法。

我们设现在有一个n*n的矩阵M,其中$M_{ij}=w_{n}^{ij},0\leq i,j\leq n-1$.那么上述从系数转化到点值的过程可以表示为

\[\bar y = M \cdot \bar a\]

如果我们要从点值变换到系数表示,那么

\[\bar a = {M^{ - 1}} \cdot \bar y\]

我们下面证明M的逆矩阵在(i,j)位置的元素为 $M_{ij}^{ - 1} = \frac{{w_n^{ - ij}}}{n}$

证明:$(M_{-1}M)_{ij}=\sum_{k=0}^{n-1}M_{ik}^{-1}M_{kj}=\sum_{k=0}^{n-1}\frac{w_{n}^{-ik}}{n}w_{n}^{kj}=\sum_{k=0}^{n-1}\frac{w_{n}^{k(j-i)}}{n}$.如果i=j则值为1;否则由于$-(n-1)<=j-i<=n-1$且j!=i,所以(j-i)不能被n整除,由上面的性质3可以得到这个值为0。 所以这个乘积是单位矩阵,所以我们的命题得证。

因此,我们只要将$w_{n}$用$w_{n}^{-1}$代替,与从系数变换到点值相同的方法进行运算,最后将每个元素除以n即可。这样就解决了从点值到系数的变换。


4 最后的反思

最后,我们思考一下,这个之所以能运用分治,是因为单位根

\[{w_n} = {e^{\frac{{2\pi i}}{n}}}\]

在乘法意义下是一个群,即它满足$w_{n}^{n} = w_{n}^{0} = 1$

posted @ 2016-10-25 20:02  朝拜明天19891101  阅读(265)  评论(0编辑  收藏  举报