Diese Frage hat mir so gut gefallen, dass ich sie am 4. Juni 2013 zum Thema meines Blogs gemacht habe . Danke für die tolle Frage!
Große Koffer sind leicht zu bekommen. Beispielsweise:
a = 1073741823;
b = 134217727;
c = 134217727;
weil b * c überläuft auf eine negative Zahl.
Ich würde dem die Tatsache hinzufügen, dass in der überprüften Arithmetik der Unterschied zwischen a / (b * c)und (a / b) / cein Unterschied zwischen einem funktionierenden Programm und einem abstürzenden Programm sein kann. Wenn das Produkt von bund cdie Grenzen einer Ganzzahl überschreitet, stürzt die erstere in einem überprüften Kontext ab.
Für kleine positive ganze Zahlen, die beispielsweise klein genug sind, um in einen Kurzschluss zu passen, sollte die Identität beibehalten werden.
Timothy Shields hat gerade einen Beweis veröffentlicht. Ich präsentiere hier einen alternativen Beweis. Angenommen, alle Zahlen hier sind nicht negative Ganzzahlen und keine der Operationen läuft über.
Die ganzzahlige Division von x / yfindet den Wert qso, dass q * y + r == x, wo 0 <= r < y.
Die Division a / (b * c)findet also den Wert q1so, dass
q1 * b * c + r1 == a
wo 0 <= r1 < b * c
Die Division ( a / b ) / cfindet zuerst den Wert qtso, dass
qt * b + r3 == a
und findet dann den Wert q2so, dass
q2 * c + r2 == qt
Ersetzen Sie das durch qtund wir erhalten:
q2 * b * c + b * r2 + r3 == a
wo 0 <= r2 < cund 0 <= r3 < b.
Zwei Dinge, die gleich sind, sind einander gleich, also haben wir
q1 * b * c + r1 == q2 * b * c + b * r2 + r3
Angenommen, q1 == q2 + xeine ganze Zahl x. Ersetzen Sie das in und lösen Sie für x:
q2 * b * c + x * b * c + r1 = q2 * b * c + b * r2 + r3
x = (b * r2 + r3 - r1) / (b * c)
wo
0 <= r1 < b * c
0 <= r2 < c
0 <= r3 < b
Kann xgrößer als Null sein? Nein, wir haben die Ungleichungen:
b * r2 + r3 - r1 <= b * r2 + r3 <= b * (c - 1) + r3 < b * (c - 1) + b == b * c
Der Zähler dieses Bruchs ist also immer kleiner als b * cund xkann daher nicht größer als Null sein.
Kann xkleiner als Null sein? Nein, durch ein ähnliches Argument dem Leser überlassen.
Daher ist die Ganzzahl xNull und daher q1 == q2.