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 * ctrà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) / ccó 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 bvà cvượ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 / ytìm giá trị qsao cho q * y + r == x, ở đâu 0 <= r < y.
Vậy phép chia a / (b * c)tìm giá trị q1sao cho
q1 * b * c + r1 == a
Ở đâu 0 <= r1 < b * c
( a / b ) / cđầu tiên phép chia tìm giá trị qtsao cho
qt * b + r3 == a
và sau đó tìm giá trị q2sao cho
q2 * c + r2 == qt
Vì vậy, thay thế nó vào qtvà chúng tôi nhận được:
q2 * b * c + b * r2 + r3 == a
ở đâu 0 <= r2 < cvà 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 + xcho 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ó xthể 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 xkhông thể lớn hơn không.
Có xthể 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 xbằng 0, và do đó q1 == q2.