排序:nlogn
二分查找:logn <-- 利用单调性,查n次,每次logn
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).
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.
Hint:
幂次为:32, 18, 5, 2, 1
不断自相乘,得到的幂次为:1, 2, 4, 8, 16, 32 做了五次大数计算。
32, 18 = 16+2, 5 = 4+1, 2, 1 这里的幂次的加,其实是实际的相乘,这里又是两次。
故,共七次。
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.
List 理解关键点:
原式:
其DFT形式:
其实,就是用“复数”求方程的 “点值”。
然后就是FFT有关的技巧过程: Cooley-Tukey算法
( 注意,这里只是求一次点值,总共本有八次 )
计算一次点值,做了七次乘法。
通过并行,只有三层计算。
而原式中的7次方,就必然要做串行的六层计算
时间复杂度的减少并非一定是计算量的减少,而是总体计算时长的减少。
到这里,应该能看出来FFT的tricky在哪里了。
(1)
就在于 roots of complex number 的次方的规律:它是转圈圈,而不是像实数一样像无穷大发散!
故,这里求出x的次方0~7,其实就已经知道了y还有z。
(2)
每次平方的效果:值减半!
n/2次单位根 只有 n/2个,也就是说,我们要带入的值再平方以后似乎变少了一半。
递归下去计算(如上图过程),复杂度就是: