Nombres premiers

Informations pour bien débuter en PureBasic
Avatar de l’utilisateur
SPH
Messages : 4945
Inscription : mer. 09/nov./2005 9:53

Nombres premiers

Message par SPH »

Trouver les nombres premiers tres rapidement (il n'y a pas plus rapide) :

Code : Tout sélectionner

cmb=10000 ; combien de nombre premier on souhaite
Dim np(cmb); banque a nombre premier
nb.q=3 ; nb=3. c'est obligatoire.
np(1)=3; obligatoire aussi

temps=GetTickCount_() ; chronometre a zero

Repeat
i=1
racine=Sqr(nb)
;;;;;
While np(i)<=racine ; tant qu'on a pas testé jusqu'a la racine carré de NB
If nb%np(i)=0 ; on teste la division par les nombres premiers deja trouvé et mis en banque
Goto NP_suite ; on a trouvé un nombre non premier alors on va a la suite
EndIf
i+1
Wend
;;;;;
np(0)+1 ; on a trouvé un nombre premier alors on augmente np(0)
np(np(0))=nb ; et on ecris ce nombre premier en banque
;Debug nb
;;;;;
NP_suite:
nb+2 ; comme on ne teste que les nombres impairs, on saute de 2
Until np(0)=cmb ; on s'arretera quand on aura le compte de nombres premiers
np(0)=2 ; on ecris au debut de la banque le seul nombre premier pair


temps=GetTickCount_()-temps ; on stoppe le chronometre
MessageRequester("Erreur", Str(temps)+" ms")


For i=0 To cmb
  Debug np(i) ; on liste nos nombres premiers
Next

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: Nombres premiers

Message par Le Soldat Inconnu »

avec ta méthode, pour trouver 1000000 de nombres premiers, je suis 9100 ms, et avec l'algo de ce sujet :
http://www.purebasic.fr/french/viewtopi ... =3&t=11883
je suis à 390 ms.

Donc si, il y a 23 fois plus rapide :mrgreen:
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)]
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: Nombres premiers

Message par graph100 »

j'ai l'impression que SPH à changé :mrgreen:
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Avatar de l’utilisateur
SPH
Messages : 4945
Inscription : mer. 09/nov./2005 9:53

Re: Nombres premiers

Message par SPH »

Je suis estomaqué. En effet, il y a une routine plus rapide que la mienne. Je ne la comprend meme pas mais elle fonctionne. J'etudierais ca attentivement.
Désolé pour le derangement...

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
dayvid
Messages : 1242
Inscription : mer. 11/nov./2009 18:17
Localisation : Poitiers (Vienne)

Re: Nombres premiers

Message par dayvid »

Vous pouvez vous foutre de ma poire mais

C'est quoi un nombre premier :mrgreen:
La vie, C'est comme, Une boitte, De startis, On en voie, De toutes, Les couleurs !

Mon forum http://purebasic.forumphp3.com/index.php
Avatar de l’utilisateur
SPH
Messages : 4945
Inscription : mer. 09/nov./2005 9:53

Re: Nombres premiers

Message par SPH »

dayvid a écrit :Vous pouvez vous foutre de ma poire mais

C'est quoi un nombre premier :mrgreen:
C'est un nombre qui ne se divise que par 1 et lui meme.
Ces nombres sont 2, 3, 5, 7, 11, 13...
11 est divisible par 1 et 11 et rien d'autre.
15 est divisible par 1, 15, mais aussi 3 et 5.

Je profite de cette reponse pour reafirmer ma stupefaction devant la routine qui me bat. Je ne la comprend pas mais je ne demande qu'a ca !! Si quelqu'un pouvait me l'expliquer, je ne suis pas contre... :|

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: Nombres premiers

Message par graph100 »

alors, si je comprend bien l'algo :

Code : Tout sélectionner

Define num.i = 15485864
Define sqrnum.i = Sqr(num)+1
Dim PrimeFlags.b(num)
Dim Primes.i(num)
Define tim.i,count.i = 2

Define mill.i = ElapsedMilliseconds()
;

For x = 3 To sqrnum Step 2
   If PrimeFlags(x) = #False
      Primes(count) = x
      count+1   
      
      tim = x + x
      Repeat
         PrimeFlags(tim) = #True
         tim + x
      Until tim >= num
   EndIf
Next
;Local count:Int

Primes(1) = 2
For y = x To num Step 2
   If PrimeFlags(y) = #False
      Primes(count) = y
      count+1   
   EndIf
Next
mill = ElapsedMilliseconds()-mill
;
MessageRequester("",StrF(mill/1000.0) +" seconds "+ Str(count)+" primes found!")
Dans cette partie :

Code : Tout sélectionner

For x = 3 To sqrnum Step 2
   If PrimeFlags(x) = #False
      Primes(count) = x
      count+1   
      
      tim = x + x
      Repeat
         PrimeFlags(tim) = #True
         tim + x
      Until tim >= num
   EndIf
Next
L'algorithme met les flags de tout les multiples du nombre premier actuel dans le tableau PrimeFlags() à #True
Puis la fin du code met tout les nb premiers dans un tableau en regardant les flags.

En explication en français ça donne :

On initialise un tableau dont l'index des cases représente tout les nombres.
PrimeFlag(0), PrimeFlag(1), PrimeFlag(2), etc .... jusqu'à PrimeFlag(15485864)

il me semble qu'il y a 1 000 000 nb 1er avant 15485864.

Ensuite, on définit sqrnum qui est la racine du nombre maximum que nous regardons.
car sqrnum * sqrnum n'est forcément pas un nb 1er, et tous les multiples de (sqrnum + 1) sont déjà multiples de nb inférieurs à sqrnum, donc déjà tagés comme non premier.

l'algorithme part de 3 et progresse de 2 en 2, puisque tout les pairs ne sont pas premiers.
Donc, il prend le nombre 'x' actuel,
On regarde si x est tagé premier ou non, puis on marque tout les multiples de x (en faisant tim = x + x, puis tim = tim + x ) comme des nombres non premiers (dans l'algo c'est la valeur #true :mrgreen: attention c'est trompeur).

Puis on passe au nombre impair suivant, etc...
Comme tout les multiples de chaque nombre premiers est marqué comme non premier, bah il suffit de relevé tout les tag #false du tableau, et on a la liste des nombres premiers.

Ce qui est bien, c'est que chaque nombre n'est traité qu'une seule fois, entrainant ainsi un gain de temps énorme ;)

Voili voilou, j'espère que c'est clair maintenant :D
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Avatar de l’utilisateur
SPH
Messages : 4945
Inscription : mer. 09/nov./2005 9:53

Re: Nombres premiers

Message par SPH »

Oui, j'ai compris que c'etait le crible d'eratostene :mrgreen:

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
dayvid
Messages : 1242
Inscription : mer. 11/nov./2009 18:17
Localisation : Poitiers (Vienne)

Re: Nombres premiers

Message par dayvid »

C'est un nombre qui ne se divise que par 1 et lui meme.
Ces nombres sont 2, 3, 5, 7, 11, 13...
11 est divisible par 1 et 11 et rien d'autre.
15 est divisible par 1, 15, mais aussi 3 et 5.
Merci SPH :)

Cependent je n'est pas saisie la chose 8O
C'est un nombre qui ne se divise que par 1 et lui meme.
Si je fait: 4/1 ou 4/4, sa donne bien 4 et 1, tu ne veut pas êtyre plus clair stp :)
je suis dure de la feuille :wink:
La vie, C'est comme, Une boitte, De startis, On en voie, De toutes, Les couleurs !

Mon forum http://purebasic.forumphp3.com/index.php
Avatar de l’utilisateur
SPH
Messages : 4945
Inscription : mer. 09/nov./2005 9:53

Re: Nombres premiers

Message par SPH »

dayvid a écrit :Si je fait: 4/1 ou 4/4, sa donne bien 4 et 1, tu ne veut pas êtyre plus clair stp :)
je suis dure de la feuille :wink:
Oui mais 4 est aussi divisible par 2; ce qui en fait un nombre non premier

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
dayvid
Messages : 1242
Inscription : mer. 11/nov./2009 18:17
Localisation : Poitiers (Vienne)

Re: Nombres premiers

Message par dayvid »

Ouais, bref moi la je laisse tomber :oops:

Et pis en plus ça sert a rien ça :roll:
j'y comprend rien moi a ce truc là :(

Mais ce n'est pas grave, merci beaucoup quand même de m'avoir expliquer :D
La vie, C'est comme, Une boitte, De startis, On en voie, De toutes, Les couleurs !

Mon forum http://purebasic.forumphp3.com/index.php
anissa
Messages : 136
Inscription : mer. 13/oct./2010 15:43

Re: Nombres premiers

Message par anissa »

@Dayvid

Eh toi! tu es sérieux? Tu n'as pas fait la sixième? D'ailleurs si je me trompe pas, c'est en primaire qu'on apprend les nbres premiers... tu sais comment résoudre une équation de second degré?
dayvid
Messages : 1242
Inscription : mer. 11/nov./2009 18:17
Localisation : Poitiers (Vienne)

Re: Nombres premiers

Message par dayvid »

Non, je ne sais pas faire tous ça :wink:

Je rigole pas hein, j'ai eu une scolarité minable
car je tenais pas en place 5 mn :(

ça me hante encore aujourd'hui :(
je sais:

Lire, écrire (enfin presque :mrgreen: ), compter
et p'tetre d'autre trucs mais bon voilà

Je ne sais pas faire de mathématique avancer

les opérations de base, j'ai appris a l'es faire même si ça ne sert plus a grande choses de nos temps
on aurais jamais du inventé la calculatrice :lol:

Tu veut savoir autre chose ?
La vie, C'est comme, Une boitte, De startis, On en voie, De toutes, Les couleurs !

Mon forum http://purebasic.forumphp3.com/index.php
Avatar de l’utilisateur
Atlante
Messages : 337
Inscription : mer. 29/juin/2011 18:35
Localisation : Paris

Re: Nombres premiers

Message par Atlante »

Pour ta compréhension :
http://fr.wikipedia.org/wiki/Nombre_premier
cordialement.
Atlante
Modérateur
Config : Intel I5 4670K, Nvidia Geforce GTX 1060, 16go RAM, SSD 256go, DD 2000go
dayvid
Messages : 1242
Inscription : mer. 11/nov./2009 18:17
Localisation : Poitiers (Vienne)

Re: Nombres premiers

Message par dayvid »

Ouais, cool merci :)
La vie, C'est comme, Une boitte, De startis, On en voie, De toutes, Les couleurs !

Mon forum http://purebasic.forumphp3.com/index.php
Répondre