Page 1 sur 1

Nombres premiers

Publié : jeu. 23/juin/2011 14:16
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

Re: Nombres premiers

Publié : jeu. 23/juin/2011 19:09
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:

Re: Nombres premiers

Publié : jeu. 23/juin/2011 19:28
par graph100
j'ai l'impression que SPH à changé :mrgreen:

Re: Nombres premiers

Publié : jeu. 23/juin/2011 19:47
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...

Re: Nombres premiers

Publié : sam. 25/juin/2011 16:02
par dayvid
Vous pouvez vous foutre de ma poire mais

C'est quoi un nombre premier :mrgreen:

Re: Nombres premiers

Publié : sam. 25/juin/2011 16:06
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... :|

Re: Nombres premiers

Publié : dim. 26/juin/2011 18:06
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

Re: Nombres premiers

Publié : dim. 26/juin/2011 21:07
par SPH
Oui, j'ai compris que c'etait le crible d'eratostene :mrgreen:

Re: Nombres premiers

Publié : mer. 29/juin/2011 14:21
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:

Re: Nombres premiers

Publié : mer. 29/juin/2011 15:09
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

Re: Nombres premiers

Publié : ven. 01/juil./2011 12:41
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

Re: Nombres premiers

Publié : sam. 02/juil./2011 14:43
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é?

Re: Nombres premiers

Publié : sam. 02/juil./2011 16:33
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 ?

Re: Nombres premiers

Publié : sam. 02/juil./2011 22:47
par Atlante
Pour ta compréhension :
http://fr.wikipedia.org/wiki/Nombre_premier
cordialement.
Atlante

Re: Nombres premiers

Publié : mar. 05/juil./2011 14:17
par dayvid
Ouais, cool merci :)