Forum

Catégorie : Programmes
Forum : Les programmes des internautes
Vues : 793
Réponses : 7
Type : discussion
Etat : réponses autorisées

Cribleur de nombres premiers

tapenad le 09/01/2012 à 20:10
voici un prgm + ou- utile(pas a mon niveau en tout cas) qui permet de trouver tout les nombres premiers de 1 à un certains nombre,il rame un peu(beaucoup) mais il est pratique pour les premiers nombres premiers( laugh.gif ):
Code

prgm:crible
:0->N
:For(A,1,1000)       ///2000 est la limite
:If partDec(A/2)=0.5
:Then
:If parDec(A-3)[differend de]0
:Then
:For(K,2,A/2-0.5
:If parDec(A/K)=0
:N+1->N
:End
:End
:End
:If partDec(A/2)=0 et partDec(A/3)=0
:2->N
:If A=3 ou A=2
:If N=0
:Disp A
:0->N
:End




et voila... happy.gif happy.gif
azerty1 le 09/01/2012 à 20:37
Je pense qu'on pourra l'optimiser (je laisse cette tâche pour sandro winkle.gif )
Sinon l'optimiser en changeant completement le mode fonctionnement, au lieu d'afficher une table des nombres premiers jusqu'à X, on pourrait simplement demander un nombre X à l'utilisateur et regarder s'il est premier, si non, afficher ses diviseurs. Regarde dans des sujets plus anciens, ce type de prog' a été traité plus d'une fois winkle.gif
sandro le 09/01/2012 à 21:43
Bon, à la va-vite:
Code
prgm:crible
:EffVarNFor(A,1,E3        //le E des puissances de 10     ///2000 est la limite
:If partDec(A/2)=0.5
:Then
:If parDec(A   //car partdec(A)=partdec(A-3)
:Then
:For(K,2,.5A-.5
:If parDec(A/K
:N+1->N
:End
:End
:End
:If partDec(.5A)=0 et non(partDec(A/3
:2->N
:If A=3 ou A=2
:If non(N
:EffVar NDisp A
:End
azerty1 le 09/01/2012 à 22:11
Et à la fin, on ne pourrait pas remplacer
Code
:If A=3 ou A=2
:If non(N
:EffVar NDisp A


Par

Code
:If A=3 ou A=2 and non(N
:EffVar nDispA


?
linkakro le 09/01/2012 à 22:41
Le premier If (cité ci-dessus) empêche le second de travailler. Soit c'est élaboré, soit c'est une erreur de copie.
Je crois que cela correspond rigoureusement à ceci mais je n'ai rien testé.
Code
If (A=3 ou A=2) et non(N) ou (A-3 et A-2
EffVar NDisp A


Autre code immaginé sur le tas et testé sous vti.
Code
{2->L1
Disp 2
For(A,3,E3,2
If prod(fPart(A/L1
Then
A->L1(1+dim(L1
Pause A
End
L1
The K le 11/01/2012 à 13:56
Code
:0->N
:For(A,1,1000)       ///2000 est la limite
:If partDec(A/2)=0.5
:Then
:If parDec(A-3)[differend de]0
:Then
:For(K,2,A/2-0.5


Je pense que sans les deux then ça marche aussi.
je m'explique : premier if : "if partdec( etc" est vrai, la condition juste après est éxécutée. C'est un autre if. Si il est vrai, la conditon juste après est aussi éxécutée, donc on éxécute la boucle for.

J'ai raison ou pas ? bigmouth.gif
azerty1 le 11/01/2012 à 20:33
Mais alors pourquoi ne pas mettre:
Code
:0->N
:For(A,1,1000)       ///2000 est la limite
:If (partDec(.5A)=.5) et (parDec(A-3))
:Then
:For(K,2,A/2-0.5
:...            //2eme boucle For
:End
:End            //Fin du If
:...            //Suite première boucle For, exécutée dans les 2 cas.
:End
The K le 11/01/2012 à 21:35
la tu as les deux octets du "et" et "then" alors que sinon tu n'as qu'un octet avec le "if" ?