ฉันพบปัญหาทางทฤษฎีที่น่าสนใจเมื่อหลายปีก่อน ฉันไม่เคยพบวิธีแก้ปัญหาและยังคงหลอกหลอนฉันเมื่อฉันนอนหลับ
สมมติว่าคุณมีแอปพลิเคชัน (C #) ที่มีตัวเลขอยู่ใน int ที่เรียกว่า x (ค่าของ x ไม่ได้รับการแก้ไข) เมื่อโปรแกรมทำงาน x จะถูกคูณด้วย 33 แล้วเขียนลงในไฟล์
ซอร์สโค้ดพื้นฐานมีลักษณะดังนี้:
int x = getSomeInt();
x = x * 33;
file.WriteLine(x); // Writes x to the file in decimal format
หลายปีต่อมาคุณค้นพบว่าคุณต้องการค่าดั้งเดิมของ X ย้อนกลับ การคำนวณบางอย่างง่าย: เพียงแค่หารจำนวนในไฟล์ด้วย 33 อย่างไรก็ตามในกรณีอื่น X มีขนาดใหญ่พอที่การคูณจะทำให้เกิดการล้นจำนวนเต็ม ตามเอกสาร , C # int.MaxValue
จะตัดบิตสูงใบสั่งจนกว่าจำนวนน้อยกว่า เป็นไปได้หรือไม่ในกรณีนี้:
- กู้คืน X หรือ
- กู้คืนรายการค่าที่เป็นไปได้สำหรับ X หรือไม่
ดูเหมือนว่าฉัน (แม้ว่าตรรกะของฉันอาจจะมีข้อบกพร่องอย่างแน่นอน) ที่หนึ่งหรือทั้งสองควรจะเป็นไปได้เนื่องจากกรณีที่เรียบง่ายของการเพิ่มการทำงาน (เป็นหลักถ้าคุณเพิ่ม 10 ถึง X และมัน wraps คุณสามารถลบ 10 ) และการคูณนั้นเติมซ้ำ การช่วยเหลือ (ฉันเชื่อด้วย) ก็คือความจริงที่ว่า X คูณด้วยค่าเดียวกันในทุกกรณี - ค่าคงที่ 33
สิ่งนี้ได้เต้นรอบกะโหลกศีรษะของฉันในช่วงเวลาที่แปลกมาหลายปี มันจะเกิดขึ้นกับฉันฉันจะใช้เวลาพยายามคิดถึงมันแล้วฉันจะลืมมันไปสองสามเดือน ฉันเบื่อที่จะไล่ตามปัญหานี้! ทุกคนสามารถให้ข้อมูลเชิงลึกได้หรือไม่
(หมายเหตุด้านข้าง: ฉันไม่รู้วิธีติดแท็กนี้จริงๆข้อเสนอแนะยินดีต้อนรับ)
แก้ไข:ฉันขอชี้แจงว่าถ้าฉันสามารถรับรายการค่าที่เป็นไปได้สำหรับ X มีการทดสอบอื่น ๆ ที่ฉันสามารถทำได้เพื่อช่วย จำกัด ให้แคบลงเป็นค่าดั้งเดิม
m
เพียง 2 ^ 32 หรือ 2 ^ 64 รวมทั้งการยกกำลังของa
โมดูโลm
ตรงไปตรงมา (เพียงไม่สนใจล้นมี)
r*s^-1 mod m
และคุณต้องไปหาทั้งสองและr
s
ที่นี่เรามีr*s mod m
และเรารู้ทุกอย่าง r
แต่