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 :

nombres premiers et apprendre à coder [Python 3.X]


Sujet :

Calcul scientifique Python

  1. #1
    Candidat au Club
    Femme Profil pro
    recherche d'emplois
    Inscrit en
    Juillet 2023
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : Grèce

    Informations professionnelles :
    Activité : recherche d'emplois

    Informations forums :
    Inscription : Juillet 2023
    Messages : 3
    Points : 3
    Points
    3
    Par défaut nombres premiers et apprendre à coder
    Bonjour,
    je suis en train d'apprendre Python, et j'ai créé un petit programme qui me permet de trouver les nombres premiers.
    Je sais qu'il existe déjà une fonction math pour ça. Mais, je veux faire ça par moi-même pour apprendre et comprendre.
    Je voulais savoir si il existe un moyen de remplacer ma liste "liste_nb_prem" par un fichier "fichier_nb_prem" qui ferait la même chose que la liste.
    Est-ce que vous pourriez me mettre sur la piste.
    Et que pensez-vous de mon programme/code.
    merci de votre aide

    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
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    """Calcule les nombres premiers
    Usage:
    ======
        6k1_nombres_premiers.py
        - nb_de: entrée utilisateur premier nombre à chercher
        - nb_jusque: entrée utilisateur dernier nombre à chercher
        recherche des nombres premiers en utilisant différents filtres  
        
    """
    __authors__ = ("Christelle Triboulot")
    __copyright__ = "Triboulot"
    __date__ = "2023-07-02"
    __version__= "1.0.4 version en évolution"
     
    import time
    import random
    from typing import List
     
    liste_nb_prem: List[int] = []
    start_time = time.time()
     
    def filtre_2_3_5_7(nb_de):
        """
        filtre pour éliminer les multiples de 2, 3, 5, 7,
        pour permettre d'utiliser les autres filtres sans résultats non voulu.
        Pour le 5 et le sept, c'est juste une fantaisie de ma part.
        Entre nb_de
        Sortie : True False
        """
        return (nb_de % 2 != 0 and nb_de % 3 != 0
                and nb_de % 5 != 0 and nb_de % 7 != 0)
     
    def filtre_6k1(nb_de):
        """
        Teste si un nombre est de forme 6k+-1
        où k est un entier naturel.
        Paramètres
        .........
        nb : int - nombre à tester
        retourne : bool - True si le nombre est de forme 6k+-1
        False sinon.
        """
        return (nb_de % 6 == 1 or nb_de % 6 == 5)
     
    def filtre_fermat(nb_de):
        """
        Test probabiliste basé sur le petit théorème de Fermat.
        Paramètres
        .........
        nb : int - nombre à tester
        retourne : bool - True si le nombre est probablement premier
        False sinon.
        """
        for x in range(3): #pour réduire le nombre de non-premier, répéter 3 fois
            a = random.randint(2, nb_de-1)
            if pow(a, nb_de-1, nb_de) != 1:
                return False
        return True
     
    def filtre_erastosthenes(nb_de):
        """
        divise avec tous les nombres pemiers pour voir se le nombre est premier.
        Long, mais trouve tous les nombres premiers
        Paramètres
        .........
        nb : int - nombre à tester
        retourne : bool - True si le nombre est premier
        False sinon.
        """
        for i in liste_nb_prem:
            if i > pow(nb_de, 1/2) + 1:
                return True
            elif nb_de % i == 0:
                return False
            elif i > pow(nb_de, 1/2):
                return True
        return True
     
    nb_de = int(input("de : "))   
    nb_jusque = int(input(". Jusqu'à : "))
    dec = 0
    decompte = 0
    par_1000000=0
     
    while nb_de <= nb_jusque:
    #    if par_1000000%1000000==0:    #juste pour moi
    #        print(par_1000000)
        if nb_de==2: # Juste pour mettre 2 dans liste_nb_prem... Vois si plus efficace
            liste_nb_prem.append(2)
            print(nb_de)
        if nb_de > 2: # passe par les différents filtres pour réduire avant le filtre d'Erastosthens... Voir si autres filtres
            if ((nb_de in [2, 3, 5, 7]) or (filtre_6k1(nb_de)
                and filtre_fermat(nb_de) and filtre_2_3_5_7(nb_de))):
                dec += 1
                if filtre_erastosthenes(nb_de):
                    liste_nb_prem.append(nb_de)
                    print(nb_de)
                    decompte += 1
        nb_de += 1
        par_1000000+=1
     
    print("Il y a :",dec+1, "nombres premiers trouvés avant le dernier filtre")
    print("Il y a :",decompte+1, "nombres premiers trouvés")
    print(liste_nb_prem)
    # Temps passé sur le programme
    end_time = time.time()
    elapsed_time = end_time - start_time
    print("Le temps d'exécution du code est : {:.6f} secondes".format(elapsed_time))

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par Natell Voir le message
    Je voulais savoir si il existe un moyen de remplacer ma liste "liste_nb_prem" par un fichier "fichier_nb_prem" qui ferait la même chose que la liste.
    Le plus simple serait de lire le fichier avant les calculs (pour créer la liste initiale de nombres premiers) et de le mettre à jour avant la sortie du programme. Regardez ce qu'on peut faire avec le module JSON côté format du fichier et sérialisation.

    Reste que à titre d'exercice sur les fichiers, fabriquer les fonctions/primitives qui permettent de le faire fonctionner comme une liste est sans doute intéressant (l'intérêt est ce que vous allez apprendre en le faisant pas sur le résultat).

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

  3. #3
    Candidat au Club
    Femme Profil pro
    recherche d'emplois
    Inscrit en
    Juillet 2023
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : Grèce

    Informations professionnelles :
    Activité : recherche d'emplois

    Informations forums :
    Inscription : Juillet 2023
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Merci wiztricks.
    Voici mon nouveau code qui me permet maintenant d'enregistrer mes nombres premiers et de demarrer avec les anciens nombres premiers trouvés.
    Maintenant je cherche à pouvoir travailler sur plusieurs processeurs pour que le programme soit plus rapide.

    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
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    """Calcule les nombres premiers
    Usage:
    ======
        6k1_nombres_premiers.py
        - nb_de: entrée utilisateur premier nombre à chercher
        - nb_jusque: entrée utilisateur dernier nombre à chercher
        recherche des nombres premiers en utilisant différents filtres   
    """
    __authors__ = ("Christelle Triboulot")
    __copyright__ = "Triboulot"
    __date__ = "2023-07-02"
    __version__= "1.0.4 version en évolution"
     
    import time
    import random
    from typing import List
     
    liste_nb_prem_fichier: List[int] = []
    start_time = time.time()
     
    def filtre_2_3_5_7(nb_de):
        """
        filtre pour éliminer les multiples de 2, 3, 5, 7,
        pour permettre d'utiliser les autres filtres sans résultats non voulu.
        Pour le 5 et le sept, c'est juste une fantaisie de ma part.
        Entre nb_de
        Sortie : True False
        """
        return (nb_de % 2 != 0 and nb_de % 3 != 0
                and nb_de % 5 != 0 and nb_de % 7 != 0)
     
    def filtre_6k1(nb_de):
        """
        Teste si un nombre est de forme 6k+-1
        où k est un entier naturel.
        Paramètres
        .........
        nb : int - nombre à tester
        retourne : bool - True si le nombre est de forme 6k+-1
        False sinon.
        """
        return (nb_de % 6 == 1 or nb_de % 6 == 5)
     
    def filtre_fermat(nb_de):
        """
        Test probabiliste basé sur le petit théorème de Fermat.
        Paramètres
        .........
        nb : int - nombre à tester
        retourne : bool - True si le nombre est probablement premier
        False sinon.
        """
        for x in range(3): #pour réduire le nombre de non-premier, répéter 3 fois
            a = random.randint(2, nb_de-1)
            if pow(a, nb_de-1, nb_de) != 1:
                return False
        return True
     
    def filtre_erastosthenes(nb_de):
        """
        divise avec tous les nombres pemiers pour voir se le nombre est premier.
        Long, mais trouve tous les nombres premiers
        Paramètres
        .........
        nb : int - nombre à tester
        retourne : bool - True si le nombre est premier
        False sinon.
        """
        for i in liste_nb_prem_fichier:
            if i > pow(nb_de, 1/2) + 1:
                return True
            elif nb_de % i == 0:
                return False
            elif i > pow(nb_de, 1/2):
                return True
        return True
    dec = 0
    decompte = 0
    par_1000000=0
     
    # Lire le fichier "nombres_prem.txt" et stocker les nombres premiers dans une liste
    with open("nombres_prem.txt", "r") as f:
        for line in f.readlines():
            liste_nb_prem_fichier.append(int(line))
     
    # Récupérer le dernier nombre premier trouvé
    dernier_nb_prem = liste_nb_prem_fichier[-1]
     
    # Ouvrir un fichier texte en mode append
    with open("nombres_prem.txt", "a") as f:
        nb_de = dernier_nb_prem + 1 # commencer à partir du dernier nombre premier trouvé + 1
        print(nb_de-1)    
        nb_jusque = int(input(". Jusqu'à : "))
     
        while nb_de <= nb_jusque:
            #if par_1000000%1000000==0: #juste pour moi
            #   print(par_1000000)
            if nb_de==2: # Juste pour mettre 2 dans liste_nb_prem_fichier... Vois si plus efficace
                liste_nb_prem_fichier.append(2)
                f.write(str(nb_de) + "\n")
                print(nb_de)
            if nb_de > 2: # passe par les différents filtres pour réduire avant le filtre d'Erastosthens... Voir si autres filtres
                if ((nb_de in [2, 3, 5, 7]) or (filtre_6k1(nb_de)
                    and filtre_fermat(nb_de) and filtre_2_3_5_7(nb_de))):
                    dec += 1
                    if filtre_erastosthenes(nb_de):
                        liste_nb_prem_fichier.append(nb_de)
                        f.write(str(nb_de) + "\n")
                        print(nb_de)
                        decompte += 1
            nb_de += 1
            par_1000000+=1
     
        f.close()  
     
    print("Il y a :",dec+1, "nombres premiers trouvés avant le dernier filtre")
    print("Il y a :",decompte+1, "nombres premiers trouvés")
     
    # Temps passé sur le programme
    end_time = time.time()
    elapsed_time = end_time - start_time
    print("Le temps d'exécution du code est : {:.6f} secondes".format(elapsed_time))

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par Natell Voir le message
    Maintenant je cherche à pouvoir travailler sur plusieurs processeurs pour que le programme soit plus rapide.
    Si la question initiale est , voir le bouton pour clore la discussion.
    Et pour démarrer sur un nouveau sujet (travailler sur plusieurs processeurs), ouvrir une nouvelle discussion, montrer ce que vous avez essayé et décrire les difficultés rencontrées...
    note: faire travailler plusieurs processeurs ne se fait pas d'un claquement de doigts.

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

  5. #5
    Candidat au Club
    Femme Profil pro
    recherche d'emplois
    Inscrit en
    Juillet 2023
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : Grèce

    Informations professionnelles :
    Activité : recherche d'emplois

    Informations forums :
    Inscription : Juillet 2023
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    merci pour votre aide. je marque résolut

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Python 3.X] Coder un algorithme qui détermine les nombres premiers.
    Par Gwynbleidd dans le forum Calcul scientifique
    Réponses: 6
    Dernier message: 11/02/2017, 12h51
  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