Partage
  • Partager sur Facebook
  • Partager sur Twitter

Courbe temps de vol en fonction suite Syracuse

Suite de Syracuse

    20 décembre 2016 à 11:32:29

    Bonjour, je vous poste ce message afin que vous puissiez me débloquer sur une partie concernant une courbe de la suite de Syracuse où je ne sais pas comment m'y prendre car cela risque d'être long.

    J'aimerai tracer plusieurs temps de vol en fonction de la suite n (par exemple : n = 2, n = 5, ...).

    Mais le problème est que je dois rentrer énormément de valeurs dans mes listes (x, y) pour pouvoir le tracer (voir image en pièce jointe où l'on prend 32000 valeurs de temps de vol).Temps de vol en fonction de n Comment dois-je m'y prendre pour pouvoir tracer cette courbe (ci-dessus).

    Répondez-moi quand vous aurez du temps libre.

    Je vous en serai très reconnaissant.

    Merci de votre compréhension.

    • Partager sur Facebook
    • Partager sur Twitter
      20 décembre 2016 à 12:58:33

      Bah c'est pas trop dur. Il te faut une liste contenant les couples (i, ti) avec ti le temps de vol pour la valeur i. Pour ça, il suffit juste de faire une boucle sur les nombres dont tu souhaites avoir le temps de vol et de faire le calcul. Donc tu auras quelque chose comme:

      [(2, 1), (3, 7), (4, 2), (5, 5), (6, 8), (7, 16), (8, 3), (9, 19), (10, 6), ..]


      Ensuite tu utilises le package pyplot de matplotlib pour tracer le graphe:

      import matplotlib.pyplot as plt
      
      
      #En considérant que tps_vol est la liste [(i1, ti1), (i2, ti2), ...]
      #On dégroupe les valeurs
      n, t = zip(*tps_vol)
      
      #Et on trace le graphe
      plt.plot(n, t, '.k', markersize=2)
      plt.show()


      Ou sinon tu peux le faire directement (sans passer par l'étape de dégroupage):

      plt.plot(*zip(*tps_vol), '.k', markersize=2)
      plt.show()


      In fine, j'obtiens ce graphe (assez rapidement pour 32000 valeurs) sans avoir fait aucune optimisation dans le calcul des temps de vol (mais c'est possible d'en faire):

      -
      Edité par Olygrim 20 décembre 2016 à 13:02:59

      • Partager sur Facebook
      • Partager sur Twitter
      Précepte: Le mieux est l'ennemi du bien
        20 décembre 2016 à 15:16:13

        C'est beau :waw:

        On les voit bien les grêlons là :D

        • Partager sur Facebook
        • Partager sur Twitter
          20 décembre 2016 à 15:26:06

          Bonjour, je suis en panne d'idées, voici mon code.

          Voici ci-dessous le code :

          def syracuse(n):
              # Chiffre entré par l'utilisateur
              n = int(input('Nombre à tester: '))
              " Affiche la conjecture de Syracuse pour le nombre n. "
              
              suite = []
              while n != 1:
                  suite.append(n)
                  if n % 2 == 0:
                      n = n // 2
                  else:
                      n = 3*n + 1
              suite.append(n) # On ajoute le '1' manquant
              return suite
              
          if __name__ == '__main__':
              suite = syracuse(0)
              print(suite)
              
              max_alt = []
              for i in suite[1:]:
                  if i >= suite[0]:
                      max_alt.append(suite)
                  else:
                      break
           
              print('Vol:', len(suite[1:]))
              print('Alt:', len(max_alt))
              print('Max:', max(suite))

          Pourriez-vous me donner au moins un indice afin que je puisse avoir cette courbe s'il vous plaît (car je vois le principe mais je suis en panne d'idées pour commencer).

          Répondez-moi quand vous aurez du temps libre.

          Je vous en serai très reconnaissant.

          Merci de votre compréhension.

          • Partager sur Facebook
          • Partager sur Twitter
            20 décembre 2016 à 16:49:01

            Alors première remarque, puisque n est passé en paramètre de la fonction (ligne 1), il ne sert à rien de la redéfinir à l'intérieur (ligne 3). Ensuite l'objectif n'est pas de créer une liste contenant toutes les étapes mais simplement de déterminer le temps de vol (de ce que j'ai compris dans ton 1er post). Donc un simple compteur suffit (qui va compter le nombre d'étapes avant d'arriver à 1):

            def syracuse(n):
                compteur = 0
                while n != 1:
                    compteur += 1
                    if n%2 == 0:
                        n = n // 2
                    else:
                        n = 3*n + 1
                return compteur


            Ensuite pour avoir le graphe que j'ai obtenu, j'ai simplement calculé le temps de vol de chaque entier compris entre 2 et 32000 (avec un range). Voici mon code:

            import matplotlib.pyplot as plt
            
            
            def tps_vol_syracuse(n):
                cpt = 0
                while n != 1:
                    cpt += 1
                    if n%2:
                        n = n*3 + 1
                    else:
                        n = n//2
                return cpt
            
            
            tps_vol = []
            #calcul du temps de vol de chaque nombre compris entre 2 et 32000
            for nb in range(2, 32000):
                tps_vol.append((nb, tps_vol_syracuse(nb)))
            
            
            plt.plot(*zip(*tps_vol), '.k', markersize=2)
            plt.show()


            Comme dit précédemment, la boucle de calcul est très basique (pas optimisé) mais fait parfaitement l'affaire pour le calcul de 32000 temps de vol ;)

            -
            Edité par Olygrim 20 décembre 2016 à 17:03:42

            • Partager sur Facebook
            • Partager sur Twitter
            Précepte: Le mieux est l'ennemi du bien

            Courbe temps de vol en fonction suite Syracuse

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown