; Auteur : Le Soldat Inconnu
; Version de PB : 3.9
;
; Explication du programme :
; Recherche de nombre premier
; Comment savoir si un nombre est premier ?
; Un nombre est premier si on ne peut le diviser sous la forme d'entier que par lui même
; Exemple :
; 3 / 2 = 1.5 OK
; 3 / 3 = 1 OK
; 3 / 4 = 0.75 OK
;
; 4 / 2 = 2 Mauvais
;
; Donc 3 est un nombre premier et 4 n'est pas un nombre premier
#Max = 10000 ; On cherche les nombres premier entre 2 et 10000
NewList Nb.l() ; On crée une liste dans laquelle on va stocker les nombres premiers
; On ajoute 2 directement à la liste des nombres premiers
AddElement(Nb())
Nb() = 2
; En effet 2 est le seule nombre pair premier car tous les autres nombres pairs sont divisibles par 2
; Pour optimiser le code, on ne traite que les nombres impairs
; C'est pour cela que la boucle commence à 3 et a un pas de 2
; Une autre propriété permet de simplifier, la voici :
; Un nombre est premier si celui-ci n'est pas divisible sous la forme de nombre entier par un autre nombre premier de valeur inférieure
; Exemple :
; 3, 5, 7, 11, 13, 17, 19, 23, 29 sont des nombres premiers
; On va vérifier que 29 est bien premier, déjà il est impair
; 29 / 3 OK
; 29 / 5 OK
; 29 / 7 OK
; 29 / 11 OK
; 29 / 13 OK
; 29 / 17 OK
; 29 / 19 OK
; 29 / 23 OK
; On vérifie avec les autres valeurs impaires
; 29 / 9 OK
; Car 9 n'est pas premier donc est divisible, 29 / 9 = 29 / 3 * 1/ 3 donc 29 / 9 revient à tester 29 / 3
; C'est l'explication de la propriété ci dessus.
; 29 / 15 OK
; 29 / 21 OK
; 29 / 25 OK
; 29 / 27 OK
; Donc 29 est bien premier
; On vient d'économiser 5 tests pour la valeur 29, alors pour des valeurs supérieur à 1000, cette optimisation est très intéressantes
For n = 3 To #Max Step 2
NbPremier = 1
ResetList(Nb())
While NextElement(Nb()) ; pour chaque nombre premier trouvé
If n % Nb() = 0 ; On regarde si la division de la valeur par le nombre premier ne donne pas de reste
NbPremier = 0 ; Si oui, la valeur est divisible est nombre entier donc ce n'est pas un nombre premier
Break ; On quitte la boucle, il est inutile de faire les tests suivants
EndIf
Wend
If NbPremier ; Si le nombre est premier
AddElement(Nb()) ; On l'ajoute à la liste
Nb() = n
EndIf
Next
; On affiche les nombres premiers trouvés
ResetList(Nb())
While NextElement(Nb())
Debug Str(CountList(Nb())) + " = " + Str(Nb())
Wend
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?
[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Sinon tous les nombres premiers supérieurs à 2 sont donnés par 4n + 1 et 4n + 3 . Antention, même si ça donne tous les nombres premiers, ça ne donne pas que des nombres premiers car 15 = 4 * 3 + 3