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
    Futur Membre du Club
    Femme Profil pro
    recherche d'emplois
    Inscrit en
    Juillet 2023
    Messages
    3
    D�tails du profil
    Informations personnelles :
    Sexe : Femme
    �ge : 54
    Localisation : Gr�ce

    Informations professionnelles :
    Activit� : recherche d'emplois

    Informations forums :
    Inscription : Juillet 2023
    Messages : 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
    Homme Profil pro
    Architecte technique retrait�
    Inscrit en
    Juin 2008
    Messages
    21 790
    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 790
    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
    Futur Membre du Club
    Femme Profil pro
    recherche d'emplois
    Inscrit en
    Juillet 2023
    Messages
    3
    D�tails du profil
    Informations personnelles :
    Sexe : Femme
    �ge : 54
    Localisation : Gr�ce

    Informations professionnelles :
    Activit� : recherche d'emplois

    Informations forums :
    Inscription : Juillet 2023
    Messages : 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
    Homme Profil pro
    Architecte technique retrait�
    Inscrit en
    Juin 2008
    Messages
    21 790
    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 790
    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
    Futur Membre du Club
    Femme Profil pro
    recherche d'emplois
    Inscrit en
    Juillet 2023
    Messages
    3
    D�tails du profil
    Informations personnelles :
    Sexe : Femme
    �ge : 54
    Localisation : Gr�ce

    Informations professionnelles :
    Activit� : recherche d'emplois

    Informations forums :
    Inscription : Juillet 2023
    Messages : 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, 13h51
  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, 11h22
  3. [LG]Calcul des 15 premiers nombres premiers
    Par yffick dans le forum Langage
    R�ponses: 12
    Dernier message: 18/09/2004, 15h57
  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, 20h10
  5. premier nombre premier superieur � m=10^100+1
    Par azman0101 dans le forum Math�matiques
    R�ponses: 4
    Dernier message: 17/04/2003, 04h23

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