给定所有根,如何在时间上比O(n ^ 2)更快地找到多项式的系数?

时间:2015-02-11 22:02:16

标签: algorithm

考虑到多项式的所有根,我必须找出一种比O(n ^ 2)更快地生成系数的算法。我无法解决这个问题。我很确定我应该使用快速傅立叶变换或逆傅里叶变换的概念,但我不知道如何修改输入不是统一的第n个根。有人能指出我正确的方向吗?

2 个答案:

答案 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)解决方案:

  1. 基本情况:对于一个根a,答案只是x - a。

  2. 假设我们有一个包含多个根的列表。我们可以递归地解决列表的第一个和第二个半部分的问题,然后使用快速傅里叶变换将结果相乘。

  3. 根据Master定理,从等式T(n)= 2 * T(n / 2)+ O(n log n)得到时间复杂度,即O(n *(log n)^ 2)