IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Nombres premiers en open source


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Nombres premiers en open source
    Bonjour à tous
    Je ne comprends pas encore le tout python, et çà s'en ressent lors de l'exécution de la programmation.

    Un peu d'aide m'aiderait à comprendre mes erreurs

    Voici la copie du programme source : Confiez vos commentaires de nph1.py

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    # Ce programme calcule les Nombres Premiers #
    # Révolution : Vicenté Llavata au 25 avril 2014 #
     
    # Initialisation de listeNPH.txt #
    fo = open("C:\python\pynph\listeNPH.txt","r")
    ft = fo.readline()
    fo.close()
    if (ft == ""):
        fo = open("C:\python\pynph\listeNPH.txt","a")
        fo.write("1\n","1\n")
        fo.close()
     
    # Fonction de recherche #
    def calnph(a):
        if (a > 1):
            lfor = open("C:\python\pynph\listeNPH.txt","r")
            lb = a          #
            lbb = (lb + 1)       # Initie segment for(lbb)
            lc = lb * 2     #
            nreelexist = 0
            #
            for lbb in lc :             # Segment for(lbb)
                lba = lbb / lb           # Réel lb
                lbb = lbb + 1
                while l :
                    nentier = float(lfor.readline())
                    nreel = float(lfor.readline())
                    if (lba == nreel) :
                        nreelexist = 1
                        break
                if (nreelexist == 1) :
                    lbb == (lc + 1)     # Terme for (lbb)
            #
            lfor.close()
            if (nreelexist == 0) :
                nentier1 = lb
                nreel2 = lba
                e = str(nentier1)
                f = str(nreel2)
                prenph(e,f)
     
    # Fonction du premier réel #
    def prenph(e,f):
        lfoa = open("C:\python\pynph\listeNPH.txt","a")
        lfoa.write(e,"\n")
        lfoa.write(f,"\n")
        lfoa.close()
     
    # Introduction nombre utilisateur #
    nombre = input("Entrez un nombre entier : ")
    ne = int(nombre)
    a = 0
     
    # Début de la boucle globale (a) #
    while (a <= ne) :
        a = a + 1
        nem = a%6
        if (nem == (1 or 5)):
            calnph(a)
    Merci d'avance pour vos commentaires...
    Dernière modification par Jerome Briot ; 27/04/2014 à 16h50. Motif: Ajout balises [code][/code]

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Salut,

    Pourquoi ne pas prendre le temps de parcourir un tuto. pour apprendre les constructions de base?
    Dans le Python tutorial, vous avez déjà:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    >>> for n in range(2, 10):
    ...     for x in range(2, n):
    ...         if n % x == 0:
    ...             print n, 'equals', x, '*', n/x
    ...             break
    ...     else:
    ...         # loop fell through without finding a factor
    ...         print n, 'is a prime number'
    ...
    2 is a prime number
    3 is a prime number
    4 equals 2 * 2
    5 is a prime number
    6 equals 2 * 3
    7 is a prime number
    8 equals 2 * 4
    9 equals 3 * 3
    Ca génère les nombres premiers et çà vous montre aussi l'intérêt de for a in range(1, n) plutôt que while a < n: a += 1 et la construction "for...else..."

    La plus grosse partie de votre code consiste a gérer des fichiers.
    On peut imaginer que çà stocke les N nombres premiers calculés lors des run précédents.
    Mais c'est pas très clair (et c'est plein de bugs).

    Plutôt que de vous embêter avec des fichiers, des conversions de str en float et de int en str, pourquoi ne pas commencer par tout stocker dans une liste en mémoire? C'est un type de base Python fort utile.
    Lorsque çà fonctionnera, vous pourrez optimiser en chargeant/sauvegardant cette liste dans un fichier.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Invité
    Invité(e)
    Par défaut Excellent exercice de code
    Vous m'avez rassuré avec cet exemple ciblé tutoriel, qui va peut être faire avancer mes boucles "for".
    Puis, je vais me pencher sur cette nouvelle opportunité de calcul des nombres premiers...
    D'ailleurs, je suis contant d'utiliser ce langage de programmation, car il laisse des idées claires codées.
    à bientôt, après analyse du code tutoriel

  4. #4
    Invité
    Invité(e)
    Par défaut Un avis en plus
    Je suis encore dessus, et j'avance doucement...

    Et, autrement pour aider le suivi du programme.
    J'ai ajouté des mots "print", afin d'y lire des valeurs.
    Les "print" sont situés en fin de bloc de traitement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    # Ce programme calcule les Nombres Premiers #
    # Révolution : Vicenté Llavata au 1 mai 2014 #
     
    #4 Initialisation de listeNPH.txt #
    #5 ListeNPH.txt enregistre les nombres premiers entiers
    #6 Le fichier "listeNPH" des nombres entiers diviseurs
    fo = open("C:\python\pynph\listeNPH.txt","r")
    ft = fo.readline()
    fo.close()
    if (ft == ""):
        fo = open("C:\python\pynph\listeNPH.txt","a")
        fo.write("1\n")
        fo.close()
     
    #15 Fonction de recherche #
    def calnph(a):
        if (a > 1):
            lb = a              #19 a = Cumul des tours !
            lbb = lb            #20 Initie segment for(lbb) (=(a+1))
            lc = lb * 2         #21 Le double de "a"
            nreelexist = 0      #22 Réinitialisation de nreelexist
            print("if (a > 1):) ",a," ",lbb," ",lc,)
            #23
            # "while (a <= ne)" ionique Utile
            # "def calnph(a)" tonique Globale
            # "for lbb in range(lb,lc)" diatonique Locale
            #27
            for lbb in range(lb,lc) :   # Segmentation diatonique
                lfor = open("C:\python\pynph\listeNPH.txt","r")
                lbb1 = lbb
                lbb2 = lbb1 + 1
                lba = lbb2 / lb          # Réel lba de la division
                print("for lbb in range(lb,lc) ",lba," ",lbb2," ",lb)
     
                while (nreelexist != 1) :   # Lecture listeNPH.txt par tour
                    nen = lfor.readline()   # Lecture ligne
                    if (nen == "1") :
                        nen1 = 1
                    elif (nen == "") :
                        nen1 = 2
                        nreelexist = 0
                    else :
                        nen4 = int(nen)
                        nentier = nen4           # nentier, c'est la donnée lue
                        nen2 = nentier
                        nen3 = nen2 + 1
                        nenreel = nen3 / nentier  # Réel listeNPH.txt
                        print("while (nreelexist != 1) ",nenreel," ",nen3," ",nentier)
                        print("while (nreelexist != 1) ",lba," "," ")
                        if (lba == nenreel) :   # Les deux réels sont identiques
                            nreelexist = 1      # nreelexist vaut 1
                            print("if (lba == nenreel) ",lba," ",nreel," ",nreelexist)
                #40
                if (nreelexist == 0) :
                    nentier1 = lb
                    e = str(nentier1)
                    print("if (nreelexist == 0)",nentier1)
                    prenph(e)
     
    #49 Fonction du premier réel #
    def prenph(e):
        lfoa = open("C:\python\pynph\listeNPH.txt","a")
        lfoa.write(nentier,"\n")
        lfoa.close()
     
    #55 Introduction nombre utilisateur #
    nombre = input("Entrez un nombre entier : ")
    if (nombre == "") :
        ne = 1
    else :
        ne = int(nombre)
    a = 0
     
    #60 Début de la boucle globale (a) #
    while (a <= ne) :               # Segmentation ionique
        a = a + 1
        nem = a%6
        if ((nem == 1) or (nem == 5)):
            calnph(a)
    Pour le moment, j'essaie de savoir là où çà casse :^)

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Salut,

    Côté code, je ne peux pas faire grand chose pour vous.
    Par contre, vous semblez avoir la même maladie qu'un de vos copains du forum.
    Rassurez vous, ce n'est pas contagieux. Votre vie n'est pas en danger. Juste qu'écrit comme çà, un code est épuisant. Il devient indomptable.


    79 lignes de code. La structure se résume a deux fonctions.
    Pas facile de s'y retrouver.
    Imaginez que vos lignes soient autant de vaches. Manque de bol, pas de chien de troupeau pour les rabattre. En Australie, ils rabattent les troupeaux avec des avions ou des hélicos.
    Heu... snif avec du code on ne peut même pas espérer l'aide d'un toutou ;-(
    Damned!

    Pourquoi s'embêter a ouvrir et lire dans le fichier lors de la génération des nombres premiers?
    Qu'est devenu l'exemple de la doc. Python?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    >>> for n in range(2, 10):
    ...     for x in range(2, n):
    ...         if n % x == 0:
    ...             print n, 'equals', x, '*', n/x
    ...             break
    ...     else:
    ...         # loop fell through without finding a factor
    ...         print n, 'is a prime number'
    Pas facile de le retrouver dans cette forêt vierge!

    Cette chose là forge le squelette de votre programme.
    Une fois que cela marche, le jeu sera d'ajouter les histoires de fichiers sans rien casser.
    Le plus simple sera de décorer ce squelette.
    Cette jonglerie avec le fichier permet de ne pas calculer les N premiers nombres que l'on a déjà calculé.
    C'est une liste d'entiers. Elle est rangée en ordre croissant. Et le prochain nombre premier ira s'ajouter à la fin.

    Pourquoi ne pas lire le fichier au début et transformer son contenu en liste d'entiers?
    Puis vous appelez calnpth avec un paramètre supplémentaire "known_primes".
    Plus besoin de se trimbaler la gestion du fichier dans la fonction.

    "known_primes" est une liste d'entiers.
    vide ou pleine, calnpth devra récupérer ou accumuler des nombres premiers en fonction de "n".
    Pour mettre au point ce truc là, pas besoin du fichier.
    Vous pouvez tester avec la liste que vous voulez, vous assurer qu'elle est bien utilisée, mise à jour.

    Cela fait, comment sauvegarder et relire une liste d'entier est quelque chose d'assez générique, çà se fout pas mal de ce qu'on pourra bien faire de la liste après.

    Ah c'est pour monsieur nombre premier?
    C'est comme dans la vraie vie. Maintenant que sont séparés génération des nombre premier et gestion du fichier, il va falloir "orchestrer" ces bouts pour que ce qui sort de l'un entre dans ce qu'attend l'autre.

    Mais c'est le plus fastoche:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    1 - lire "known_primes" 
    2 - entrée de "nombre"
    3 - calcul "nombre", "known_primes"
    4 - écrire "known_primes"
    Ouais... c'est pas du Python. Mais c'est facile à traduire en Python.
    En plus ce sont des fonctions. Une première mouture de lire "known_primes" pourrait se réduire à:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def read_known_primes():
         return [ 1 ]
    Ca retourne ce que devrait être un nouveau fichier....

    L'idée est que si vous partez faire de l'escalade, il faut anticiper le chemin par lequel vous allez passer pour y arriver.
    Bon courage.

    - W

    PS: il faudra que je revoie la metaphore du squelette. Mais je n'ai pas réussi à traduire "it is the business of the program".
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Invité
    Invité(e)
    Par défaut
    Je vous ai compris !

    Il est vrai que mon voyage parmi les nombres entiers m'a fait voir plein de choses... .

    Salut,

    Pourquoi ne pas prendre le temps de parcourir un tuto. pour apprendre les constructions de base?
    Dans le Python tutorial, vous avez déjà:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    >>> for n in range(2, 10):
    ...     for x in range(2, n):
    ...         if n % x == 0:
    ...             print n, 'equals', x, '*', n/x
    ...             break
    ...     else:
    ...         # loop fell through without finding a factor
    ...         print n, 'is a prime number'
    Il me semble qu'à première vue, le tuto ne démontre pas la capacité hexa des entiers.
    Le tuto répète les nombres, ce qui n'est pas utile. Puis, 9 n'est pas un nombre premier.
    C'est à cause de çà, que je prend tout mon temps, et qu'autrement je peaufine mon code perso)

    Salut,

    Côté code, je ne peux pas faire grand chose pour vous.
    Par contre, vous semblez avoir la même maladie qu'un de vos copains du forum.
    Rassurez vous, ce n'est pas contagieux. Votre vie n'est pas en danger. Juste qu'écrit comme çà, un code est épuisant. Il devient indomptable.
    Pour ne venir au squelette, qu'est-il sans l'imagerie, sans la médecine. Pour dompter, il faut comprendre !
    Car, le programme calcule les nombres avec une logique du nombre premier multiple. Pour comprendre, il faut dompter !

    Pourquoi s'embêter a ouvrir et lire dans le fichier lors de la génération des nombres premiers?
    Qu'est devenu l'exemple de la doc. Python?
    Il est, que si le mot réservé "python" est réduit à un unique mot.
    Il est alors, plus que difficile de lire en ce mot codé le traitement qu'il effectue.
    C'est pour une raison de transparence, que je préfère écrire mon programme en version alpha.

    Pourquoi ne pas lire le fichier au début et transformer son contenu en liste d'entiers?
    Puis vous appelez calnpth avec un paramètre supplémentaire "known_primes".
    Aussi, les nombres entiers premiers multiples aucun humain n'en connait la limite.
    Et, mon petit ordinateur non plus, alors je laisse une plage dans un fichier.
    Qui en un premier temps est sur mon ordi, et sûrement plus tard en mémoire externe.

    Merci pour votre message, qui ne manque pas de piquant.
    Dernière modification par Invité ; 02/05/2014 à 14h32.

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par toumus Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    # Ce programme calcule les Nombres Premiers #
    if (ft == ""):
        fo = open("C:\python\pynph\listeNPH.txt","a")
        fo.write("1\n","1\n")
        fo.close()
    Bonjour
    Sans vouloir casser l'ambiance, 1 n'est pas un nombre premier.
    Ce n'est pas à cause d'une histoire de sémantique (est-ce que le "et" dans "nombre divisible par un et par lui-même" doit signifier que le nombre doit absolument être différent de un) mais simplement parce que certaines propriétés mathématiques qui fonctionnent avec les nombres premiers ne fonctionnent pas avec 1.
    Par exemple une propriété qui dit qu'un nombre non premier est toujours le produit d'un nombre fini de nombres premiers (12=2*2*3) ne fonctionne plus si on y inclus 1 => 12=1*1*1*1*......... (à l'infini)*2*2*3.

    Et donc, pour éviter de devoir rajouter à chaque fois "sauf 1", la communauté mathématique a décidé que 1 serait exclu de la liste des premiers. Ainsi, le tout premier nombre premier sera le seul et unique nombre premier pair ce qui correspond en plus à une certaine élégance mystique (le premier nombre premier ayant alors une particularité qu'on ne retrouve dans aucun autre).

    Accessoirement, si ton fichier est vide, alors autant l'ouvrir en mode "w"
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  8. #8
    Invité
    Invité(e)
    Par défaut Point de vue artistique
    Nom : mantabnphpy.png
Affichages : 559
Taille : 45,2 Ko

    La plénitude de la décomposition moléculaire du code, et la séparation des complexes organisés en vue de dénouer un enchevêtrement déjà bien fait. Je pense à çà.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    liste=[]
    nb=input('entrez un nombre : ')
    nb=int(nb)
    i=0
    while i<nb:
    	i+=1
    	liste.append(i)#liste=nombres de 0 à nb
    suite=[]
    for a in liste :#nombre à tester
    	casser=False
    	for avant in liste[0:a-1]:
    		if avant>a/2+a/4:
    			break
    		elif a%avant==0 and avant!=1:
    			casser=True
    			break
    	if casser==False:
    		suite.append(a)
    print("Voici la suite des nombres premiers jusqu'à",nb,":")
    présentation=""
    for convert in suite:
    	if convert!=1:
    		présentation+=" - "
    	présentation+=str(convert)
    print(présentation)
    qutter=input()
    Juste encore un pasNom : planphpy.png
Affichages : 610
Taille : 434,4 Ko
    Images attachées Images attachées  

Discussions similaires

  1. Réponses: 0
    Dernier message: 15/03/2015, 00h34
  2. Intel dévoile MinnowBoard son premier PC open source
    Par Cedric Chevalier dans le forum Raspberry Pi
    Réponses: 7
    Dernier message: 10/08/2013, 10h24
  3. Vtiger CRM Open Source et nombre users ?
    Par jiji12 dans le forum Vtiger
    Réponses: 0
    Dernier message: 14/03/2013, 14h40
  4. Réponses: 0
    Dernier message: 09/07/2010, 19h12
  5. France : le premier pays au monde pour l'adoption de l'open source ?
    Par Pierre Louis Chevalier dans le forum Licences
    Réponses: 0
    Dernier message: 23/04/2009, 15h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo