Ho incontrato un interessante problema teorico diversi anni fa. Non ho mai trovato una soluzione e continua a perseguitarmi quando dormo.
Supponiamo di avere un'applicazione (C #) che contiene un numero in un int, chiamato x. (Il valore di x non è fisso). Quando viene eseguito il programma, x viene moltiplicato per 33 e quindi scritto in un file.
Il codice sorgente di base è simile al seguente:
int x = getSomeInt();
x = x * 33;
file.WriteLine(x); // Writes x to the file in decimal format
Alcuni anni dopo, scopri che hai bisogno dei valori originali di X indietro. Alcuni calcoli sono semplici: basta dividere il numero nel file per 33. Tuttavia, in altri casi, X è abbastanza grande da causare un overflow di numeri interi. Secondo i documenti , C # troncerà i bit di ordine superiore fino a quando il numero è inferiore a int.MaxValue
. In questo caso è possibile:
- Recupera X stesso o
- Recupera un elenco di possibili valori per X?
Mi sembra (anche se la mia logica potrebbe certamente essere imperfetta) che uno o entrambi dovrebbero essere possibili, dal momento che il caso più semplice di addizione funziona (essenzialmente se aggiungi 10 a X e si avvolge, puoi sottrarre 10 e finire con X di nuovo ) e la moltiplicazione è semplicemente un'aggiunta ripetuta. Anche aiutare (credo) è il fatto che X sia moltiplicato per lo stesso valore in tutti i casi - una costante 33.
Questo ha ballato intorno al mio cranio in momenti strani per anni. Mi verrà in mente, passerò un po 'di tempo a cercare di pensarci e poi me ne dimenticherò per qualche mese. Sono stanco di inseguire questo problema! Qualcuno può offrire informazioni?
(Nota a margine: non so davvero come taggarlo. Suggerimenti ben accetti.)
Modifica: vorrei chiarire che se riesco a ottenere un elenco di possibili valori per X, ci sono altri test che potrei fare per aiutarmi a restringere il valore originale.
m
è solo 2 ^ 32 o 2 ^ 64, inoltre l'esponenziazione del a
modulo m
è semplice (basta ignorare l'overflow lì)
r*s^-1 mod m
e devi trovare entrambi r
e s
. Qui abbiamo r*s mod m
e sappiamo tutto tranne r
.