【问题标题】:How to implement Horner's scheme for multivariate polynomials?如何实现多变量多项式的霍纳方案?
【发布时间】:2010-06-16 22:59:55
【问题描述】:

背景

我需要在 Fortran90/95 中使用 Horner's scheme 求解多个变量中的多项式。这样做的主要原因是在使用霍纳方案评估多项式时提高了效率和准确性。

我目前有一个用于单变量/单变量多项式的霍纳方案的实现。然而,使用霍纳方案开发一个函数来评估多元多项式被证明是超出我的能力的。

一个示例二元多项式是: 12x^2y^2+8x^2y+6xy^2+4xy+2x+2y 将分解为 x(x(y(12y+8))+y(6y+4 )+2)+2y,然后针对 x 和 y 的特定值进行评估。

研究

我进行了研究,发现了许多论文,例如:
staff.ustc.edu.cn/~xinmao/ISSAC05/pages/bulletins/articles/147/hornercorrected.pdf
citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.40.8637&rep=rep1&type=pdf
www.is.titech.ac.jp/~kojima/articles/B-433.pdf

问题

但是,我不是数学家或计算机科学家,所以我在用于传达算法和想法的数学方面遇到了麻烦。

据我所知,基本策略是将多元多项式转换为单独的单变量多项式并以这种方式计算。

谁能帮帮我?如果有人能帮我把算法变成我自己可以在 Fortran 中实现的伪代码,我将不胜感激。

【问题讨论】:

  • 这听起来像 MathOverflow 材料。可惜我们不能迁移到那里。

标签: fortran polynomial-math


【解决方案1】:

对于两个变量,可以将多项式系数存储在 rank=2 矩阵K(n+1,n+1) 中,其中 n 是多项式的阶数。然后观察以下模式(在伪代码中)

p(x,y) =     (K(1,1)+y*(K(1,2)+y*(K(1,3)+...y*K(1,n+1))) +
           x*(K(2,1)+y*(K(2,2)+y*(K(2,3)+...y*K(2,n+1))) +
         x^2*(K(3,1)+y*(K(3,2)+y*(K(3,3)+...y*K(3,n+1))) +
         ...
         x^n*(K(n+1,1)+y*(K(n+1,2)+y*(K(n+1,3)+...y*K(n+1,n+1)))

y而言,每一行都是一个单独的本垒打方案,而根据x来说,每一行都是一个最终的本垒打方案。

要使用FORTRAN 或任何语言进行编码,请创建一个中间向量z(n+1),这样

z(i) = homers(y,K(i,1:n+1))

p = homers(x,z(1:n+1))

其中homers(value,vector) 是单变量评估的实现,多项式系数存储在vector 中。

【讨论】:

    【解决方案2】:

    我在 Python 中实现了这个:multivar_horner (publication)

    您可以查看那里使用的方法并将其移植到 Fortran。

    参考:

    一些相关出版物(包括上面提到的)的作者声称已经实现了他们提出的算法,但我找不到任何公开可用的。

    关于“最优”Horner 因式分解:可以允许搜索所有可能的(有意义的)因式分解,而不是使用启发式方法来选择下一个因式分解,以达到最小的 Horner 因式分解。

    我在 multivar_horner: Documentation 中包含了这个功能

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-23
      • 2015-08-16
      • 1970-01-01
      • 2015-03-30
      • 2011-04-11
      • 2018-08-15
      • 2012-03-24
      • 1970-01-01
      相关资源
      最近更新 更多