标签:nH 3x 复根 FFT 2x 笔记 傅里叶 多项式 omega
背景
据说是高斯发明的
考虑从六年级开始学的多项式相乘,需要将所有项相乘并打开,时间复杂度\(O(n^2)\).FFT
能在\(O(nlogn)\)时间复杂度内解决这一问题.由于整数可以被拆成系数与进制幂之积的和,所以大整数乘法也可以用FFT
加速.
表示法
一种显然的加速方式:在学习拉格朗日插值的过程中我们已经发现,n+1个点可以确定一个n次的多项式.所以两个n次多项式相乘可以通过取n+1次值,再把值乘起来的方式实现.显然有正确性.这样用n+1个点表示n次多项式的方法为点值表示法.
单位复根
现在考虑如何快速将系数表示法转化为点值表示法.我们在快速幂中已经学习了相关思想,即二进制拆分+分治/倍增.首先发现计算乘积非常浪费时间,如果能找到相乘始终为定制的数就可以加速这一过程.于是在复平面上选取单位圆,使复数 \(\omega\) 满足 \(\omega^k=1\) ,这样的复数称为复根(实际上是k等分圆周).又容易发现,对于n等分圆周产生的n个复根,只要知道第一个就可以将其他复根表示成它的幂次.我们用\(\omega_i^j\)表示i等分圆周产生的第j个复根,显然有以下性质:(图:OI wiki
)
快速傅里叶变换
将一个多项式奇偶分开,为了对称先将其补成\(2^k\)项.如:
\[f(x)=a_0+a_1x+a_2x^2+a_3x^3 \]奇偶分组可得:
\[f(x)=(a_0+a_2x^2)+(a_1x+a_3x^3)\\ =(a_0+a_2x^2)+x(a_1+a_3x^2) \]设新函数\(G(x)\) , \(H(x)\)
\[G(x)=(a_0+a_2x)\\ H(x)=(a_1+a_3x) \]\(f(x)\)表示为:
\[f(x)=G(x^2)+xH(x^2) \]代入单位复根\(\omega^k_n\):
\[f(\omega^k_n)=G((\omega^k_n)^2)+\omega^k_nH((\omega^k_n)^2)\\ =G(\omega^{2k}_n)+\omega^k_nH(\omega^{2k}_n)\\ =G(\omega^{k}_{n/2})+\omega^k_nH(\omega^{k}_{n/2})\\ \]代入\(\omega_n^{k+n/2}\):
\[f(\omega_n^{k+n/2})=G(\omega^{k}_{n/2})-\omega^k_nH(\omega^{k}_{n/2})\\ \]发现由(16)(17)两个式子套上\(\operatorname{DFT}\),可以将\(\operatorname{DFT}\)中的n逐步化为1,从而求出结果.显然对于每个k分别代入即可.这样就在\(O(nlogn)\)的时间内求出了这个n-1次多项式的n组根(这里的n指的是补齐项之后的项数).
此外也可以将递归分治改为倍增,需要用到位逆序置换.
标签:nH,3x,复根,FFT,2x,笔记,傅里叶,多项式,omega 来源: https://www.cnblogs.com/KinuhataSaiai/p/15519049.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。