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 * cdesborda 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) / cpuede ser la diferencia entre un programa que funciona y un programa que falla. Si el producto de by cdesborda 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 / yentera de encuentra el valor qtal que q * y + r == x, donde 0 <= r < y.
Entonces la división a / (b * c)encuentra el valor q1tal que
q1 * b * c + r1 == a
dónde 0 <= r1 < b * c
la división ( a / b ) / cprimero encuentra el valor qttal que
qt * b + r3 == a
y luego encuentra el valor q2tal que
q2 * c + r2 == qt
Así que sustituye eso por qty obtenemos:
q2 * b * c + b * r2 + r3 == a
donde 0 <= r2 < cy 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 + xpor 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 xser 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 xlo que no puede ser mayor que cero.
¿Puede xser menor que cero? No, por argumento similar, se deja al lector.
Por lo tanto, el entero xes cero y, por lo tanto q1 == q2.