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

Calcul scientifique Python Discussion :

Calculateur de nombres premiers.


Sujet :

Calcul scientifique Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Inscrit en
    Août 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 5
    Par défaut Calculateur de nombres premiers.
    Bonjour,
    Je me suis mis un petit programme pour calculer les nombres premiers de 1 à X.
    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
    #!/usr/bin/env python
    # -*- coding: latin-1 -*-
    import time
    from math import sqrt
     
    #J'utilise psycho pour plus de rapidité
    if __name__ == '__main__':
        # Import Psyco if available
        try:
            import psyco
            psyco.full()
        except ImportError:
            pass
     
    listep=[2,3]
    n_a_tester=5
    print "\n*** PREM'S a0.10 ***\n"
    limite=input("Calculer jusqu'à : ")
    a=3
     
    def test (n_a_tester):
        n_list=len(listep)
        for i in range(n_a_tester):
     
            if n_a_tester%listep[i]==0:
                break
            elif (i+1)==n_list or n_a_tester<listep[i]**2:
                listep.append(n_a_tester)
                return n_a_tester
            elif n_a_tester%listep[i]!=0:
                i+=1
     
    start=time.ctime()
    while a<limite :
        test (n_a_tester)
        n_a_tester+=1
        a+=1
    finish=time.ctime()
     
    print "Start: ", start, "\nFinish:", finish
    # On écrit les nombres P dans le fichier listea.html
    nombre_prems=len(listep)
    nombre_prems=str(nombre_prems)
    print "Ecriture du fichier"
    fichier = open("listea.html", "w")
    fichier.write("<h3>Nombre de NP trouvés : ")
    fichier.write(nombre_prems)
    fichier.write("</h3><br />")
    fichier.write(start)
    fichier.write("<br />")
    fichier.write(finish)
    fichier.write("<br /><br/>")
    fichier.write(str(listep))
    fichier.close()
    print "Écriture terminée, fin du programme \n"
    Pour info, voici se que j'obtiens :
    Test avec 50'000'000 NP : 5m 12
    avec 100'000'000 NP :12m 51

    Alors le "problème" c'est que je n'arrive pas à utiliser les 2 processeurs même avec "Parallel Python", pourrait on m'aider SVP ?
    Et autrement comment trouvez vous mon application ? Qu'en pensez vous ?

    Merci
    ++

    Fab

  2. #2
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Tu devrais tester avec Numpy à la place de la boucle for, sur le principe du crible d'Eratosthène.
    Parallel Python, je ne connais trop, je dois dire. En revanche, sur Python normal, c'est logique, un seul thread pour l'interpréteur à la fois. En revanche, si tu passes par Numpy, ça marchera mieux

    Et tu devrais utiliser timeit pour chronométrer tes exécution, c'est fait pour ça

  3. #3
    Futur Membre du Club
    Inscrit en
    Août 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 5
    Par défaut
    Ok, merci des conseilles par contre j'ai pas vraiment compris comment utiliser Numpy...
    Et pour le crible d'Eratosthène, le script sur wikipedia est plus lent que le mien;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #!/usr/bin/env python
    def crible(tableau):
            if not tableau or tableau[0]**2 > tableau[-1]: return tableau
            return tableau[:1] + crible([i for i in tableau if i%tableau[0]])
     
    print crible(range(2,5000))
    Comme souvent avec les fonctions récursives, le code obtenu est concis mais peu efficace pour de grandes valeurs de N.

  4. #4
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Faut pas écrire le crible sous forme récursive

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    def crible(max):
      tableau = numpy.ones((max,), dtype = numpy.int32) # on construit un tableau indicateur avec des 1 pour nombre premier
      nb_max = int(math.sqrt(max))
      for i in range(2, nb_max):
        tableau[2*i-1::i] = 0
    qqch du style (non testé) pour obtenir les nombre premiers entre 1 et max (la première valeur dans le tableau correspond au nombre 1). Et après, un numpy.sum là-dessus te donne le nombre de nombres premiers. Je pense que ce sera plus rapide.

  5. #5
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Je me suis un peu amusé à cela, et ce que j'ai fait est ici: http://python.jpvweb.com/mesrecettes...mbres_premiers.

    Pour n=100,000,000, j'ai 2mn 45sec.

    A mon avis, la seule manière de faire mieux est d'enregistrer la liste des nombres premiers antérieurement trouvés et de les utiliser. En ayant un fichier disque en accès direct, la lecture est très rapide.

    Tyrtamos

  6. #6
    Futur Membre du Club
    Inscrit en
    Août 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 5
    Par défaut
    Citation Envoyé par tyrtamos Voir le message
    A mon avis, la seule manière de faire mieux est d'enregistrer la liste des nombres premiers antérieurement trouvés et de les utiliser. En ayant un fichier disque en accès direct, la lecture est très rapide.
    Ouais et faudrait partager ça avec des ordis en réseaux
    Faudrait qu'on se fasse une application open source qui fasse ça
    Bon le problème c'est qu'il faudrait programmer en assembleur je pense pour que ce soit vraiment le top...
    Enfin si quelqu'un est partant, je suis là; j'ai toujours voulu aider la science

Discussions similaires

  1. Réponses: 24
    Dernier message: 27/09/2005, 21h16
  2. [défi n°8]: premiers nombres premiers
    Par javatwister dans le forum Général JavaScript
    Réponses: 41
    Dernier message: 14/06/2005, 10h22
  3. [LG]Calcul des 15 premiers nombres premiers
    Par yffick dans le forum Langage
    Réponses: 12
    Dernier message: 18/09/2004, 14h57
  4. Cripter avec des nombres premiers
    Par clovis dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 14/04/2004, 19h10
  5. premier nombre premier superieur à m=10^100+1
    Par azman0101 dans le forum Mathématiques
    Réponses: 4
    Dernier message: 17/04/2003, 03h23

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