Я зіткнувся з цікавою теоретичною проблемою кілька років тому. Я ніколи не знайшов рішення, і воно продовжує переслідувати мене, коли я сплю.
Припустимо, у вас є (C #) додаток, яке містить деяке число в int, зване 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 і він завершить, ви можете відняти 10 і знову повернутись з X ) і множення - це просто повторне додавання. Також допомагає (я вважаю) той факт, що X множиться на однакове значення у всіх випадках - константа 33.
Це вже багато років танцює навколо мого черепа. Це станеться мені, я проведу деякий час, намагаючись продумати його, а потім забуду про це на кілька місяців. Я втомився переслідувати цю проблему! Хтось може запропонувати зрозуміти?
(Бічна примітка: я дійсно не знаю, як позначити це. Пропозиції вітаються.)
Редагувати: Дозвольте уточнити, що якщо я можу отримати список можливих значень для X, я можу зробити інші тести, які допоможуть мені звузити його до початкового значення.
m
становить всього 2 ^ 32 або 2 ^ 64, плюс експоненція a
модуля m
проста (просто ігноруйте переповнення там)
r*s^-1 mod m
і вам потрібно знайти і те, r
і s
. Ось у нас є, r*s mod m
і ми знаємо все, але r
.