【问题标题】:best complexity to evaluate coefficients of polynomial评估多项式系数的最佳复杂度
【发布时间】:2019-12-10 18:01:37
【问题描述】:

我想找出根为 0,1,2...n-1 的 n 次多项式的系数。有人能推荐一个好的算法吗?我尝试使用 FFT,但速度不够快

【问题讨论】:

  • 有无数个具有这些根的多项式。你问的是(x-1)(x-2)(x-3)...(x-n)的系数吗?
  • 另外,“评估所有系数”是什么意思?您的意思是从根生成系数吗?如果是这样,那么@btilly 的问题措辞是正确的。
  • 或者您的意思是:“计算 (x) 的特定值的隐含多项式的值,仅给出多项式的根”。如果是这样,那么只需评估@btilly 给出的公式。但这是两个不同的问题。

标签: algorithm polynomial-math coefficients


【解决方案1】:

我会使用的简单解决方案是编写这样的函数:

def poly_with_root_sequence (start, end, gap):
    if end < start + gap:
        return Polynomial([1, -start])
    else:
        p1 = poly_with_root_sequence(start, end, gap*2)
        p2 = poly_with_root_sequence(start+gap, end, gap*2)
        return p1 * p2

answer = poly_with_root_sequence(1, n, 1)

使用简单算法,这将采用O(n^2) 算术运算。然而,一些操作将涉及非常大的数字。 (请注意,对于大的 nn! 的位数超过了 n。)但是我们已经安排了很少的操作会涉及非常大的数字。

除非您使用具有非常快的乘法算法的多项式实现,否则仍然没有机会尽可能快地产生答案。

https://gist.github.com/ksenobojca/dc492206f8a8c7e9c75b155b5bd7a099 宣称自己是 Python 中多项式相乘的 FFT 算法的实现。我无法验证。但它可以让你快速前进。

【讨论】:

    【解决方案2】:

    正如Evaluating Polynomial coefficients 上的回复,您可以通过简单的方式做到这一点:

    def poly(lst, x): 
      n, tmp = 0, 0
      for a in lst:
        tmp = tmp + (a * (x**n))
        n += 1
    
      return tmp
    
    print poly([1,2,3], 2)
    

    【讨论】:

    • 我没有系数,我有根
    • 还可以获得 n 多项式表达式的所有系数,您可以查看此参考:math.stackexchange.com/questions/3099594/…
    • 理论上正确的解决方案和可接受的快速解决方案之间存在天壤之别。问题不在于如何进行计算,而在于如何快速进行。
    猜你喜欢
    • 2013-05-31
    • 1970-01-01
    • 2017-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多