【发布时间】:2012-09-30 18:22:37
【问题描述】:
我正在尝试使用 ZDD 实现单变量多项式,正如 other question 中的评论中所建议的那样。
我看过S. Minato的论文(你可以下载here),但是我不明白如何在这些ZDD上实现操作。
论文中的想法是多项式可以使用x^(2^i) 作为变量来表示。例如,x^5 + x^3 + x 可以重写为 x^4x^1 + x^2x^1 + x^1,如果您为每个 x^(2^i) 变量创建节点并与相乘的“1-edge”变量和相加的“0-edge”变量连接您可以轻松获得表示该多项式的图形。 ZDD 是在图上强制执行某些条件的此类图(有关更多信息,请阅读 Minato 的文章和维基百科关于 BDD 的 page)
系数可以类似地使用 2 的幂和来表示(例如 5 = 2^2 + 2^0 等。每个 2^i 都是一个变量,并且节点以相同的方式与 1 和 0 边连接)。
现在,我的问题是添加两个 ZDD 的算法。 算法看起来很简单:
如果 F 和 G (ZDD) 没有公共组合,则加法 (F + G) 可以是 只需合并它们即可完成。当它们包含一些常见的 组合,我们计算以下公式: (F + G) = S + (Cx2), 其中 C = F ∩ G, S = (F U G) \ C 。通过重复这个过程, 常见的组合最终用尽,程序是 完成。
问题是:如何有效地找到“C”和“S”?
作者提供了乘法的代码,但是一旦你实现了前面的算法,代码实际上是微不足道的。而且由于没有提供这些算法,因此乘法运算也是“无用的”。
“合并”ZDD 的概念也没有得到很好的解释,尽管考虑到变量的顺序应该是一致的,只有一种方法可以将图合并在一起,以及保持这种顺序的规则可能很简单(我还没有将它们正式化,但我对它们有一个粗略的了解)。
【问题讨论】:
标签: implementation polynomial-math binary-decision-diagram