Я столкнулся с интересной теоретической проблемой несколько лет назад. Я никогда не нашел решения, и оно продолжает преследовать меня, когда я сплю.
Предположим, у вас есть приложение (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
.