Me encontré con un problema teórico interesante hace varios años. Nunca encontré una solución, y continúa obsesionándome cuando duermo.
Supongamos que tiene una aplicación (C #) que contiene algún número en un int, llamado x. (El valor de x no es fijo). Cuando se ejecuta el programa, x se multiplica por 33 y luego se escribe en un archivo.
El código fuente básico se ve así:
int x = getSomeInt();
x = x * 33;
file.WriteLine(x); // Writes x to the file in decimal format
Algunos años después, descubres que necesitas recuperar los valores originales de X. Algunos cálculos son simples: simplemente divida el número en el archivo por 33. Sin embargo, en otros casos, X es lo suficientemente grande como para que la multiplicación provoque un desbordamiento de enteros. Según los documentos , C # truncará los bits de orden superior hasta que el número sea menor que int.MaxValue. ¿Es posible, en este caso,:
- Recuperar X mismo o
- ¿Recuperar una lista de posibles valores para X?
Me parece (aunque mi lógica ciertamente podría ser defectuosa) que uno o ambos deberían ser posibles, ya que el caso más simple de suma funciona (Esencialmente, si agrega 10 a X y se ajusta, puede restar 10 y terminar con X nuevamente ) y la multiplicación es simplemente una suma repetida. También ayuda (creo) el hecho de que X se multiplica por el mismo valor en todos los casos, una constante 33.
Esto ha estado bailando alrededor de mi cráneo en momentos extraños durante años. Se me ocurrirá, pasaré un tiempo tratando de pensarlo, y luego me olvidaré de eso durante unos meses. Estoy cansado de perseguir este problema! ¿Alguien puede ofrecer una idea?
(Nota al margen: Realmente no sé cómo etiquetar este. Se aceptan sugerencias.)
Editar: Permítanme aclarar que si puedo obtener una lista de posibles valores para X, hay otras pruebas que podría hacer para ayudarme a reducirlo al valor original.
mes sólo 2 ^ 32 o 2 ^ 64, además de la exponenciación de amódulo mes sencillo (simplemente ignorar desbordamiento allí)
r*s^-1 mod my necesitas encontrar ambos ry s. Aquí tenemos r*s mod my sabemos todo menos r.