algorithm - 根据霍纳方案,将多项式的解析树转换为其评估的解析树

标签 algorithm expression-trees compiler-optimization parse-tree expression-templates

能否请您指出一种算法,该算法采用(二元)解析树来评估单个变量中的多项式表达式,并返回根据霍纳规则评估多项式的​​等效解析树。

预期的用例是在表达式模板中。这个想法是,对于矩阵 x

获得的解析树
a + bx + c * x*x + d * x*x*x...

会被优化成相应的解析树

a + x *( b + x( c + x*d))

最佳答案

您可以使用以下转换。

假设:多项式的解析树按指数递增的顺序排列——如果这个假设不成立,可以在解析树中交换部分多项式以使假设成立

假设:解析树包含变量的指数形式(例如 x^2)而不是乘法形式(例如 x*x ), x^0 除外——简单的转换可以在两个方向之间转换

假设:多项式中的系数(如果常数)不为零——这是为了避免必须处理 (a+0*x+c*x^2 -> a+x(cx) 而不是 a+cx^2)

a+b*x^1+c*x^2+d*x^3 的解析树:

  .+..
 /    \
a   ...+....
   /        \
  *         .+..
 / \       /    \
b  ^      *      *
  / \    / \    / \
 x   1  c   ^  d   ^
           / \    / \
          x   2  x   3

转换为a+x(b+c*x^1+d*x^2)

  +
 / \
a   *
   / \
  x   +
     / \
    b   .+..
       /    \
      *      *
     / \    / \
    c   ^  d   ^
       / \    / \
      x   1  x   2

转换为a+x(b+x(c+d*x^1))

  +
 / \
a   *
   / \
  x   +
     / \
    b   *
       / \
      x   +
         / \
        c   *
           / \
          d   ^
             / \
            x   1

最后 (a+x(b+x(c+d*x))):

  +
 / \
a   *
   / \
  x   +
     / \
    b   *
       / \
      x   +
         / \
        c   *
           / \
          d   x

常见的转换是:

 .            ->    .
  .           ->     .
   .          ->      .
    +         ->      .*..
   / \        ->     /    \
  *   N(k+1)  ->    ^      +
 / \          ->   / \    / \
ck  ^         ->  x   k  ck  N'(k+1)
   / \        -> 
  x   k       -> 

其中 N'(k+1) 是与 N(k+1) 相同的子树,每个指数 j 替换为 j-k(如果k为1,将x^k子树替换为x)

然后算法再次应用 (*) 在 N'(k+1) 上,直到它的根是 *(而不是 + ), 表明达到了最终的部分多项式。如果最后的指数为 1,则将指数部分替换为 x (x^1 -> x)

(*) 这里是递归部分

注意:如果您累积跟踪 N(k+1) 子树中的指数变化,则可以将最后两个步骤放在一起来转换 N(k+1)一次递归

注意:如果你想允许负指数,那么要么

a) 提取最高的负指数作为第一项:

a*x^-2 + b*x^-1 + c + d*x + e*x^2  ->  x^-2(a+b*x+c*x^2+d*x^3+d*x^4)

并应用上述转换

或 b) 将等式的正指数部分和负指数部分分开,分别对每个部分应用上述变换(您需要“翻转”负指数部分的操作数,并将乘法替换为除法):

a*x^-2 + b*x^-1 + c + d*x + e*x^2  ->  [a+x^-2 + b*x-1] + [c + d*x + e*x^2] ->
-> [(a/x + b)/x] + [c+x(d+ex)]

这个方法看起来比a)复杂

关于algorithm - 根据霍纳方案,将多项式的解析树转换为其评估的解析树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10052896/

相关文章:

c# - 动态 Linq - 对成员类型为 "dynamic"的对象执行查询

c# - 如何更改表达式树中的类型?

c++ - 静态局部变量会被错误优化吗?

c - Visual Studio 2008 不对齐堆栈变量?

java - JDK8编译速度慢

python - 有没有办法在 python 中简化这个 "n-way merge"

excel - 将 for 循环转换为 Excel

c++ - 在C++硬币找零算法中计算错误

algorithm - 完全二叉树的真正含义是什么?

wpf - 使用 linq 表达式的类型安全 NotifyPropertyChanged