假设我给了固定宽度的整数(即它们适合宽度w的寄存器),a_1,a_2,\点a_n,使得它们的和a_1 + a_2 + \ dots + a_n = S也适合宽度w的寄存器。a 1,a 2,… a n a 1 + a 2 + ⋯ + a n = S w
在我看来,我们总是可以将数字置换为,以便每个前缀和也适合宽度为w的寄存器。
基本上,动机是在固定宽度的寄存器机器上计算总和,而不必担心任何中间阶段的整数溢出。
是否有一种快速(最好是线性时间)算法来找到这种排列(假设作为输入数组给出)?(或者说是否不存在这样的排列)。
3
后续措施:检测总和中的溢出 -是否有一种更快的方法考虑了典型的处理器功能?
—
吉尔(Gilles)'所以
只需使用二进制补码寄存器求和即可。即使它在中间溢出,您的前提条件也保证溢出将被抵消,并且结果将是正确的。:P
—
CodesInChaos
@CodeInChaos:真的吗?
—
Aryabhata 2012年
我认同。你基本上在一组模2 ^ n,其中您选择从规范化表示工作
—
CodesInChaos 2012年
-2^(n-1)
来2^(n-1)-1
。当然,它需要二进制补码和定义明确的溢出行为,但是在像C#这样的语言中,它应该可以工作。
@CodeInChaos:难道没有两种可能性可以给相同的余数取模吗?您基本上是在说,无论顺序如何,都永远不会发生其中之一。还是我错过了什么?
—
Aryabhata 2012年