J'ai aimé cette question tellement j'en ai fait le sujet de mon blog sur 4 juin 2013. Merci pour la grande question!
Grand cas sont faciles à trouver. Par exemple:
a = 1073741823;
b = 134217727;
c = 134217727;
parce qu' b * c
déborde à un nombre négatif.
Je voudrais ajouter à cela le fait que, dans coché l'arithmétique, la différence entre a / (b * c)
et (a / b) / c
peut être la différence entre un programme qui fonctionne et un programme qui se bloque. Si le produit de l' b
et c
déborde les limites d'un entier puis l'ancien va se planter dans un activée contexte.
Pour les petits nombres entiers positifs, disons, assez petit pour tenir dans une bref, l'identité doit être maintenue.
Timothy Boucliers vient de poster une preuve; je vous présente ici une autre preuve. Supposons que tous les chiffres ici sont des entiers non négatifs et aucun des opérations dépassement de capacité.
Division entière de x / y
trouve la valeur q
tels que q * y + r == x
où 0 <= r < y
.
De sorte que la division a / (b * c)
trouve la valeur q1
tels que
q1 * b * c + r1 == a
où 0 <= r1 < b * c
la division de l' ( a / b ) / c
trouve d'abord la valeur qt
tels que
qt * b + r3 == a
et puis trouve la valeur q2
tels que
q2 * c + r2 == qt
Donc un substitut pour qt
et nous obtenons:
q2 * b * c + b * r2 + r3 == a
où 0 <= r2 < c
et 0 <= r3 < b
.
De deux choses égales à la même chose sont égales les unes aux autres, de sorte que nous avons
q1 * b * c + r1 == q2 * b * c + b * r2 + r3
Supposons q1 == q2 + x
pour certains entiers x
. Substitut et résoudre x
:
q2 * b * c + x * b * c + r1 = q2 * b * c + b * r2 + r3
x = (b * r2 + r3 - r1) / (b * c)
où
0 <= r1 < b * c
0 <= r2 < c
0 <= r3 < b
Peut - x
être supérieure à zéro? Pas de. Nous avons les inégalités:
b * r2 + r3 - r1 <= b * r2 + r3 <= b * (c - 1) + r3 < b * (c - 1) + b == b * c
Si le numérateur de cette fraction est toujours plus petit que b * c
, alors x
ne peut pas être supérieure à zéro.
Peut - x
inférieur à zéro? Non, par le même raisonnement, à gauche pour le lecteur.
Donc entier x
est égal à zéro, et par conséquent q1 == q2
.