Voici une preuve de pourquoi une telle fonction ne peut pas exister, pour tous les nombres, si elle n'utilise pas d'informations supplémentaires(à l'exception de 32bits de type int):
On doit avoir f(0) = 0. (La preuve: Supposons que f(0) = x. Alors f(x) = f(f(0)) = -0 = 0. Maintenant, -x = f(f(x)) = f(0) = x, ce qui signifie que x = 0.)
De plus, pour un x
et y
, supposons f(x) = y
. Nous voulons f(y) = -x
ensuite. Et f(f(y)) = -y => f(-x) = -y
. Pour résumer: si f(x) = y
, alors f(-x) = -y
, et f(y) = -x
, et f(-y) = x
.
Donc, nous avons besoin de diviser tous les nombres entiers à l'exception de 0 en séries de 4, mais nous avons un nombre impair de ces entiers, non seulement que, si on enlève le nombre entier qui n'ont pas de contrepartie positive, nous avons encore 2(mod4).
Si on enlève les 2 le nombre maximal de gauche (abs), nous pouvons obtenir la fonction:
int sign(int n)
{
if(n>0)
return 1;
else
return -1;
}
int f(int n)
{
if(n==0) return 0;
switch(abs(n)%2)
{
case 1:
return sign(n)*(abs(n)+1);
case 0:
return -sign(n)*(abs(n)-1);
}
}
Bien sûr, une autre option est de ne pas se conformer pour 0, et d'obtenir les 2 numéros, nous avons retiré comme un bonus. (Mais c'est juste un idiot si.)