Partage
  • Partager sur Facebook
  • Partager sur Twitter

Python ne répond plus a cause de Fibonacci!

Anonyme
    8 juin 2011 à 20:13:14

    bonjours les amis,

    alors voila, python ne répond plus a cause d'un calcule effectuer sur une séquence de Fibonacci(les 4 millions premier terme !)
    je sais que c'est fous mais c'est un exercice proposer sur :ce site et ce n'est pas un problème de code ou autre car j'ai testé sur des nombres plus petit ( le nombre 10 ) et c’était impeccable.

    voila le code:(au cas ou :euh: )
    a = 0
    b = 1
    
    i = 0
    total=0
    while i <4000000 :
         a , b ,c =a , b ,a+b
         a , b = b , c
         if c % 2 == 0:
              total=total+c
         i += 1
    print(total)
    
    • Partager sur Facebook
    • Partager sur Twitter
      8 juin 2011 à 20:51:20

      Fais bien attention, il est écrit que les valeurs de la séquence ne doivent pas dépasser 4 millions, pas qu'il faut les 4 millions premières valeurs.
      Quoi qu'il en soit tu peux faire beaucoup plus simple pour calculer les valeurs de la suite.

      Pourquoi tu additionnes seulement quand "c" est pair ?
      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        8 juin 2011 à 21:00:33

        Euh tu veux dire que le programme dois être capable de faire le calcule sur des nombres en dessous 4 millions?

        et non je n'additionne pas que quand c'est paire... l'exo dis :the sum of the even-valued terms
        je crois que ca veux dire que les nombres qui on un reste zero?!

        j'avoue que je ne comprends pas trop l'anglais , mais je pense que c'est ce que veux l'exo,non?
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          8 juin 2011 à 21:37:27

          Les nombres dont le reste de la division euclidienne par 2 n'ont pas de reste sont des nombres paires.

          Mais là, on te demande juste la somme de tous les nombres de Fibonacci inférieur à 4 000 000.

          [edit] Pour répondre au titre de ce sujet : Python finira par te donner le résultat de ton code, mais il faut être patient parce que ce fameux code fait 4 000 000 de calculs avec des nombres énormes ! Bref, si tu attends quelques minutes, il te sortira le résultat... :-°
          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            8 juin 2011 à 21:49:14

            ha ok la je comprends.Merci PsycoPy =D
            mais ca ne règle pas le problème que rencontre le programme lors de son exécution.IDEL n'affiche plus rien et je dois le redémarrer

            PS: je suis sur ubuntu j'ai oublie de le mentionner avant
            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              8 juin 2011 à 21:50:06

              J'ai édité mon message. ;)
              • Partager sur Facebook
              • Partager sur Twitter
              Anonyme
                8 juin 2011 à 21:52:23

                ok je vais attendre qq minutes ...merci encore

                je te tiendrai au courant
                • Partager sur Facebook
                • Partager sur Twitter
                  8 juin 2011 à 22:04:03

                  Pourquoi on ne m'écoute pas quand je parle ? (ou plutôt ne me lit pas quand j'écris)

                  L'énoncé dit bien que les valeurs de la suite ne doivent pas dépasser 4 000 000, pas qu'il faut additionner 4 millions de valeurs !
                  Cela revient à dire que le plus grand nombre retourné par la suite de Fibonacci ne doit pas dépassé 4 000 000, du coup ça fait à peine plus de 30 calculs générés par l'algorithme de la suite (ça n'aurait aucun sens de faire la somme des 4 millions premiers termes de la suite, d'autant plus que le résultat de la somme serait vraiment ÉNORME).

                  Dans tous les cas, le but du problème est de trouver un algorithme efficace pour résoudre le résoudre par l'informatique/programmation, donc le nombre de valeurs additionnées entre elles, que ce soit 10 ou 500, importe peu dans cet exercice.
                  • Partager sur Facebook
                  • Partager sur Twitter
                  Anonyme
                    8 juin 2011 à 22:19:28

                    Si je te lit et je te comprends ! Je n'ai fait que reformuler ce que tu avais dit après avoir expliqué à l'OP ce qu'est un nombre paire.


                    ...ok, j'aurais pu le laisser chercher tout seul... Pardon... :-°

                    [edit] et j'aurais aussi pu lui dire que son code était de toute façon faux...
                    • Partager sur Facebook
                    • Partager sur Twitter
                    Anonyme
                      8 juin 2011 à 23:00:58

                      c'est bon j'ai résolu le bleme
                      • Partager sur Facebook
                      • Partager sur Twitter
                      Anonyme
                        8 juin 2011 à 23:05:46

                        Alors tu as surement trouvé le nombre 9227464 ? ;)

                        def sumfib(n):
                            a = b = 1
                            x = 0
                            while a <= n:
                                x += a
                                a, b = b, a + b
                            return x
                        
                        • Partager sur Facebook
                        • Partager sur Twitter
                          8 juin 2011 à 23:15:58

                          Perdu !
                          Il faut faire la somme après l'affectation de "a", car au dernier tour de boucle "a" n'est pas pris en compte dans la somme.
                          Pour y remédier, interchange les 2 lignes dans le while :)
                          • Partager sur Facebook
                          • Partager sur Twitter
                            8 juin 2011 à 23:17:46

                            Sauf que ça ne répond pas à la question originelle (il faut additionner seulement les nombres pairs)
                            • Partager sur Facebook
                            • Partager sur Twitter
                            Anonyme
                              8 juin 2011 à 23:24:41

                              Arf... la loose...
                              Je vais me pendre et je reviens. :'(

                              @Fayden: L'anglais n'est clairement pas ma passion, mais tu es sur de ce que tu avances là ? Je n'ai rien vue à propos des nombres paires dans l'énoncé...
                              • Partager sur Facebook
                              • Partager sur Twitter
                                8 juin 2011 à 23:25:41

                                Citation

                                [...] find the sum of the even-valued terms.



                                La vraie réponse est environ la moitié de la tienne
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  8 juin 2011 à 23:26:36

                                  Even-valued terms veut dire les termes dont la valeur est paire, c'est sûr qu'on peut pas l'inventer si on ne le sait pas.
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    9 juin 2011 à 10:25:33

                                    Citation : BlueRat

                                    Even-valued terms veut dire les termes dont la valeur est paire, c'est sûr qu'on peut pas l'inventer si on ne le sait pas.



                                    Sans doute mais avant de résoudre un énoncé, on cherche d'abord à le comprendre, non ?


                                    Pour en revenir au problème, si a, b et c sont trois éléments successifs de la suite des termes pairs de la suite de Fibonacci alors on vérifie que <math>\(c=a+4b\)</math>, d'où la solution suivante :

                                    a, b, c, s = 0, 2, 8, 10
                                    while c < 4 * 10 ** 6:
                                        s, a, b = s + c, b, c
                                        c = a + 4 * b
                                    
                                    print s
                                    




                                    EDIT : ce code est mal initialisé, il faut commencer avec s=2 et non s=10 (ligne 1).





                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      9 juin 2011 à 10:55:18

                                      Pour avoir initialisé la variable s à 10 ?
                                      La première valeur paire non nulle de la suite est 2 : lors du premier tour de boucle tu fais la somme des 2 premiers termes pairs + le 2ème terme pair (soit s + 8, où s = 2+8), d'où un résultat faux auquel il faut soustraire 8 pour avoir le bon.

                                      Autrement dit, en initialisant s à 2, ça fonctionne.
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                      Anonyme
                                        9 juin 2011 à 11:16:08

                                        Avec un générateur ça doit être plus efficace je pense

                                        def fib(n): # made in Martelli
                                            a = 0
                                            b = 1
                                            while a < n:
                                              a,b = b, a+b
                                              yield a
                                        	
                                        print(sum([x for x in fib(4000000) if not x%2]))
                                        


                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          9 juin 2011 à 11:46:03

                                          Citation : BlueRat

                                          Pour avoir initialisé la variable s à 10 ?



                                          Parce que les trois premiers termes pairs de la suite de Fibonacci sont 0, 2, 8 et donc la somme courante est 0+2+8=10.



                                          Citation : BlueRat


                                          La première valeur paire non nulle de la suite est 2 : lors du premier tour de boucle tu fais la somme des 2 premiers termes pairs + le 2ème terme pair (soit s + 8, où s = 2+8), d'où un résultat faux auquel il faut soustraire 8 pour avoir le bon.



                                          Non(*), ma somme est correcte (s=4613740), je fais juste commencer ma suite de Fibonacci (suivant un usage fréquent) par :

                                          <math>\(f_0=0, f_1=1\)</math>




                                          Citation : fred1599

                                          Avec un générateur ça doit être plus efficace je pense



                                          Je ne vois pas en quoi ce serait plus efficace.

                                          Citation : fred1599



                                          def fib(n): # made in Martelli
                                              a = 0
                                              b = 1
                                              while a < n:
                                                a,b = b, a+b
                                                yield a
                                          	
                                          print(sum([x for x in fib(4000000) if not x%2]))
                                          








                                          C'est incohérent. Un générateur a pour intérêt de produire les éléments d'une suite à la volée, or c'est exactement l'inverse que tu fais ici (cf. tes crochets ligne 8) puisque tu stockes TOUS les termes pairs de la suite de Fibonacci. Il se trouve que la suite de Fibonacci croit exponentiellement donc ta méthode n'a pas d'inconvénient visible. Pour un code cohérent, il aurait fallu sommer sur un itérateur et non pas une liste. L'avantage de mon code est simplement qu'il calcule trois fois moins de termes que toi (si tu regardes la suite de Fibonacci, elle suit un cycle pair, impair, impair).

                                          (*) EDIT : en effet, mon code est mal initialisé.
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            9 juin 2011 à 12:13:28

                                            Citation : candide


                                            Parce que les trois premiers termes pairs de la suite de Fibonacci sont 0, 2, 8 et donc la somme courante est 0+2+8=10.


                                            C'est justement de là que vient le problème, certes la première somme est égale à 10, l'algo est bon, mais lors de ton premier tour de boucle, tu additionnes 10 avec 8 (variable c) comme je l'ai expliqué plus haut : tu additionnes donc 2 fois la valeur 8 !

                                            Citation : candide


                                            Citation : BlueRat


                                            La première valeur paire non nulle de la suite est 2 : lors du premier tour de boucle tu fais la somme des 2 premiers termes pairs + le 2ème terme pair (soit s + 8, où s = 2+8), d'où un résultat faux auquel il faut soustraire 8 pour avoir le bon.



                                            Non, ma somme est correcte (s=4613740), je fais juste commencer ma suite de Fibonacci (suivant un usage fréquent) par :


                                            Tu as l'air vraiment sûr de toi, pourtant fred1599 et moi-même trouvons le même résultat = 4613732 (ce n'est pas parce que nous trouvons tous les 2 le même résultat qu'il doit être juste, mais ici c'est le cas).
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                            Anonyme
                                              9 juin 2011 à 12:39:06

                                              @Candide je ne vois pas trop où tu veux en venir, j'ai essayé d'améliorer le code, peut-être était-ce de cela dont tu veux parler

                                              J'ai transformer la liste en tuple qui le rend sûrement plus performant et j'ai générer que les nombres paires dans la fonction fib.

                                              def fib(n): # made in Martelli
                                                  a = 0
                                                  b = 1
                                                  while a < n:
                                                    a,b = b, a+b
                                                    if not a%2:
                                                        yield a
                                              	
                                              print(sum((x for x in fib(4000000))))
                                              
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                9 juin 2011 à 12:51:40

                                                Non ici tu fais tous les calculs et tu retournes les valeurs paires, alors que Candide ne fait les calculs que pour les valeurs qui sont paires. En fait il ne génère environ qu'un tier des valeurs de la suite.
                                                D'autant plus que tu crées un tuple qui peut avoir énormément de valeurs en fonction du paramètre 'n', ce qui n'est pas le plus performant.
                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  9 juin 2011 à 13:55:21

                                                  Citation : BlueRat


                                                  Tu as l'air vraiment sûr de toi, pourtant fred1599 et moi-même trouvons le même résultat = 4613732 (ce n'est pas parce que nous trouvons tous les 2 le même résultat qu'il doit être juste, mais ici c'est le cas).



                                                  Oui, exact, je dois laisser s à 2 et non pas 10.

                                                  Citation : fred1599

                                                  peut-être était-ce de cela dont tu veux parler



                                                  Plus ou moins.



                                                  Citation : BlueRat


                                                  D'autant plus que tu crées un tuple qui peut avoir énormément de valeurs en fonction du paramètre 'n', ce qui n'est pas le plus performant.



                                                  Citation : fred1599


                                                  J'ai transformer la liste en tuple qui le rend sûrement plus performant




                                                  Non, vous vous trompez, le fait de mettre des parenthèses au lieu de crochets ne change pas le type de données de liste en tuple : l'expression utilisée s'appelle une genexp et elle crée un itérateur.


                                                  Citation : fred1599


                                                  j'ai générer que les nombres paires dans la fonction fib.



                                                  C'est pas tellement la question de gérer les termes pairs au début ou à la fin, c'était surtout le fait d'avoir partout un itérateur.


                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                  Anonyme
                                                    9 juin 2011 à 14:02:28

                                                    *résurrection*

                                                    sum(fib(n)) c'est mieux que sum(x for x in fib(n)). ;)
                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      9 juin 2011 à 14:14:13

                                                      Citation : PsycoPy

                                                      *résurrection*

                                                      sum(fib(n)) c'est mieux que sum(x for x in fib(n)). ;)




                                                      Absolument. C'est comme écrire [x for x in range(42)] au lieu de range(42)
                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        9 juin 2011 à 14:16:45

                                                        Citation : sizixe

                                                        c'est bon j'ai résolu le bleme


                                                        Tu peux alors marquer le sujet comme "Résolu" :)
                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                        Anonyme
                                                          9 juin 2011 à 14:17:26

                                                          Citation

                                                          C'est pas tellement la question de gérer les termes pairs au début ou à la fin, c'était surtout le fait d'avoir partout un itérateur.



                                                          Peut-être ai-je compris ce que tu voulais me dire, difficile quand on a pas les bases, mais bon on fait ce qu'on peut avec ce que l'on a.

                                                          def fib(n): # made in Martelli
                                                              a = 0
                                                              b = 1
                                                              Somme = 0
                                                              while a < n:
                                                                a,b = b, a+b
                                                                if not a%2:
                                                                    Somme += a
                                                              return Somme
                                                          
                                                          print fib(4000000)
                                                          
                                                          • Partager sur Facebook
                                                          • Partager sur Twitter
                                                          Anonyme
                                                            9 juin 2011 à 14:20:02

                                                            Citation : candide

                                                            Absolument. C'est comme écrire [x for x in range(42)] au lieu de range(42)


                                                            Sauf avec Python 3 où range retourne un itérateur et non une liste. Mais on préfèrera list(range(x)) à une list comprehension.
                                                            • Partager sur Facebook
                                                            • Partager sur Twitter
                                                              9 juin 2011 à 14:48:28

                                                              Citation : PsycoPy


                                                              Sauf avec Python 3 où range retourne un itérateur



                                                              Oui, c'est vrai j'en suis encore à Python 2.x.
                                                              • Partager sur Facebook
                                                              • Partager sur Twitter

                                                              Python ne répond plus a cause de Fibonacci!

                                                              × 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