本文只探讨多项式乘法(FFT)在信息学中的应用
如有错误或不明欢迎指出或提问,在此不胜感激
多项式
1. 系数表示法
一般应用最广泛的表示方式
用A(x)表示一个x-1次多项式,a[i]为 xi x i 的系数,则A(x)= ∑n−10 ∑ 0 n − 1 a[i] * xi x i
仅利用这种方式求多项式乘法复杂度为O( n2 n 2 ),不够优秀
2.点值表示法
将n个互不相同的值 x0 x 0 … xn−1 x n − 1 带入多项式,可以得到
对于一个n-1次多项式,可以被n个点所唯一对应.
因而对于A(x)*B(x),只需要得知A的2n个点值和对应B的2n个点值即可O(n)求出多项式的乘积
然而得知这些点值的复杂度依然在平方级别,达不到要求
考虑优化
先引一些要用到的名词
复数
复数即为表示成a+bi的数,其中i为-1的平方根
表示:
可以通过平面直角坐标系上的一条向量(0,0)到(x,y)表示x+yi
其中x轴为实数轴,y轴为虚数轴
运算:
复数运算符合四则运算,即:
(a+bi) + (c+di) = (a+c) + (b+d)i;
(a+bi) * (c+di) = ac + adi + bci - bd i2 i 2 =(ac - bd) + (bc + ad)i
几何意义:
定义模长为向量长度,幅角为从x轴正半轴逆时针转动到向量的角
复数相加等同于向量加法
复数相乘,模长相乘,幅角相加
//建议complex类手写,速度优于STL
单位根
以下默认n为 2x 2 x 且x为非负整数
在复数平面,以原点为圆心,以1为半径作圆
以x轴正半轴到其与原交点(0,0)到(1,0)的这条向量为起点n等分圆,圆心到每个n等分点的向量均称为n次单位根
对于一个单位根,其标号为幅角/(360°/n),特别的,(0,0)到(1,0)的向量标号为0
以下用 wkn w n k 表示标号为k的n次单位根
单位根的性质
1. wkn w n k = cos( 2πn 2 π n )k + sin( 2πn 2 π n )ki
证明:欧拉公式
2. wkn w n k = w2k2n w 2 n 2 k
证明:带入式1,等价于分子分母同乘2,
3. wkn w n k * wkn w n k =