Conjecture de Collatz:
Le programme suivant s'arrête toujours:
void function( ArbitraryInteger input){
while( input > 1){
if(input % 2 == 0)
input /= 2;
else
input = (input*3) + 1;
}
// Halt here
}
Légère variation (toujours une conjecture, car elle est basée sur un résultat de celui de Collatz):
Pour certaines entrées, le programme suivant n'entrera jamais deux fois dans le même état (où l'état est déterminé par la valeur détenue par "input"):
void function( ArbitraryInteger input){
while( input >= 1){ // notice the "="
if(input % 2 == 0)
input /= 2;
else
input = (input*3) + 1;
}
}
Notez que le deuxième programme ne s'arrête jamais, que le premier programme s'arrête ou non.
On pense que le premier programme se termine toujours pour toute entrée, cependant, nous n'en avons pas la preuve, et il peut toujours exister un entier pour lequel le programme ne s'arrête pas (il y a aussi un prix de 100 $ pour le prouver) .
Le deuxième programme est également intéressant: il indique que le programme n'entrera jamais deux fois dans le même état pour une entrée, ce qui nécessite essentiellement que le premier programme ait une séquence connue pour diverger sans se répéter. Il ne requiert pas seulement que la conjecture de Collatz soit fausse, mais elle exige qu'elle soit fausse et sans boucles , en dehors de la boucle évidente 1,4,2,1.
Si Collatz n'a que des contre-exemples en boucle, la variation de la conjecture est fausse
Si Collatz est faux sans boucles, la variation de la conjecture est vraie
Si Collatz est vrai, la variation est fausse
Si Collatz est faux à la fois parce qu'il a des boucles et parce qu'il a un nombre pour lequel il diverge, la variation de la conjecture est vraie (il suffit d'un nombre pour lequel il diverge sans entrer dans une boucle)
Je pense que la variation est plus intéressante (pas seulement parce que je l'ai trouvée par accident et que je l'ai remarquée grâce à @LieuweVinkhuijzen), mais parce qu'elle nécessite en fait une vraie preuve. En forçant brutalement, nous pourrons peut-être trouver une boucle un jour ou l'autre (et ce sera une boucle de plus de 70 nombres: l'état actuel de la technique est qu'il ne peut pas y avoir de boucles infinies plus courtes que 68 environ), et brute le forçage n'est pas intéressant: c'est juste un calcul de nombres. Cependant nous ne pouvons pas forcer brutalement une séquence infinie divergente, nous ne savons pas si elle se terminera vraiment sans une preuve réelle.
EDIT: J'ai sauté la partie sur Collatz Conjecture désolé, j'ai vraiment répondu par cœur avec un algorithme que j'ai lu il y a quelques années, je ne m'attendais pas à ce que cela soit déjà mentionné.
EDIT2: Un commentaire m'a fait remarquer que j'ai écrit l'algorithme avec une erreur, cependant, cette erreur rend en effet ma réponse différente de la conjecture de Collatz (mais une variation directe de celle-ci).