可以使用addition, subtraction and shift乘以两个数字。该过程的重要部分是找到这种操作的最小(最佳)序列。使用蛮力找到序列导致难度呈指数增长,因此使用了各种启发式方法,也许最常见的是罗伯特·伯恩斯坦的论文Multiplication by integer constant。
由Vincent Lefevre在Multiplication by an Integer Constant中给出的乘以113的示例:
3x <- x << 1 + x
7x <- 3x << 1 + x
113x <- 7x << 4 + x
我偶然发现了一个非常有趣的answer让我想知道:是否可以使用Z3(或类似的)来找到最小的运算符序列,将数字乘以给定的常数?我对所有这些SAT和SMT都很陌生,所以我不确定它在布尔可满足性问题的背景下是否有意义?
答案 0 :(得分:0)
确实有可能。但请注意,问题是NP难。
前一段时间我们做了一个实验,有一个更普遍的问题(多次常数乘法):http://web.ist.utl.pt/nuno.lopes/pubs/mcm-pb10.pdf
基本上结果非常令人失望。专业算法要快得多。