Tôi gặp phải một vấn đề lý thuyết thú vị một số năm trước. Tôi không bao giờ tìm thấy một giải pháp, và nó tiếp tục ám ảnh tôi khi tôi ngủ.
Giả sử bạn có một ứng dụng (C #) chứa một số số trong một int, được gọi là x. (Giá trị của x không cố định). Khi chương trình được chạy, x được nhân với 33 và sau đó được ghi vào một tệp.
Mã nguồn cơ bản trông như thế này:
int x = getSomeInt();
x = x * 33;
file.WriteLine(x); // Writes x to the file in decimal format
Vài năm sau, bạn phát hiện ra rằng bạn cần các giá trị ban đầu của X trở lại. Một số tính toán rất đơn giản: Chỉ cần chia số trong tệp cho 33. Tuy nhiên, trong các trường hợp khác, X đủ lớn để phép nhân gây ra tràn số nguyên. Theo các tài liệu , C # sẽ cắt các bit thứ tự cao cho đến khi số lượng nhỏ hơn int.MaxValue
. Có thể, trong trường hợp này, một trong hai:
- Tự phục hồi X hoặc
- Khôi phục danh sách các giá trị có thể có cho X?
Dường như với tôi (mặc dù logic của tôi chắc chắn có thể bị sai sót) rằng một hoặc cả hai nên có thể, vì trường hợp bổ sung đơn giản hơn (Về cơ bản nếu bạn thêm 10 vào X và nó kết thúc, bạn có thể trừ 10 và kết thúc với X một lần nữa ) và phép nhân chỉ đơn giản là lặp lại bổ sung. Cũng giúp (tôi tin) là thực tế rằng X được nhân với cùng một giá trị trong mọi trường hợp - một hằng số 33.
Điều này đã nhảy múa xung quanh hộp sọ của tôi tại những thời điểm kỳ lạ trong nhiều năm. Nó sẽ xảy ra với tôi, tôi sẽ dành thời gian cố gắng suy nghĩ về nó, và rồi tôi sẽ quên nó trong vài tháng. Tôi mệt mỏi vì phải theo đuổi vấn đề này! Bất cứ ai có thể cung cấp cái nhìn sâu sắc?
(Lưu ý bên lề: Tôi thực sự không biết cách gắn thẻ này. Đề xuất chào mừng.)
Chỉnh sửa: Hãy để tôi làm rõ rằng nếu tôi có thể nhận được danh sách các giá trị có thể có cho X, có những thử nghiệm khác tôi có thể làm để giúp tôi thu hẹp nó xuống giá trị ban đầu.
m
chỉ là 2 ^ 32 hoặc 2 ^ 64, cộng với phép lũy thừa của a
modulo m
rất đơn giản (chỉ cần bỏ qua tràn vào đó)
r*s^-1 mod m
và bạn cần tìm cả hai r
và s
. Ở đây, chúng tôi có r*s mod m
và chúng tôi biết tất cả mọi thứ nhưng r
.