[算法学习] 多项式全家桶
Posted wlzhouzhuan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[算法学习] 多项式全家桶相关的知识,希望对你有一定的参考价值。
多项式
一个(n)次多项式可以表示为(A(x)=sum_{i=0}^{n}a_i x^i),另一个(n)次多项式可以表示为(B(x)=sum_{i=0}^{n}b_i x^i)。
- 多项式加法
将(A(x))和(B(x))相加,得到多项式(C(x)=sum_{i=0}^{n} (a_i+b_i) x^i)。
复杂度是(O(n))的。 - 多项式乘法
将(A(x))和(B(x))相乘,得到多项式(C(x)=sum_{i=0}^{n}sum_{j=0}^{n}a_ib_jx^{i+j})。
复杂度是(O(n^2))的,不是很优,于是我们决定想办法来解决它。
快速傅里叶变换 (FFT)
概述
快速傅里叶变换,英文名(Fast Fourier Transform),它可以在(O(nlog(n)))的复杂度内完成多项式乘法。
前置技能
函数的表达方法
- 系数表达法
通过(a_0,a_1,...,a_n)来表示函数(f(x)=sum_{i=0}^{n}a_ix^i) - 点值表达法
选取平面上(n+1)个不同的点来表示函数(f(x)={ (x_0,y_0), (x_1,y_1), ..., (x_n, y_n)})
我们发现,通过点值表达法,我们可以在(O(n))的复杂度内计算出(C(x)),于是我们考虑将系数和点值结合起来。
单位复数根
在复平面上,单位圆有一些其妙的性质:
我们默认(n=2^t,tin N)
- (w_n^k=w_{2n}^{2k})
- (w_n^{k+frac{n}{2}}=-w_n^k)
- (w_n^k=w_n^{k+n})
- 对于任意(k),均满足(sum_{j=0}^{n-1}(w_n^k)^j=0)
以上是关于[算法学习] 多项式全家桶的主要内容,如果未能解决你的问题,请参考以下文章
书籍推荐:大数据全家桶:Hadoop,Spark,Strom,Druid实战,机器学习算法