快速阶乘算法

FFT是一种用于加速多项式乘法的算法,它通过快速傅里叶变换和逆变换在O(nlogn)的时间复杂度内完成计算,优于朴素的O(n^2)方法。文章讨论了多项式的表示法,DFT和IDFT的概念,以及如何通过选取特定数量的点来确保多项式的唯一性。此外,还提到了使用记忆化和NTT(数论变换)来进一步优化计算过程。
摘要由CSDN通过智能技术生成

前置知识

FFT(Fast Fourier Transformation),中文名快速傅里叶变换,用来加速多项式乘法

什么是多项式?

多项式是指如以下形式的式子:

\sum _{i=0}^{n} a_i\times k^i

系数表示法:

f(x)={a_0,a_1,a_2,\cdots,a_{n}}

也就是平时用的方法

点值表示法:

把多项式放到平面直角坐标系里面,看成一个函数

\\ \begin{bmatrix}1&x_0&x_0^2&x_0^3&\cdots&x_0^n\\1&x_1&x_1^2&x_1^3&\cdots&x_1^n\\1&x_2&x_2^2&x_2^3&\cdots&x_2^n\\\vdots&\vdots&\vdots&\vdots&\ddots&\vdots\\1&x_n&x_n^2&x_n^3&\cdots&x_n^n\end{bmatrix}\;\begin{bmatrix}a_0\\a_1\\a_2\\\vdots\\a_n\end{bmatrix}=\begin{bmatrix}y_0\\y_1\\y_2\\\vdots\\y_n\end{bmatrix}\\ \begin{bmatrix}a_0\\a_1\\a_2\\\vdots\\a_n\end{bmatrix}=\begin{bmatrix}1&x_0&x_0^2&x_0^3&\cdots&x_0^n\\1&x_1&x_1^2&x_1^3&\cdots&x_1^n\\1&x_2&x_2^2&x_2^3&\cdots&x_2^n\\\vdots&\vdots&\vdots&\vdots&\ddots&\vdots\\1&x_n&x_n^2&x_n^3&\cdots&x_n^n\end{bmatrix}^{-1}\begin{bmatrix}y_0\\y_1\\y_2\\\vdots\\y_n\end{bmatrix}

f(x)=\{(x_0,y_0),(x_1,y_1),\cdots,(x_n,y_n)\}

  • 朴素系数转点值的算法叫DFT(离散傅里叶变换),点值转系数叫IDFT(离散傅里叶逆变换)

  • 为了实现多项式乘法并得到系数序列,我们可以考虑实现的方法,如果直接暴力(通过定义直接算系数)是O(n2)复杂度,肯定会超时,于是我们这样考虑

    首先可以选取n+1个点,把两个多项式转化为点值表示法

    然后将两个点值表示法的多项式相乘(复杂度为O(n)),然后将新得到的多项式的点值表示法转化为系数表示法。

    注意:假设f(x)最高有n次方,g(x)最高有m次方,所以f(x)*g(x)最高有n+m次方,但是n+m可能不是2的幂次方,如果不是,则需要选取点的数量应该是大于n+m的2的幂次方个,假设这个值为1<<k,所以从系数表示法到点值表示法的转化过程中,我们要在f(x)和g(x)内选择1<<k的点,才能保证点值表示法的f(x)g(x)之后,至少仍有n+m个点,才能确定唯一一个 f(x)*g(x)​​​​​​​的多项式。所以在选取点的数量的时候,要保证点的个数能确定f(x)​​​​​​​*g(x)​​​​​​​后的多项式。

    如果任意的选取n+m个点然后转化,复杂度还是太高,所以我们需要巧妙的选取1<<k个点,从而使得系数表示法与点值表示法之间转化的复杂度降为O(nlogn),这就是FFT算法。

  • {(w_n^0,f(w_n^0)),(w_n^1,f(w_n^1)),(w_n^2,f(w_n^2)),...,(w_n^{n-1},f(w_n^{n-1}))}

  • w_n^k=cos\frac{2k\pi}{n}+i\,sin\frac{2k\pi}{n}

    我们也可以记忆化优化。

如何记忆化?

每次求f(x)记忆化。

那每次一定取得不一样啊

只要\\ 1^2=2\\ 2^2=3\\ 3^2=4\\ \cdots\\ n^2=1

如何?

  • 取模(NTT)
  • 复数(FFT)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值