固定宽度的整数在乘法上是分布的吗?
2022-09-03 01:35:13
对于三个 n 位有符号整数 、和(如 32 位),考虑到整数溢出,是否总是如此?a
b
c
a * (b + c) == (a * b) + (a * c)
我认为这是与语言无关的,但如果不是,我对Java的答案特别感兴趣。
对于三个 n 位有符号整数 、和(如 32 位),考虑到整数溢出,是否总是如此?a
b
c
a * (b + c) == (a * b) + (a * c)
我认为这是与语言无关的,但如果不是,我对Java的答案特别感兴趣。
是的,它成立,因为整数算术是有限环上的模算术。
你可以在这里看到一些理论讨论:https://math.stackexchange.com/questions/27336/associativity-commutativity-and-distributivity-of-modulo-arithmetic
是的,这总是正确的。
它是一个成立的属性,因为你有效地做了算术模2 ^ 32。Java是有符号的事实使事情稍微复杂化了(这意味着你不能假设你正在做一般的模算术的等价物),但不会影响这个特定的分布属性。int
思想实验是考虑使用重复加法来实现它,并考虑当它溢出时会发生什么。由于执行加法的顺序不会影响带有s的结果(即使溢出),因此以不同的顺序将乘法作为重复加法也不会受到影响。由于乘法总是等同于重复加法,因此对于重新排序的乘法,结果也必须相同。断续器int
int