Saya mengalami masalah teoretis yang menarik beberapa tahun yang lalu. Saya tidak pernah menemukan solusi, dan itu terus menghantui saya ketika saya tidur.
Misalkan Anda memiliki aplikasi (C #) yang menyimpan sejumlah angka di int, disebut x. (Nilai x tidak tetap). Ketika program dijalankan, x dikalikan dengan 33 dan kemudian ditulis ke file.
Kode sumber dasar terlihat seperti ini:
int x = getSomeInt();
x = x * 33;
file.WriteLine(x); // Writes x to the file in decimal format
Beberapa tahun kemudian, Anda menemukan bahwa Anda membutuhkan nilai asli X kembali. Beberapa perhitungan sederhana: Cukup bagi angka dalam file dengan 33. Namun, dalam kasus lain, X cukup besar sehingga perkalian menyebabkan integer overflow. Menurut dokumen , C # akan memotong bit orde tinggi hingga jumlahnya kurang dari int.MaxValue
. Apakah mungkin, dalam hal ini, untuk:
- Pulihkan X itu sendiri atau
- Pulihkan daftar nilai yang mungkin untuk X?
Menurut saya (walaupun logika saya tentu saja cacat) bahwa satu atau keduanya harus dimungkinkan, karena kasus penambahan yang lebih sederhana bekerja (Pada dasarnya jika Anda menambahkan 10 ke X dan membungkus, Anda dapat mengurangi 10 dan berakhir dengan X lagi ) dan perkalian adalah penambahan yang hanya berulang. Juga membantu (saya percaya) adalah fakta bahwa X dikalikan dengan nilai yang sama dalam semua kasus - konstan 33.
Ini telah menari di sekitar tengkorak saya pada saat-saat aneh selama bertahun-tahun. Itu akan terpikir oleh saya, saya akan meluangkan waktu mencoba memikirkannya, dan kemudian saya akan melupakannya selama beberapa bulan. Saya lelah mengejar masalah ini! Adakah yang bisa menawarkan wawasan?
(Catatan: Saya benar-benar tidak tahu cara memberi tag pada yang ini. Saran diterima.)
Sunting: Izinkan saya mengklarifikasi bahwa jika saya bisa mendapatkan daftar nilai yang mungkin untuk X, ada tes lain yang bisa saya lakukan untuk membantu saya mempersempitnya ke nilai asli.
m
hanya 2 ^ 32 atau 2 ^ 64, ditambah eksponensial a
modulo m
sangat mudah (abaikan saja luapan di sana)
r*s^-1 mod m
dan Anda perlu untuk menemukan kedua r
dan s
. Di sini, kita miliki r*s mod m
dan kita tahu segalanya kecuali r
.