[Algorithm] Polynomial and FFT
排序: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个,也就是说,我们要带入的值再平方以后似乎变少了一半。
递归下去计算(如上图过程),复杂度就是:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律