问题背景
多项式无论在信息学还是在数学上都有重要应用。在信息学竞赛中,经常需要借助多项式解决问题,涉及到关于多项式的各种运算。对于两个次数为 n n n 的多项式其中加减法均可以在 O ( n ) O(n) O(n) 内算完,而一般来说乘法需要 O ( n 2 ) O(n^2) O(n2) 来解决。但多项式乘法作为各种运算的基础,需要用更快的速度求出。
前置知识
1.多项式函数的表示法
如果多项式 F F F 可表示为 ∑ i = 0 n a i x i \sum_{i=0}^na_ix^i ∑i=0naixi,则称其中的 a i a_i ai 为这个多项式函数的 i i i 次项系数,简称系数。像这样的表示法被称为系数表示法。
如果将某特定值 x i x_i xi 代入多项式,则可得到 y i = F ( x i ) y_i=F(x_i) yi=F(xi),这样就确定了平面直角坐标系中的一个点 ( x i , y i ) (x_i,y_i) (xi,yi)。将互不相同 ( x 0 , y 0 ) , ( x 1 , y 1 ) , … , ( x m , y m ) (x_0,y_0),(x_1,y_1),\dots,(x_m,y_m) (x0,y0),(x1,y1),…,(xm,ym) 这 m + 1 m+1 m+1 个点代入多项式,则可以得到 m + 1 m+1 m+1 个方程。当 m = n m=n m=n 时,这个多项式的 n + 1 n+1 n+1 个系数都能被唯一确立,也就是说,互不相同的 n + 1 n+1 n+1 个点可以确定一个 n n n 次多项式函数。
从上述讨论中可以看出,点值表示法和系数表示法可以相互转换。
2.多项式的乘法
若 F ( x ) = ∑ i = 0 n a i x i F(x)=\sum_{i=0}^na_ix^i F(x)=∑i=0naixi, G ( x ) = ∑ i = 0 m b i x i G(x)=\sum_{i=0}^mb_ix^i G(x)=∑i=0mbixi,那么 H ( x ) = F ( x ) G ( x ) = ∑ i = 0 n + m ∏ j + k = i a j b k x i H(x)=F(x)G(x)=\sum_{i=0}^{n+m}\prod_{j+k=i}a_jb_kx^i H(x)=F(x)G(x)=i=0∑n+mj+k=i∏ajbkxi这是一个 n + m n+m n+m 次多项式。
如果选取一个点 x i x_i xi,则 H ( x i ) = H ( x ) ∣ x = x i = [ F ( x ) G ( x ) ] ∣ x = x i = F ( x i ) G ( x i ) H(x_i)=H(x)|_{x=x_i}=[F(x)G(x)]|_{x=x_i}=F(x_i)G(x_i) H(xi)=H(x)∣x=xi=[F(x)G(x)]∣x=xi=F(xi)G(xi)也就是说把两个多项式在 x i x_i xi 处的取值相乘就可以得到乘出来的多项式在 x i x_i xi 处的取值。这样选取互不相同的 n + m + 1 n+m+1 n+m+1 个点就能确定新的多项式了。
不难发现,用点值表示法处理问题往往更方便,傅里叶变换(Discrete Fourier Transformation,简称 DFT)就是把系数表示法转换为点值表示法的算法。
对于一个 n n n 次多项式 F ( x ) F(x) F(x) ,需要选取 m m m 个点,每个点计算要 O ( n ) O(n) O(n) ,总耗时为 O ( n m ) O(nm) O(nm)。这个复杂度和直接用系数表示法相乘一样,常数还比较大。快速傅里叶变换(Fast Fourier Transformation)就是对这种算法的改进。FFT 通过选取某些特定的点来提高计算效率,在此之前,先讲一下复数和单位根的概念
3.复数
在日常生活中,我们主要用到的是实数,而除了实数之外还有另一类数叫做虚数。实数好虚数统称为复数。
复数一般有两种表示方法。若用 c c c 表示一个复数,那么 c = a + b i = r e i θ c=a+bi=re^{i\theta} c=a+bi=reiθ
事实上,我们可以把一个负数和平面中一个点一一对应,那么两种表示法分别对应这平面直角坐标系和极坐标系的情况。我们称 r = a 2 + b 2 r=\sqrt{a^2+b^2} r=a2+b2 为模长,是一个非负数,称 θ = arctan b a \theta=\arctan\frac{b}{a} θ=arctanab 为辐角,他是一个介于 0 0 0 到 2 π 2\pi 2π 的数值。
加减法
假设 n = a + b i , m = c + d i n=a+bi,m=c+di n=a+bi,m=c+di 为两个任意复数,则 n ± m = ( a + c ) ± ( b + d ) i n\pm m=(a+c)\pm(b+d)i n±m=(a+c)±(b+d)i
乘法
假设 n = a + b i , m = c + d i n=a+bi,m=c+di n=a+bi,m=c+di 为两个任意复数,则 n m = ( a c − b d ) + ( a d + b c ) i nm=(ac-bd)+(ad+bc)i nm=