몇 년 전에 흥미로운 이론적 문제가 발생했습니다. 나는 해결책을 찾지 못했고, 잠을 자도 계속 나를 괴롭 힙니다.
x라는 정수로 숫자를 보유하는 (C #) 응용 프로그램이 있다고 가정합니다. (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가 모든 경우에 동일한 값을 곱한다는 사실을 돕습니다 (믿습니다).
이것은 몇 년 동안 이상한 순간에 내 두개골 주위에서 춤을 추었습니다. 그것은 나에게 일어날 것입니다, 나는 그것을 생각하기 위해 약간의 시간을 할애하고, 그리고 나는 그것을 몇 달 동안 잊어 버릴 것입니다. 이 문제를 쫓는 데 지쳤습니다! 누구나 통찰력을 제공 할 수 있습니까?
(측면 참고 :이 태그를 지정하는 방법을 잘 모르겠습니다. 제안을 환영합니다.)
편집 : X에 가능한 값 목록을 얻을 수 있다면 원래 값으로 좁히는 데 도움이 될 수있는 다른 테스트가 있음을 분명히하겠습니다.
m가 단지 2 ^ 32 또는 2 ^ 64이므로 a모듈로 의 지수화 m는 간단하기 때문에 특히 효과적 입니다 (여기서 오버 플로우는 무시)
r*s^-1 mod m당신이 모두를 찾을 필요 r하고 s. 여기, 우리는 r*s mod m모든 것을 알고 r있습니다.