如果我们有一个操作( x A | x B ),其中' | '是' OR '运算符然后需要将 x 从操作中取出并乘以左边的结果。
例如,让 P =(x A | x B)然后不知何故, P = x *(这里有一些表达)
请告诉我这是否可行以及表达方式。
答案 0 :(得分:0)
对于这个答案,我假设32位整数(实际上它更通用,但它对ℤ不起作用)。
这是可能的,但这不是优化。考虑x
奇数的情况:
x
有一个模乘法逆,我们称之为inv(x)
。现在插入模板
P = x * Expr
,Expr = inv(x) * (x * A | x * B)
结果表达式为x * inv(x) * (x * A | x * B) = x * A | x * B
。
考虑x
是偶数的情况。观察到将x
乘以2会使x * A | x * B
两倍大,即使是非线性" OR"涉及操作,因为乘以2只是左移,左移是OR。
将因子x
导入y * d
,其中y
为奇数,d
为2的幂。现在让"均匀"来自x
的最终乘法,并写Expr = inv(y) * (y * A | y * B)
。
将其重新插入到模板中,我们得到y * d * inv(y) * (y * A | y * B)
,这会简化为d * (y * A | y * B)
,再次为x * A | x * B
。
这种情况实际上是一般情况,因为对于奇数d
,x
可以设置为1。