# Overview

分治本身没什么能多说的

构建分治的核心在于怎么 merge

配合主定理 or 递归树,即可求解时间复杂度

# 多项式乘法(FFT)

视频教程

利用插值思想,我们在计算多项式乘法时,新奇的选择把<a0,a1,,an1><a_0,a_1,\dots,a_{n-1}>evaluate 为n+1n+1 维点

image-20241221141823319

之后经过叹为观止的操作,红框变为O(nlogn)O(nlogn),红黄框变为O(n)O(n),红框变为O(nlogn)O(nlogn)

红框是分支算法的体现处,其核心在于把原多项式分解为:

P(x)=xPodd(x2)+Peven(x2)P(x)=xP_{odd}(x^2)+P_{even}(x^2)

P(x)P(x) 函数被我们定义为:对于n1n-1 次多项式a(x)a(x)

  • 输入为<a0,a1,,an1><a_0,a_1,\dots,a_{n-1}> 和向量xxxx 长度为kk
  • 计算其多项式结果yyyy 长度为kk

若对称取点,那么对于k/2k/2 个点:

[y1y2yk/2]= ⁣ ⁣ ⁣ ⁣ ⁣ ⁣[yodd1yodd2yoddk/2]  [x1x2xk/2] ⁣ ⁣ ⁣ ⁣ ⁣+[yeven1yeven2yevenk/2][y1y2yk/2]= ⁣ ⁣ ⁣ ⁣ ⁣ ⁣[yodd1yodd2yoddk/2]  [x1x2xk/2] ⁣ ⁣ ⁣ ⁣ ⁣+[yeven1yeven2yevenk/2]\begin{align*} &\begin{bmatrix} y_1\\y_2\\\vdots\\y_{k/2} \end{bmatrix} =\!\!\!\!\!\!& \begin{bmatrix} y_{odd1}\\y_{odd2}\\\vdots\\y_{oddk/2} \end{bmatrix} \circ\; & \begin{bmatrix} x_{1}\\x_{2}\\\vdots\\x_{k/2} \end{bmatrix} \!\!\!\!\!&+ \begin{bmatrix} y_{even1}\\y_{even2}\\\vdots\\y_{evenk/2} \end{bmatrix} \\ \\ &\begin{bmatrix} y_1'\\y_2'\\\vdots\\y_{k/2}’ \end{bmatrix} =\!\!\!\!\!\!& \begin{bmatrix} y_{odd1}\\y_{odd2}\\\vdots\\y_{oddk/2} \end{bmatrix} \circ\; & \begin{bmatrix} -x_{1}\\-x_{2}\\\vdots\\-x_{k/2} \end{bmatrix} \!\!\!\!\!&+ \begin{bmatrix} y_{even1}\\y_{even2}\\\vdots\\y_{evenk/2} \end{bmatrix} \end{align*}

有了yoddy_{odd}yeveny_{even} 两个向量,那剩下的工作就是:

  • yoddy_{odd} 与向量xx(或x-x)的一半对应位置相乘,O(k)O(k)
  • 相加,O(k)O(k)

计算量削减的核心:选定的点是[±x1,,±xn][\pm x_1,\dots,\pm x_n],平方后需要计算的向量维度减半。比如一开始要算 32 个点[±x1,,±x16][\pm x_1,\dots,\pm x_{16}] 的多项式结果yy,平方后只要算 [x12,,x162][x_1^2,\dots,x_{16}^2] 16 个点的多项式结果

kknn 的一次函数(k=n  or  k=2n1k=n\;or\;k=2n-1),那么P(x)P(x) 函数的时间复杂度:

T(n)=2T(n/2)+O(n)T(n)=2T(n/2)+O(n)

根据主定理,T(n)=O(nlogn)T(n)=O(nlogn)

分治的出口为n=1n=1,此时多项式为常数函数
无论是 evaluate 多项式a(n)a(n)n1n-1 维多项式找nn 个点
还是 evaluate 多项式相乘结果a(n)b(n)a(n)b(n)2n22n-2 维多项式找2n12n-1 个点
此时找一个点即可

此文章已被阅读次数:正在加载...更新于

谢谢你请我喝[茶]!(๑OvO๑)♪

柳小寒寒子 微信支付

微信支付