1. 离散傅里叶变换与多项式的表示
注:离散傅里叶变换的一种用法是:实现多项式的两种表示的转换
DFT实现系数表示→点值表示;IDFT实现点值表示→系数表示
【只要令F是点值f()的向量,W是构成的范德蒙德矩阵,A是多项式系数向量,
在求点值表示时F=W*A就是用到DFT,在求系数表示时A=W^(-1)*F就是用到IDFT】
【由于范德蒙德矩阵的性质,W与W^(-1)关系很简单,从而做DFT和IDFT差异不大,
故下面分析二者有相同的时间复杂度】
“但是朴素的系数表示法转点值表示法的算法还是O(n^2)的,逆操作类似”
注释:系数表示→点值表示:秦九韶算法+算n个点值,故时间复杂度O(n^2)
点值表示→系数表示:线性方程组的求值问题最佳算法时间复杂度O(n^2)(如高斯赛德尔迭代法)
"虽然DFT搞出来一堆很牛逼的ω作为代入多项式的x值
但只是代入这类特殊x值法的变换叫做DFT而已,还是要代入单位根暴力计算"
注释:这里的意思是,在系数表示→点值表示的过程中,可以取DFT想法中选取的这一组ω值来进行,由于单位根的一些性质,这可以减少计算量
“现在我们就可以递归分治来搞FFT了”
注释:根据文中的FFT分析思路,我们要求的多项式A(x)的前半部分点值A()和后半部部分对应点值A()可以由和得到,而A1(x)和A2(x)是由A(x)的奇偶系数分配的系数,次数是A(x)的1/2的多项式,因此求解的和就可以看作求A()的相同类型问题,从而可以用divide-and-conquer的方法通过递归解决,可以通过递归树分析求一个值的时间复杂度为
"一个多项式在分治的过程中乘上单位根的共轭复数,分治完的每一项除以n即为原多项式的每一项系数,意思就是说FFT和IFFT可以一起搞“
注:从而FFT和IFFT由相同的时间复杂度;
FFT方便了系数表示→点值表示的过程,相应的他的逆过程IFFT方便了点值表示→系数表示的过程
但一定注意:
“FFT只能处理n为2的整数次幂的多项式”
“这个n一定要是2的幂。如果不是,你可以强制改成是。比如:n=6,你可以加上0*n^7+0*n^6,强行让它有8个项。”
2. 多项式的乘法
十分简明易懂的FFT(快速傅里叶变换)_路人黑的纸巾的博客-CSDN博客https://blog.csdn.net/enjoy_pascal/article/details/81478582/【高精度乘法下两种多项式表示法的区别】
根据上面这的内容,当处理两个多项式的乘法时:
- 使用FFT求出两个多项式f和g在相同n个点x1~xn的值表示【注:n根据以下两点确定,1. 这个n本意是k的阶数;2. 这个n要“强行”表示为2的整数次幂】
- 点值相乘(xi, f(xi))×(xi, g(xi))→(xi, f(xi)*g(xi))得到多项式的点值表示(又称时域相乘)
- 使用IFFT将多项式k的点值表示转换回系数表示,从而得到多项式的乘积k(x)
结合以上图像的分析,可以看出这样的多项式乘积求取方法的时间复杂度只需O(nlogn)
3. 大整数乘法
FFT:快速傅里叶变换与高精度乘法_傅里叶变换的精度_ljhandlwt的博客-CSDN博客https://blog.csdn.net/ljhandlwt/article/details/51999762【多项式乘法与高精度乘法】
正如上面所讲的:任意一个整数可以表示成一个多项式的一个特殊取值(10,十进制思想)
- 设一个n位大整数在按位次可以表示成,则令,就有
从而,我们仅仅需要:
- 将大整数按位次写成对应的多项式
- 再用上面快速傅里叶变换求多项式的想法求多项式的乘积
- 最后把乘积多项式按照系数的阶数写回整数位次
就得到了大整数的乘法!