Hier ist eine Lösung, die von der Anforderung oder Behauptung ausgeht, dass komplexe Zahlen nicht zur Lösung dieses Problems verwendet werden können.
Die Multiplikation mit der Quadratwurzel von -1 ist eine Idee, die nur deshalb zu scheitern scheint, weil -1 keine Quadratwurzel über die ganzen Zahlen hat. Aber wenn man mit einem Programm wie Mathematica herumspielt, erhält man zum Beispiel die Gleichung
(1849436465 2 +1) mod (2 32 -3) = 0.
und das ist fast so gut wie eine Quadratwurzel aus -1. Das Ergebnis der Funktion muss eine ganze Zahl mit Vorzeichen sein. Daher werde ich eine modifizierte Modulo-Operation mods(x,n) verwenden, die die ganze Zahl y zurückgibt, die kongruent zu x modulo n ist und am nächsten an 0 liegt. Nur sehr wenige Programmiersprachen haben eine Modulo-Operation, aber sie kann leicht definiert werden. In Python ist sie z.B. so:
def mods(x, n):
y = x % n
if y > n/2: y-= n
return y
Unter Verwendung der obigen Gleichung kann das Problem nun wie folgt gelöst werden
def f(x):
return mods(x*1849436465, 2**32-3)
Dies erfüllt f(f(x)) = -x
für alle ganzen Zahlen aus dem Bereich [-2``31``-2, 2``31``-2]
. Die Ergebnisse der f(x)
liegen ebenfalls in diesem Bereich, aber die Berechnung würde natürlich 64-Bit-Ganzzahlen erfordern.
6 Stimmen
Um welche Stelle ging es bei diesem Vorstellungsgespräch?