卷积计算

    向量$a = (a_0, a_1, ..., a_{n-1})$和$b = (b_0, b_1, ..., b_{n-1})$

    $A(x) = a_0 + a1_x + a_2x^2 + ... + a_{n-1}x^{n-1} $
    $B(x) = b_0 + b_1x + b_2x^2 + .. + b_{n-1}x^{n-1}   $
    $C(x) = A(x)B(x)  = a_0b_0 + (a_0b_1 + a_1b_0)x + ... + a_{n-1}b_{n-1}x^{2n-2} $

    卷积的分量就是$C(x)$的一个系数。卷积$a*b$计算等价于多项式相乘。

     如何快速的进行多项式求值呢?蛮力算法,对应项相乘,$O(n^2)$

计算2n-1次多项式$C(x)$

  1. 选择值$x_0,x_1,..x_{2n-1}$,求出$A(x_j)$和$B(x_j)$,$j = 0,1,...,2n-1$
  2. 对每个$j$计算$C(x_j) = A(x_j)B(x_j)$
  3. 利用多项式插值法,由$C(x)$在$x = x_0 ,x_1, ..., x_{2n-1}$的值求出多项式$C(x)$的系数

    这三步最终做的是件什么事情呢?就是已知$A(x)$和$B(x)$求出它们的乘积$C(x)$。

    第一步主要是多项式求值,多项式插值法也能通过多项式求值实现(后面会讲),因此,这个算法的关键:一是如何选择$x_0,x_1,..x_{2n-1}$的值?使得后面可用使用插值的方法把多项式的系数求出来;二是找一个高效的多项式求值算法。

2n个数的选择:1的2n次根

$$
egin{aligned}
omega _j &= e^{frac{2pi j}{2n}i} = e^{frac{pi j}{n}i} \
&= cos{frac{pi j}{n}} + i sin{frac{pi j}{n}}, j = 0,1,..,2n-1, i=sqrt{-1} \
end{aligned}$$

$j$每取一个值得到一个根,这2n个根均匀的分布在单位圆上。

例如,$n=4$时的8个根分布如下:

原文地址:https://www.cnblogs.com/lfri/p/10664441.html