几年前,我遇到了一个有趣的理论问题。我从未找到解决方案,当我睡觉时,它仍然困扰着我。
假设您有一个(C#)应用程序,该应用程序在一个称为x的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的可能值的列表?
在我看来(尽管我的逻辑肯定有缺陷)应该可行,其中之一或两者都可行,因为加法的简单情况有效(本质上,如果您将X加10并自动换行,则可以减去10再用X结束),而乘法就是重复的加法运算。我相信,在所有情况下X都乘以相同的值(常数33)也是有帮助的(我相信)。
多年来,这一直在我的头颅周围跳舞。它会发生在我身上,我将花一些时间尝试思考它,然后我会忘记几个月。我已经厌倦了追逐这个问题!谁能提供见识?
(旁注:我真的不知道如何标记这一标记。欢迎提出建议。)
编辑:让我澄清一下,如果我可以获得X的可能值的列表,则可以做其他测试来帮助我将其范围缩小到原始值。
m
只有2 ^ 32或2 ^ 64,加上a
模的幂m
很简单(只是忽略那里的溢出)
r*s^-1 mod m
,您需要同时找到r
和s
。在这里,我们拥有r*s mod m
并且除了之外什么都不知道r
。