Encontrei um problema teórico interessante há alguns anos. Eu nunca encontrei uma solução e ela continua me assombrando quando durmo.
Suponha que você tenha um aplicativo (C #) que contém algum número em um int, chamado x. (O valor de x não é fixo). Quando o programa é executado, x é multiplicado por 33 e, em seguida, gravado em um arquivo.
O código-fonte básico é assim:
int x = getSomeInt();
x = x * 33;
file.WriteLine(x); // Writes x to the file in decimal format
Alguns anos depois, você descobre que precisa dos valores originais de X de volta. Alguns cálculos são simples: basta dividir o número no arquivo por 33. No entanto, em outros casos, X é grande o suficiente para que a multiplicação cause um estouro de número inteiro. De acordo com os documentos , o C # truncará os bits de ordem superior até que o número seja menor que int.MaxValue. É possível, neste caso, para:
- Recupere o próprio X ou
- Recuperar uma lista de valores possíveis para X?
Parece-me (embora minha lógica possa certamente ser falha) que uma ou ambas as coisas sejam possíveis, uma vez que o caso mais simples de adição funciona (essencialmente, se você adicionar 10 a X e envolver, poderá subtrair 10 e terminar com X novamente ) e multiplicação é simplesmente adição repetida. Também acredito (acredito) é o fato de X ser multiplicado pelo mesmo valor em todos os casos - uma constante 33.
Isso vem dançando em volta do meu crânio em momentos estranhos há anos. Isso me ocorre, passarei algum tempo tentando pensar nisso e depois esquecerei por alguns meses. Estou cansado de perseguir esse problema! Alguém pode oferecer insights?
(Nota: eu realmente não sei como marcar este. Sugestões são bem-vindas.)
Edit: Deixe-me esclarecer que, se eu puder obter uma lista de possíveis valores para X, há outros testes que eu poderia fazer para me ajudar a reduzi-lo ao valor original.
mé apenas 2 ^ 32 ou 2 ^ 64, mais a exponenciação de amodulo mé simples (apenas ignorá estouro lá)
r*s^-1 mod me precisa encontrar ambos re s. Aqui, temos r*s mod me sabemos tudo, menos r.