Python : programme qui vérifie si un nombre est premier

Le problème exposé dans ce sujet a été résolu.

Salut à tous,

Je débute en python et l’on me demande d’écrire un programme qui vérifie si un nombre naturel est premier.

J’ai besoin de votre œil expérimenté pour vérifier que mon programme soit correct pour tous les nombres naturels.

 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
nombre = input('Écris un nombre entier positif : ')

nombre = int(nombre)

print('Le programme est en train de vérifier si ce nombre est premier...')

i = 2

while i < nombre and nombre % i != 0 :

    i = i + 1

if i == nombre :

    est_premier = True

else :

    est_premier = False


###  Suspense !  ###

if est_premier :

    print('Le nombre', nombre, 'est premier ! Fantastique !')

else :

    print('Ce n\'est pas un nombre premier.')
+1 -0

Ton code me paraît correct.

On pourrait améliorer ton code ainsi.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
nombre = input('Écris un nombre entier positif : ')

nombre = int(nombre)

print('Le programme est en train de vérifier si ce nombre est premier...')

i = 2

while i < nombre and nombre % i != 0 :

    i = i + 1

if i == nombre :

    print('Le nombre', nombre, 'est premier ! Fantastique !')

else :

    print('Ce n\'est pas un nombre premier.')

En effet, est_premier est toujours faux sauf lors de la dernière itération de i pour un nombre premier. Ce cas est unique.

+0 -0

Tu peux aussi améliorer la lisibilité de ton code, en appliquant les conventions de style utilisées par la plupart des programmeurs Python (ce qu’on appelle PEP8).

Au passage, j’ai échangé les guillemets simples pour des guillemets doubles, ce qui t’évite d’avoir à échapper les apostrophes.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
nombre = input("Écris un nombre entier positif : ")
nombre = int(nombre)

print("Le programme est en train de vérifier si ce nombre est premier...")

i = 2
while i < nombre and nombre % i != 0:
    i = i + 1

if i == nombre:
    print("Le nombre", nombre, "est premier ! Fantastique !")
else:
    print("Ce n'est pas un nombre premier.")

Cela concerne moins Python en lui-même, mais dans la vraie vie, tu aurais probablement envie d’utiliser un algorithme plus efficace.

+1 -0

Tu peux aussi améliorer la lisibilité de ton code, en appliquant les conventions de style utilisées par la plupart des programmeurs Python (ce qu’on appelle PEP8).

J’ignorais que de telles conventions existaient, merci pour la référence !

En java, de telles conventions existent ?

J’aurais tendance à écrire mon code ainsi en Java :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
int nombre = 5;

while (condition)
{
    // faire un truc
}

if (cond)
{
    // faire un truc
}
else
{
    // faire un truc
}

Ceci me rappel un exemple dans le tutoriel officiel où il y est fait démonstration de l’instruction break et de la clause else des boucles, je le trouve très instructif aussi.

 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
https://docs.python.org/3/tutorial/controlflow.html#break-and-continue-statements-and-else-clauses-on-loops

Tout cela manque un peu d’optimisation.
En effet, si un nombre N n’est pas premier,
il est le produit d’au moins deux nombres inférieurs ou égaux à la racine carrée de N.

Bien sûr, ça peu être couteux d’extraire une racine carrée.
En tout état de cause, on peut prendre comme limite la moitié de N, soit N//2.

par exemple :
for x in range(2, n//2):

+0 -0

On peut citer plusieurs améliorations sur un test de primalité :

  • ça ne sert à rien de tester la primalité sur les nombres pairs (à part 2). L’idée est donc d’avoir un pas de 2 (i += 2 au lieu de i+=1). On peut aussi adapter pour enlever également les multiples de 3 (pas = 6-pas; i += pas) ;
  • pour reprendre mon VDD, on peut s’arrêter à la racine carrée de i, qu’on calcule une seule fois donc c’est pas bien long à calculer ;
  • Si l’objectif est d’avoir une liste de nombres premiers, il y a d’autres améliorations mais ça n’a pas l’air d’être ton cas.

Enfin, on peut également mentionner le test de Rabin-Miller, mais bon, c’est hyper compliqué, pas forcément ce qui est recherché ici. :)

Tu peux aussi essayer celui-ci .On sait que le modulo de tout nombre pair est égal à zéro donc si le nombre choisi est impair alors c’est un nombre premier 😏

try:

 nbr=int(input("saisir un nombre entier: "))


 if nbr%2==0 :
      print("le nombre ",nbr,"n\'est pas premier")
 else:
       print("le nombre ",nbr," est premier")

#ex: 7 ,29,13 except: print("erreur de saisie")

Bonjour j’ai un programme à completer mais je ne sais pas par quoi vu qu’il n’y en a aucun qui lui resemble, si quelqu’un peut m’aider je prend volontier.

def parfait(N): S = O U = 2*4N-2N for k in range (1,…): # je suppose que c’est de (1,N+1) if U%K ==….: S=……. if S == ……..: reponse = 'parfait' else: reponse = 'pas parfait' return parfait

Ce serait mieux si tu précisais le but de ton code. En fait, il ne s’agit pas d’un programme, mais d"une fonction Python, ce qui n’est pas la même chose. Je me demande pourquoi cette fonction de nomme "parfait".
Par ailleurs, ton code n’est pas facile à lire. Essaye de le présenter de manière lisible.

+0 -0
Ce sujet est verrouillé.