考虑到多项式的所有根,我必须找出一种比O(n ^ 2)更快地生成系数的算法。我无法解决这个问题。我很确定我应该使用快速傅立叶变换或逆傅里叶变换的概念,但我不知道如何修改输入不是统一的第n个根。有人能指出我正确的方向吗?
答案 0 :(得分:1)
kraskevich基本上把它钉了下来。缺少一些细节,并且适合注释字段的时间太长。以下是详细信息。
基本上,您希望将其设置为多项式乘法问题。你的输入是p1,... pN,其中pj(x)=(x-rj)。
这里的伪代码:
function multiply2Poly(p1, p2)
// here, use FFT, multiply and use IFFT back
function multiplyPoly(p[1],...p[N])
if (N==1) return p[1]
if (N==2) return multiply2Poly(p[1],p[2])
else {
return multiply2Poly(multiplyPoly(p[1],...p[N/2]),multiplyPoly(p[1+N/2],...,p[N])
}
function getCoef(r[1],...r[N])
return multiplyPoly((p[1]=x-r[1]),...(p[N]=x-r[N]));

对于FFT部分:
观察两个多项式是否为:
p1 = a[0]+a[1] x + ...+a[n] x^n
p2 = b[0]+a[1] x + ...+a[n] x^n
然后p1 * p2 = c [0] + c [1] x + ... + c [n] x ^ n
其中C = A [x] B,其中[x] =卷积。 A =(a [0],...,a [n]),B =(b [0],...,b [n])和C =(c [0],...,c [ N])。
然后使用FFT和卷积定理来加快速度。
C = A [x] B = IFFT {FFT {A} * FFT {B}}其中*这里只是乘法。
IFFT的运行时间= FFT的运行时间= O(n log n) 乘法运行时间为n,因此总运行时间为O(n log n)。
multiplyPoly的总运行时间是:
T(N)= R(N / 2)+ T(N / 2)* 2
如上所述,R(N / 2)= O(n log n)是multiply2Poly的运行时间。
所以
T(N)= T(N / 2)* 2 + O(n log n)
现在Master定理给出O(n(log n)^ 2)
答案 1 :(得分:0)
这是一个O(n *(log n)^ 2)解决方案:
基本情况:对于一个根a,答案只是x - a。
假设我们有一个包含多个根的列表。我们可以递归地解决列表的第一个和第二个半部分的问题,然后使用快速傅里叶变换将结果相乘。
根据Master定理,从等式T(n)= 2 * T(n / 2)+ O(n log n)得到时间复杂度,即O(n *(log n)^ 2)