Combien de temps dure la récursivité Collatz?

19

J'ai le code Python suivant.

def collatz(n):
    if n <= 1:
        return True
    elif (n%2==0):
        return collatz(n/2)
    else:
        return collatz(3*n+1)

Quel est le temps d'exécution de cet algorithme?

Essayer:

Si désigne le temps d'exécution de la fonction . Alors je pense que j'ai { T ( n ) = 1  pour  n 1 T ( n ) = T ( n / 2 )  pour  n  pair T ( n ) = T ( 3 n + 1 )  pour  n  impairT(n)collatz(n)

{T(n)=1 for n1T(n)=T(n/2) for n evenT(n)=T(3n+1) for n odd

Je pense que sera si est pair mais comment calculer la récurrence en général?lg n nT(n)lgnn

9bi7
la source
4
Cela devrait être et ainsi de suite. Le +1 est important, sinon vous avez , pour tous les pour lesquels la séquence se termine. T(n)=1nT(n)=T(n2)+1T(n)=1n
user253751
2
54 est pair, T (54) = 112! = Lg (54)
Taemyr
Est-il supposé que l'utilisateur ne saisira que des nombres entiers?
Dean MacGregor
@DeanMacGregor Oui. En fait, un entier positif est supposé.
duskwuff
plus de détails bkg seraient utiles. où avez-vous obtenu le code, comment l'avez-vous présenté? il s'agit d'un problème ouvert semi-célèbre dans la théorie des nombres non résolu depuis ~ ¾ siècle sur lequel un livre entier de Lagarias a été écrit. de CS pov prouver qu'il est dans n'importe quelle classe de complexité de temps ou d'espace équivaut à une preuve. beaucoup plus de références ici . également un excellent sujet pour le chat informatique pour toute personne intéressée. il y a aussi une collatzbalise sur MathOverflow etc. les dernières recherches montrent que le problème a des qualités fractales intrinsèques qui le rendent difficile.
vzn

Réponses:

29

C'est la conjecture de Collatz - problème toujours ouvert.
La conjecture consiste à prouver que cette séquence s'arrête pour toute entrée, car cela n'est pas résolu, nous ne savons pas comment résoudre cette relation de récurrence d'exécution, de plus, elle ne peut pas s'arrêter du tout - donc jusqu'à preuve du contraire, le temps d'exécution est inconnu et peut être .

Mal
la source
Merci. Mais ma récursivité est vraie non? Si oui, alors nous ne pouvons toujours pas trouver la solution pour cette récursivité?
9bi7
Qu'entendez-vous par «la récurrence est vraie»? Vous ne pouvez pas trouver le temps d'exécution, mais pour beaucoup de nombres, cela fera un certain nombre de sauts et atteindra 1. ne désigne pas le temps d'exécution mais la fonction elle-même. T(n)
Evil
Par correct, je voulais dire par exemple que dans le tri par fusion, nous pouvons obtenir . Puisque le code est récursif, nous pouvons écrire la récurrence pour lui, non? T(n)=2T(n/2)+O(n)
9bi7
7
"puisque cela n'est pas résolu, il n'y a pas de limite supérieure" - nous devons être prudents avec le langage ici. Nous ne connaissons pas la solution de cette récurrence, fin de l'histoire.
Raphael
7
Oui. Mais «nous ne savons pas» n'est pas la même chose que «il n'y a pas de limite supérieure». Fondamentalement, je divise les cheveux sur les mathématiques "il y a" ( ) et les gens normaux "il y a" ("j'en ai un"). Je pense que c'est une distinction importante à faire dans TCS , cependant.
Raphael
15

Vous avez correctement traduit le code . Il existe de nombreuses méthodes pour résoudre les récidives .

Cependant, il est actuellement inconnu si collatzmême s'arrête pour tous n; l'affirmation qu'il fait est connue sous le nom de conjecture de Collatz . Par conséquent, aucune méthode connue ne fonctionnera sur cette récurrence.

Je pense que sera si est pairT(n)lgnn

Comment? Je suppose que vous pensez à , pour lequel votre affirmation est correcte. Cela montre que cette récurrence n'est pas celle que nous pouvons résoudre jusqu'à en étudiant exponentiellement peu de points (voir aussi ici ).n=2kΘ

Raphael
la source
13

La fonction de complexité temporelle est

{T(n)=O(1) for n1T(n)=T(n/2)+O(1) for n evenT(n)=T(3n+1)+O(1) for n odd

qui peut être réécrit comme suit si vous êtes intéressé par la complexité temporelle asymptotique.

{T(n)=1 for n1T(n)=T(n/2)+1 for n evenT(n)=T(3n+1)+1 for n odd

On ne sait même pas que la TM résultante (Voir Halting Problem ) pour chaque . Donc, naturellement, nous ne pouvons pas mesurer le temps d'arrêt si nous ne savons même pas s'il s'arrête pour chaque . Reportez-vous également à /math/2694/what-is-the-importance-of-the-collatz-conjecture .n nM,1nHaltnn

La conjecture de Collatz est une conjecture très célèbre que Collatz a proposée en 1937. De nombreux mathématiciens éminents ont passé (lu gaspillé) d'innombrables heures à essayer de résoudre cette conjecture, mais en vain. Même Paul Erdős a déclaré à propos de la conjecture de Collatz: "Les mathématiques ne sont pas encore prêtes pour de tels problèmes."

Shreesh
la source
1
«gaspillé» est un jugement subjectif. voir l'analyse d'expert par Lagarias pour les raisons pour lesquelles le travail / les résultats partiels sur la conjecture peuvent être considérés comme non "gaspillés". la citation d'Erdos a probablement quelques décennies et les mathématiques ont considérablement progressé depuis lors et continuent de ... et toutes les nouvelles techniques mathématiques n'ont probablement pas été tentées contre le problème.
vzn
C'était un commentaire ironique. (Pour être honnête, je l'ai mis entre crochets, n'est-ce pas). Jusqu'à ce que le problème soit résolu, tous les efforts semblent être un gaspillage, mais une fois qu'il est résolu, vous voyez comment même les échecs ont conduit à la solution. Et je ne suis pas d'accord avec vous que les mathématiques ont considérablement progressé; la technologie a considérablement progressé, mais la physique, les mathématiques et même l'informatique progressent lentement, et c'est ainsi que cela devrait être (je peux le dire car, moi qui ai appris mes cordes il y a 30 ans, je ne me sens toujours pas dépassé).
Shreesh
@vzn, je suis allé relire l'introduction de Lagarias dans "The Ultimate Challenge: The Problem". Dans la section 10, il m'a en quelque sorte frappé que Lagarias semble être plus comme essayer de justifier sa position, plutôt que de croire vraiment que c'était un effort bien dépensé. Cela ressemble à une position d'excuse pour moi. Encore une fois, je dirais que c'était mon sentiment subjectif, car bien sûr, on ne peut pas faire de telles déclarations sans connaître la personne. 3x+1
Shreesh
Lagarias a écrit / compilé / édité un livre entier sur le sujet et cela semble "apologétique" d'étudier le problème? lol! bien au contraire . Cependant, il est d'accord / concède qu'il a une position défensive parce que beaucoup d'autres mathématiciens ne considèrent pas le problème comme significatif ou valent une attaque / un effort majeur (et notez que Gauss ressentait exactement la même chose à propos de Fermats Last Thm!). mais il y a d'autres cas massifs de grands mathématiciens qui prennent cela très au sérieux, par exemple Tao pour un.
vzn
2

noddn3n+1

T(n)=2T(n/2)+nT(0)T(1)

3n+1

Sorrop
la source
0

Vous avez T (n) = T (n / 2) + 1 si n est pair. Mais alors n / 2 n'est probablement pas égal, donc vous êtes coincé là-bas.

Ce qui se passe, c'est que les jolies petites règles que vous avez apprises sont confrontées à un vrai problème, et elles ne fonctionnent pas. Ils ont frappé un mur de briques, le visage en premier, et ça fait mal. Faites-vous plaisir et suivez manuellement la récursivité de T (7), puis vous direz si vous croyez toujours que c'est lié lg n.

Si vous pensez que cela n'est pas lié à la question d'origine car 7 n'est pas pair: chaque fois que n est impair, T (n) = T (3n + 1), et 3n + 1 est pair, donc si T (n) était log n si n est pair, il serait log (3n + 1) + 1 chaque fois que n> 1 est impair.

gnasher729
la source