【问题标题】:Reduce the number of operations on a simple expression减少对简单表达式的运算次数
【发布时间】:2023-04-08 04:17:01
【问题描述】:

假设我进行了只涉及加法和乘法的计算:

(a+b)*(c+d)

这可以通过许多其他方式完成,例如。

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

在加法和乘法方面,所示三个示例中的每一个所需的操作数分别为 (2,1) (3,2) (3,4)。显然,如果目标是减少操作总数,则第一个是优越的。有没有办法给定一个任意表达式来找到需要最少操作次数的计算顺序?

注意: SE.math 再次向This question 询问 CS 人群的洞察力和观点。

【问题讨论】:

  • 考虑到优化矩阵乘法的困难,我强烈怀疑这是一个未解决的问题。
  • 如果目标真的是减少操作总数,那你为什么要用电脑来解决呢?我只是说。

标签: computer-science symbolic-math


【解决方案1】:

您想要的是有效地生成所有可能的等效代数表达式,并选择所需的步骤最少成本的一个(在大多数机器上,将 X 加 3 倍比 X 乘以 3 便宜)。

这样做是不切实际的,因为“等效”公式的数量是无限的。

但是,Pelegrí-Llopart 想出了一个方案,可以在给定固定数量的代数重写规则的情况下生成最优代码,称为 "BURS" (bottom-up rewrite system)。这已在一些代码生成器中实现。

本质上,他离线构建了一个大型自动机,其状态跟踪一组可能的应用重写。每个状态都知道当它发生时要生成什么,因此代码生成的在线时间很便宜。

【讨论】:

  • 这就是我要找的!我想答案来自编译器优化技巧也就不足为奇了。
【解决方案2】:

忽略变量和整数系数的幂,这会简化为Karnaugh Map 问题。

K-Maps 可以用积和的形式表示,也可以用和的形式表示,每一种都表示一个二进制电路。一个“最少操作”表单代表一个optimized binary circuit,对吧?

【讨论】:

  • 我看不到连接。你能补充一些细节吗?
  • 我的观点是,由于电路最小化问题被认为是难以解决的 [Wikipedia],因此没有程序程序会在多项式时间内找到 最佳 解决方案......二进制表达式(如果(a OR b 为 TRUE)AND(c OR d 为 TRUE),a+b)*(c+d) 的计算结果为 TRUE。从这个意义上说,仅涉及 + (OR) 和 * (AND) 的算术,其中每个变量为 0 或 1 表示二进制电路。
  • 但是,您可以离线预先计算特定集合的最优值,然后在线应用该答案。看我的回答。
  • 哇,考虑到这种方法所需的计算能力和内存空间,我很惊讶已经实现了这样的优化。
  • 这里难以处理是一个技术术语,意思是如果你想出一个比指数更好的解决方案,地球上所有的数学家都会比上帝俯视时更惊讶从天而降,对他们说话。 (或者,正如数学家喜欢说的那样,笑着说,“这是否可能仍然是一个悬而未决的问题”。)但是小实例可以简单地解决,没问题。
【解决方案3】:

一个想法 - 让我们将变量视为布尔值并编写 maxterm 形式 link text

【讨论】:

  • 同时做 SumOfProduct 和 ProductOfSum 看看哪个更短。
【解决方案4】:

有一个Horner's Rule 用于对单项式形式的多项式进行有效评估。根据它,给定一个 n 次多项式

p(x) = anxn + an-1xn-1 + ... + a1x1 + a0

只需要 n 次乘法(不是 n+(n-1)+(n-2)+...+1 = n(n+1)/2,乍一看似乎)。这是因为多项式可以改写为

p(x) = (((anx + an-1)x + an-2)x + ... a1)x + a0

【讨论】:

    【解决方案5】:

    不确定一般情况,但分解多项式似乎确实可以提高性能。一个遥远的comp sci课程的例子:

    a * x^2 + b * x + c
    

    通过分解 x 得到改进:

    x * (a * x + b) + c
    

    【讨论】:

    • 显然分解出多项式是一种很好的启发式方法,但是我对 best possible 情况很感兴趣,这使它成为一个定义明确(如果很难?)的最小化问题。
    • 是的,我明白了。你的例子和我的例子都通过考虑到死亡来给出最好的情况。又如:abc+bcd+ade;以三种方式分解:bc(a+d)+ade、a(bc+de)+bcd、d(bc+ae)+abc。显然还需要更多。假设这是正确的方向,我会强力优化。也许另一个人会提出一个更优雅的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-07
    • 1970-01-01
    • 1970-01-01
    • 2012-03-17
    • 2022-01-21
    • 2017-04-12
    相关资源
    最近更新 更多