Me gustó tanto esta pregunta que la convertí en el tema de mi blog el 4 de junio de 2013 . ¡Gracias por la gran pregunta!
Los estuches grandes son fáciles de conseguir. Por ejemplo:
a = 1073741823;
b = 134217727;
c = 134217727;
porque se b * c
desborda a un número negativo.
Yo agregaría a eso el hecho de que en aritmética comprobada , la diferencia entre a / (b * c)
y (a / b) / c
puede ser la diferencia entre un programa que funciona y un programa que falla. Si el producto de b
y c
desborda los límites de un entero, el primero se bloqueará en un contexto verificado.
Para pequeños enteros positivos, digamos, lo suficientemente pequeños como para caber en un corto, se debe mantener la identidad.
Timothy Shields acaba de publicar una prueba; Presento aquí una prueba alternativa. Suponga que todos los números aquí son enteros no negativos y que ninguna de las operaciones se desborda.
La división x / y
entera de encuentra el valor q
tal que q * y + r == x
, donde 0 <= r < y
.
Entonces la división a / (b * c)
encuentra el valor q1
tal que
q1 * b * c + r1 == a
dónde 0 <= r1 < b * c
la división ( a / b ) / c
primero encuentra el valor qt
tal que
qt * b + r3 == a
y luego encuentra el valor q2
tal que
q2 * c + r2 == qt
Así que sustituye eso por qt
y obtenemos:
q2 * b * c + b * r2 + r3 == a
donde 0 <= r2 < c
y 0 <= r3 < b
.
Dos cosas iguales son iguales entre sí, así que tenemos
q1 * b * c + r1 == q2 * b * c + b * r2 + r3
Supongamos q1 == q2 + x
por algún número entero x
. Sustituye eso y resuelve para x
:
q2 * b * c + x * b * c + r1 = q2 * b * c + b * r2 + r3
x = (b * r2 + r3 - r1) / (b * c)
dónde
0 <= r1 < b * c
0 <= r2 < c
0 <= r3 < b
¿Puede x
ser mayor que cero? No. Tenemos las desigualdades:
b * r2 + r3 - r1 <= b * r2 + r3 <= b * (c - 1) + r3 < b * (c - 1) + b == b * c
Entonces, el numerador de esa fracción es siempre menor que b * c
, por x
lo que no puede ser mayor que cero.
¿Puede x
ser menor que cero? No, por argumento similar, se deja al lector.
Por lo tanto, el entero x
es cero y, por lo tanto q1 == q2
.