Tôi thích câu hỏi này đến nỗi tôi đã đặt nó làm chủ đề cho blog của mình vào ngày 4 tháng 6 năm 2013 . Cảm ơn vì câu hỏi tuyệt vời của bạn!
Trường hợp lớn rất dễ đi qua. Ví dụ:
a = 1073741823;
b = 134217727;
c = 134217727;
vì b * c
tràn thành một số âm.
Tôi muốn nói thêm rằng thực tế là trong số học đã kiểm tra , sự khác biệt giữa a / (b * c)
và (a / b) / c
có thể là sự khác biệt giữa một chương trình hoạt động và một chương trình bị treo. Nếu tích của b
và c
vượt quá giới hạn của một số nguyên thì tích trước đó sẽ bị lỗi trong ngữ cảnh được kiểm tra.
Ví dụ, đối với các số nguyên dương nhỏ, đủ nhỏ để vừa với một số ngắn, danh tính nên được duy trì.
Timothy Shields vừa đăng một bằng chứng; Tôi trình bày ở đây một bằng chứng thay thế. Giả sử tất cả các số ở đây là số nguyên không âm và không có thao tác nào bị tràn.
Phép chia số nguyên của x / y
tìm giá trị q
sao cho q * y + r == x
, ở đâu 0 <= r < y
.
Vậy phép chia a / (b * c)
tìm giá trị q1
sao cho
q1 * b * c + r1 == a
Ở đâu 0 <= r1 < b * c
( a / b ) / c
đầu tiên phép chia tìm giá trị qt
sao cho
qt * b + r3 == a
và sau đó tìm giá trị q2
sao cho
q2 * c + r2 == qt
Vì vậy, thay thế nó vào qt
và chúng tôi nhận được:
q2 * b * c + b * r2 + r3 == a
ở đâu 0 <= r2 < c
và 0 <= r3 < b
.
Hai vật bằng nhau thì bằng nhau nên ta có
q1 * b * c + r1 == q2 * b * c + b * r2 + r3
Giả sử q1 == q2 + x
cho một số nguyên x
. Thay thế nó trong và giải quyết cho x
:
q2 * b * c + x * b * c + r1 = q2 * b * c + b * r2 + r3
x = (b * r2 + r3 - r1) / (b * c)
Ở đâu
0 <= r1 < b * c
0 <= r2 < c
0 <= r3 < b
Có x
thể lớn hơn không? Không. Chúng ta có sự bất bình đẳng:
b * r2 + r3 - r1 <= b * r2 + r3 <= b * (c - 1) + r3 < b * (c - 1) + b == b * c
Vì vậy, tử số của phân số đó luôn nhỏ hơn b * c
, vì vậy x
không thể lớn hơn không.
Có x
thể nhỏ hơn không? Không, bằng lập luận tương tự, để lại cho người đọc.
Do đó số nguyên x
bằng 0, và do đó q1 == q2
.