Birkaç yıl önce ilginç bir teorik sorunla karşılaştım. Hiç bir çözüm bulamadım ve uyuduğumda beni rahatsız ediyor.
Diyelim ki x adında bir int içinde bir sayı tutan bir (C #) uygulamanız var. (X değeri sabit değildir). Program çalıştırıldığında x, 33 ile çarpılır ve daha sonra bir dosyaya yazılır.
Temel kaynak kodu şuna benzer:
int x = getSomeInt();
x = x * 33;
file.WriteLine(x); // Writes x to the file in decimal format
Birkaç yıl sonra, X'in orijinal değerlerine ihtiyacınız olduğunu keşfedersiniz. Bazı hesaplamalar basittir: Dosyadaki sayıyı 33'e bölün. Ancak, diğer durumlarda X, çarpmanın bir tamsayı taşmasına neden olacak kadar büyüktür. Dokümanlara göre , C #, sayı daha küçük olana kadar yüksek dereceli bitleri kesecektir int.MaxValue. Bu durumda, şunlardan biri mümkün müdür:
- X'in kendisini kurtarın veya
- X için olası değerlerin bir listesi kurtarılsın mı?
Bana öyle geliyor (mantığım kesinlikle kusurlu olsa da), bir veya her ikisinin de mümkün olması gerekiyor, çünkü daha basit ekleme durumu işe yarıyor (Esasen 10'a X eklerseniz ve sarılırsa, 10'u çıkarabilir ve X ile tekrar sarılabilirsiniz. ) ve çarpma basitçe tekrarlanan ekleme. Ayrıca yardım etmek (inanıyorum), X'in her durumda aynı değerle çarpılmasıdır - sabit 33.
Bu yıllardır garip anlarda kafatasımın etrafında dans ediyor. Bu benim başıma gelecek, düşünmek için biraz zaman harcayacağım ve sonra birkaç ay boyunca unutacağım. Bu sorunu kovalamaktan bıktım! Biri fikir verebilir mi?
(Yan not: Bunu nasıl etiketleyeceğimi gerçekten bilmiyorum. Öneriler hoş geldiniz.)
Düzenleme: X için olası değerlerin bir listesini alabilir, orijinal değerine daraltmak için yapabileceğim başka testler olduğunu açıklığa kavuşturalım.
msadece 2 ^ 32 veya ^ 64 2, artı üssünün amodulo m(sadece taşma orada görmezden) basittir
r*s^-1 mod mve her iki bulmalıyız rve s. Burada, r*s mod mherşeyi biliyoruz ve biliyoruz ama r.