菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
18
0

卷积计算

原创
05/13 14:22
阅读数 27895

    向量$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次根

$$
\begin{aligned}
\omega _j &= e^{\frac{2\pi 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个根分布如下:

 

发表评论

0/200
18 点赞
0 评论
收藏
为你推荐 换一批