Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

NOMBRE PREMIER OU PAS ?


Information sur la source

Catégorie :Maths Niveau : Débutant Date de création : 10/12/2002 Date de mise à jour : 10/12/2002 16:11:01 Vu : 2 293

Note :
6,67 / 10 - par 3 personnes
6,67 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (16)
Ajouter un commentaire et/ou une note

Description

A force de voir des sources pour calculer les nb premiers, avec des tech de plus en plus STAGE voici une petite source fait en 2 min qui montre qu'on peut faire ca facilement.  
 

Source

  • Private Function isPremier(ByVal n As Long) As Boolean
  • Dim i As Long
  • Dim racine2n As Long
  • 'CAS DE BOARD
  • If n = 0 Or n = 1 Then isPremier = False: Exit Function
  • 'SI UN POYO MET UN NOMBRE NEGATIF
  • If n < 0 Then n = n * -1
  • 'ON FAIT LE TEST A CAUSE DU 2
  • 'VU QUE LA BOUCLE FOR COMMENCE A 3
  • If n Mod 2 = 0 Then
  • If n <> 2 Then
  • isPremier = False
  • Exit Function
  • Else
  • isPremier = True
  • Exit Function
  • End If
  • End If
  • 'LA RACINE CARREE DE N
  • racine2n = Sqr(n)
  • 'LA BOUCLE DE TESTS
  • For i = 3 To racine2n Step 2
  • If n Mod i = 0 Then
  • isPremier = False
  • Exit Function
  • End If
  • Next i
  • 'SI ON ARRIVE ICI C'EST QUE LE NOMBRE EST PREMIER (SAUF 2)
  • isPremier = True
  • End Function
Private Function isPremier(ByVal n As Long) As Boolean
    Dim i           As Long
    Dim racine2n    As Long
    
    'CAS DE BOARD
    If n = 0 Or n = 1 Then isPremier = False: Exit Function
    
    'SI UN POYO MET UN NOMBRE NEGATIF
    If n < 0 Then n = n * -1
    
    'ON FAIT LE TEST A CAUSE DU 2
    'VU QUE LA BOUCLE FOR COMMENCE A 3
    If n Mod 2 = 0 Then
        If n <> 2 Then
            isPremier = False
            Exit Function
        Else
            isPremier = True
            Exit Function
        End If
    End If
    
    'LA RACINE CARREE DE N
    racine2n = Sqr(n)
    
    'LA BOUCLE DE TESTS
    For i = 3 To racine2n Step 2
        If n Mod i = 0 Then
            isPremier = False
            Exit Function
        End If
    Next i
    
    'SI ON ARRIVE ICI C'EST QUE LE NOMBRE EST PREMIER (SAUF 2)
    isPremier = True
End Function
  

Conclusion

EDIT 10/12/2002 a 15:31
---Deja désole pour le triple poste :p
---Si tu passes par la Nix stp efface les 2 de trop :p

---je voulais encore dire que la version aKheNathOn
---du For i = 2 .... est bugée :p c'est pour ca que j'ai fait le IF
---bhen vi le nb 2 est premier :p mais la tu vas essayer de faire
---2 mod 2 forcement = 0 donc selon toi FAUX enfin SELON VB :p
---pour les nb &gt; que 2 ca marche  
 

Commentaires et avis

signaler à un administrateur
Commentaire de moustachu le 10/12/2002 14:14:45

Ah, enfin

signaler à un administrateur
Commentaire de aKheNathOn le 10/12/2002 14:20:52

En effet c'est bcp plus simple mais ça doit être plus court :

Private Function isPremier(ByVal n As Long) As Boolean
        Dim i as Long
        If n = 1 or n = 0 Then Exit Function
        'LA BOUCLE DE TESTS
        For i = 2 To int(Sqr(n))+1
                If n Mod i = 0 Then Exit Function
        Next i
        isPremier = True
End Function

Enfin tout ça pour te demander pk avoir écrit plein de code autour ...  comme
        'SI UN POYO MET UN NOMBRE NEGATIF
        If n &lt; 0 Then n = n * -1

Au fait ... un boolean non initializé en vb prendra tj la valeur par défault False ... c'est bon à savoir non (Un integer ou Numérique prendra 0 et un String sera Empty) ?



signaler à un administrateur
Commentaire de Proger le 10/12/2002 14:42:41

Yo aKh, ça va ;)
juste trois bricoles dans l'exemple du commentaire ci-dessus :
if n = 1 or n = 0 : remplace par if n &gt; -3 and n &lt; 3 (ainsi les négatifs passent aussi)
ajoute : if n mod 2 = 0 then exit function '(on sort si c'est pair)
for i = 2 to .... &gt; for i = 3 to int(sqr(n)+1) step 2 '(pour sauter les nombres pair)

ainsi ça va 2 fois plus vite :) (quoique, trouver que 2147483647 est pair ne dure que 3,2ms avec l'algo aKh, optimisé on obtient 1,6ms, c'est un peu de l'enc... de drosophiles)

et on peut diviser les nombres négatifs. en plus, faire n = n * -1 pour inverser le signe, c'est plus evident (et économe) de faire n = abs(n) .

Pitié les gars, taper "Premier" dans la case "chercher" de vbfrance, y'a deja 20 sources là-dessus...

signaler à un administrateur
Commentaire de 6Po le 10/12/2002 15:24:47

Pour tout le monde....
Je crée pas cette source dans un but tech mais seulement pour eviter que tous les jours un mec nous postes ca sources isPremier avec 50 linges de code. Je sais qu'il y en a deja plein mais ceux que j'ai vu me font peur et je pense au mec qui comprend rien.


Pour Proger :
=========
LOL le and en VB :p arff ! Sorry....

2e chose le INT --&gt; c'est en 16 bit en VB or les OS sont en 32 Bit le LONG et en 32 BIT le CPU calcul plus vite dans son propre nb de BIT.
Assembleur oblige.
Désolé pour ceux qui aurait Windope Serveur 64 Bits :p

pour l'optimisation n=1 ou n=0
Comme j'ai dit j'ai fait ca en 2min pour répondre a un autre qui avait posté une source avec des test en STING pour savoir si son nombre etait a virgule ou pas...
donc j'ai pas regarde dans les details

1.6 ms ? ummm ... je sais pas moi j'ai un disque de 1Ghz en RAM pure :p (Virutal disque) je suis sur le serveur :p
donc ca tourne a 0 aussi bien une que l'autre

Pour aKh :p
========
Le +1 sert a rien ca va encore faire gagné au moins 0.01 ms a Proger :p

Le true et le false ca me vient du C. et moi faire un exit function sans fait isPremier = false c'est pas bon, c'est pas tres propre
Quand au string a EMPTY et le numerique a 0 je trouve ca idiot et j'ai pas testé
mais je crois qu'en .Net c'est plus comme ca...

Bhen immagine tu crée un tableau de 500 elements

en VB.net
DIM tab[500] as integer  //en plus en VB.nET c'est de 0 à 499 et non de 0à500 :p
DIM i
pour faire juste dessous
for i = 0 to 499
tab[i] = i
next i

vb6 va te faire un
DIM tab[500] as integer //0 à 500

  -- VB
     i = 0
     for i = 0 to 500
      tab(i) = 0
     next i

toi tu crées ton i
dim i
     -- vb
      i = 0

for i = 0 to 500
   tab(i) = i
next i

Tu vois une optimisation TOI ?
Ha moi pas....

Voila sinon je vous conseil d'aller joue à Pacman ou a prophecy engine :p
ici ---&gt; www.dreamersteam.org

signaler à un administrateur
Commentaire de 6Po le 10/12/2002 15:25:13

Pour tout le monde....
Je crée pas cette source dans un but tech mais seulement pour eviter que tous les jours un mec nous postes ca sources isPremier avec 50 linges de code. Je sais qu'il y en a deja plein mais ceux que j'ai vu me font peur et je pense au mec qui comprend rien.


Pour Proger :
=========
LOL le and en VB :p arff ! Sorry....

2e chose le INT --&gt; c'est en 16 bit en VB or les OS sont en 32 Bit le LONG et en 32 BIT le CPU calcul plus vite dans son propre nb de BIT.
Assembleur oblige.
Désolé pour ceux qui aurait Windope Serveur 64 Bits :p

pour l'optimisation n=1 ou n=0
Comme j'ai dit j'ai fait ca en 2min pour répondre a un autre qui avait posté une source avec des test en STING pour savoir si son nombre etait a virgule ou pas...
donc j'ai pas regarde dans les details

1.6 ms ? ummm ... je sais pas moi j'ai un disque de 1Ghz en RAM pure :p (Virutal disque) je suis sur le serveur :p
donc ca tourne a 0 aussi bien une que l'autre

Pour aKh :p
========
Le +1 sert a rien ca va encore faire gagné au moins 0.01 ms a Proger :p

Le true et le false ca me vient du C. et moi faire un exit function sans fait isPremier = false c'est pas bon, c'est pas tres propre
Quand au string a EMPTY et le numerique a 0 je trouve ca idiot et j'ai pas testé
mais je crois qu'en .Net c'est plus comme ca...

Bhen immagine tu crée un tableau de 500 elements

en VB.net
DIM tab[500] as integer  //en plus en VB.nET c'est de 0 à 499 et non de 0à500 :p
DIM i
pour faire juste dessous
for i = 0 to 499
tab[i] = i
next i

vb6 va te faire un
DIM tab[500] as integer //0 à 500

  -- VB
     i = 0
     for i = 0 to 500
      tab(i) = 0
     next i

toi tu crées ton i
dim i
     -- vb
      i = 0

for i = 0 to 500
   tab(i) = i
next i

Tu vois une optimisation TOI ?
Ha moi pas....

Voila sinon je vous conseil d'aller joue à Pacman ou a prophecy engine :p
ici ---&gt; www.dreamersteam.org

signaler à un administrateur
Commentaire de 6Po le 10/12/2002 15:25:20

Pour tout le monde....
Je crée pas cette source dans un but tech mais seulement pour eviter que tous les jours un mec nous postes ca sources isPremier avec 50 linges de code. Je sais qu'il y en a deja plein mais ceux que j'ai vu me font peur et je pense au mec qui comprend rien.


Pour Proger :
=========
LOL le and en VB :p arff ! Sorry....

2e chose le INT --&gt; c'est en 16 bit en VB or les OS sont en 32 Bit le LONG et en 32 BIT le CPU calcul plus vite dans son propre nb de BIT.
Assembleur oblige.
Désolé pour ceux qui aurait Windope Serveur 64 Bits :p

pour l'optimisation n=1 ou n=0
Comme j'ai dit j'ai fait ca en 2min pour répondre a un autre qui avait posté une source avec des test en STING pour savoir si son nombre etait a virgule ou pas...
donc j'ai pas regarde dans les details

1.6 ms ? ummm ... je sais pas moi j'ai un disque de 1Ghz en RAM pure :p (Virutal disque) je suis sur le serveur :p
donc ca tourne a 0 aussi bien une que l'autre

Pour aKh :p
========
Le +1 sert a rien ca va encore faire gagné au moins 0.01 ms a Proger :p

Le true et le false ca me vient du C. et moi faire un exit function sans fait isPremier = false c'est pas bon, c'est pas tres propre
Quand au string a EMPTY et le numerique a 0 je trouve ca idiot et j'ai pas testé
mais je crois qu'en .Net c'est plus comme ca...

Bhen immagine tu crée un tableau de 500 elements

en VB.net
DIM tab[500] as integer  //en plus en VB.nET c'est de 0 à 499 et non de 0à500 :p
DIM i
pour faire juste dessous
for i = 0 to 499
tab[i] = i
next i

vb6 va te faire un
DIM tab[500] as integer //0 à 500

  -- VB
     i = 0
     for i = 0 to 500
      tab(i) = 0
     next i

toi tu crées ton i
dim i
     -- vb
      i = 0

for i = 0 to 500
   tab(i) = i
next i

Tu vois une optimisation TOI ?
Ha moi pas....

Voila sinon je vous conseil d'aller joue à Pacman ou a prophecy engine :p
ici ---&gt; www.dreamersteam.org

signaler à un administrateur
Commentaire de Vbsupernul le 10/12/2002 16:10:56

?????
un disk qui tourne en Ghz?????
Ca me laisse perplex :D

signaler à un administrateur
Commentaire de Ricpperso le 10/12/2002 16:11:05

Ya ques des sources sur les nombres premier ici :p:p:p. Bravo a tous les trois

signaler à un administrateur
Commentaire de Proger le 10/12/2002 16:55:11

Bouh t'aime pas mon And en VB ? bouhouhou... :(
plus sérieusement, je n'ai jamais entendu dire que les opérations booléenne sont fastidieuse (en terme vitesse), surtout quand on compile son code vb en natif. c'est une fonction gravé en hard dans les cpu depuis le 4004 risc...

Et vi, la différence entre un Dim i et un Dim i as long, c'est 3,7 ms pour trouver que 2147483647 est premier. Le seul moyen de dé partager la plétore de sources "nb premier" sur vbfrance, c'est bien la rapidité du code, alors toi aussi, enc... les drosophiles :)

PS : 6Po, pour un chrono plus préçis que la milliseconde, va donc voir la catégorie "optimisation".
mon 700MHz mets 1.460521 ms exactement (priorité process : real time) pour trouver que 2^31 - 1 est premier. Qui dit mieux? ah, pas tous en même temps svp ;)

signaler à un administrateur
Commentaire de 6Po le 10/12/2002 17:48:36

Vbsupernul
vivi c'est un RamDrive du serveur. Ca tourne a 1Ghz ca la rame du serveur fait du 1ghz :p
J'utilise ce pour le batch abominable :) Du style qui n'a pas payé sa facture de téléphone ce mois ci :p

Pour proger:
IF ... and ... en VB c'est connu que c'est pas bon.
fo préféré un
IF .... THEN
   IF .... THEN
   END IF
END IF

en plus en VB = 0 faux et tout le reste = vrai :p donc quand tu va faire un test fo pas oublie de faire l'inverse... ca VB le fais tres bien mais ca prends tjs un peu de temps :p
C'est pour ca que j'opte tjs pour le byte mais je voulais pas mettre un byte dans le source ci, sinon j'aurais eu plein de poste :p

Ricpperso
=======
ROLF :))) Alors pkoi tu les lis encore ?

signaler à un administrateur
Commentaire de VicoLaChips2 le 10/12/2002 18:33:27

(2 ^ 13 466 917) - 1 'Source :http://membres.lycos.fr/villemingerard/Premier/record.htm#L20Grands
est un nombre premier... Mais avec VB On peut toujours s'accrocher aux branches pour le trouver !!

C'est quoi cet engouement pour les nombres premiers ??
@+, VIC

signaler à un administrateur
Commentaire de eagle94 le 11/12/2002 13:51:42

il existe un algo bien plus rapide pour dire si le nombre et premier ou pas sans utiliser de boucle.

signaler à un administrateur
Commentaire de khaleid le 15/12/2002 14:48:31

Que pensez vous de ma source :
http://forum.vbfrance.com/article.aspx?Val=5164
sur le sujet !

signaler à un administrateur
Commentaire de Proger le 19/03/2003 16:28:03

khaleid, c une cata ton truc...
non seulement ça me met en rogne car tu utilise pas la fonction Mod
et en plus tu utilises le And, ce que 6Po décrit comme "pas bon", et c'est vrai il a pas tord!
ps : hé, 6Po, si t'en connais d'autres des bidouilles, je prends :)
trouvaille du moment : do until...loop plus rapide que for...next

signaler à un administrateur
Commentaire de wonesek le 29/04/2003 16:38:56

Voila un petit challenge:
codé un programme qui trouve tous les nombre premier entre 0 et 10 000 000 le plus rapidement possible.
indice: il y en a 664 579

mon programme le fait en 3 minutes 50 secondes sur un 1.2 Ghz

bonne chance  

signaler à un administrateur
Commentaire de us_30 le 04/05/2005 14:25:26

Challenge relevé !

Battu à plate couture !! avec mon pentium II 450 mhz, en 10 secondes !

Mon algo est déposé à : http://www.vbfrance.com/codes/PI-X-__NOMBRE_DE_NOMBRES_PREMIERS_-ALGO_RAPIDE-/31126.aspx


... et il y en a bien 664579... et ils sont tous stockés en mémoire...

Mon challenge : TROUVER ENCORE PLUS RAPIDE !

Bonne chance à tous...

Amicalement,
Us.

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version


LG KP501

Entre 9€ et 159€


Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,374 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.