[Algorithm] Polynomial and FFT

 

排序:nlognhtml

二分查找:logn <-- 利用单调性,查n次,每次logngit

  

Multiply the following pairs of polynomials using at most the prescribed number
of multiplications of large numbers (large numbers are those which depend on the
coefficients and thus can be arbitrarily large).github

Hint: 算法

Let's set x^2 = y. 最高次幂变为3。再执行点乘后,P(x)*Q(x)有(3+3+1)个系数。数组

 

Consider polynomial P(x) = x^32 + 3x^18 + 5x^5 + 4 x^2 + 3x + 6. You are given a large number M. Find
the value P(M) using only 7 multiplications of large numbers.ide

Hint: spa

幂次为:32, 18, 5, 2, 13d

不断自相乘,获得的幂次为:1, 2, 4, 8, 16, 32 作了五次大数计算。orm

32, 18 = 16+2, 5 = 4+1, 2, 1 这里的幂次的加,实际上是实际的相乘,这里又是两次。xml

故,共七次。

 

Sol 1: n^2 denotes 组合方式,这是等式一侧;等式另外一侧是查找logn。

Sol 2:

(1) 求任意两个变量的和,构成一个n^2长的数组。--O(n^2),每一个数组下记录了由哪两个值相加。

(2) 对n^2长的数组排序。 -- n^2*log(n^2)

(3) 搜索某个值,也就是等式右边的值。 -- n^2

If m + n = a + b, 等价于在n^2长的数组上作上述相似的操做。

Therefore, 只要是两个变量的运算,就能够匹配这个O(n^2)的部分。思惟简单,费空间而已。

 

FFT 与 多项式计算

都是成年老酒,以下两个是比较好的连接。

从多项式乘法到快速傅里叶变换

有关多项式的算法 (补充)

 

i+j=m, 0<m<2n 决定了以下的特色:

其实就是多项式相乘:

Let's suppose that
A(x) = q0 + q1*x + q2*x^2 + ... + qn*x^n
B(x) = q0 + 2*q1*x + 3*q2*x^2 + ... + (n+1)*qn*x^n
C(x) = A(x)*B(x)

 

Extended:

Compute all elements of the sequence F (0), F (1), F (2), . . . , F (2n) where

 

i * log(j+1) 分别为A(x), B(x)的coefficient.

 

FFT Examples

List 理解关键点:

原式:

其DFT形式:

其实,就是用“复数”求方程的 “点值”。

 

而后就是FFT有关的技巧过程: Cooley-Tukey算法

( 注意,这里只是求一次点值,总共本有八次 )

 

计算一次点值,作了七次乘法

经过并行,只有三层计算。

而原式中的7次方,就必然要作串行的六层计算

时间复杂度的减小并不是必定是计算量的减小,而是整体计算时长的减小。

 

到这里,应该能看出来FFT的tricky在哪里了。

(1)

就在于 roots of complex number 的次方的规律:它是转圈圈,而不是像实数同样像无穷大发散!

故,这里求出x的次方0~7,其实就已经知道了y还有z。

(2)

每次平方的效果:值减半!

n/2次单位根 只有 n/2个,也就是说,咱们要带入的值再平方之后彷佛变少了一半。

递归下去计算(如上图过程),复杂度就是:

 

相关文章
相关标签/搜索