Les Snippets

Connexion

Test Nombre Premier

Niveau requis pour utiliser/comprendre cette source : 1 ( Débutant )
Créé le 15/12/2007 21:30:13 et initié par us_30 [Liste]
Date de mise à jour : 25/07/2008 13:08:22
Vue : 10586
Catégorie(s) : Maths
Langages dispo pour ce code :
- VB6, VBA
- Java
- Delphi 5
- VB 2008
- Tcl



Langage : VB6 , VBA
Date ajout : 15/12/2007
Posté par us_30 [Liste]
Function isNP(Nb As Double) As Boolean
' TEST SI NB EST UN NOMBRE PREMIER ( ALGO RAPIDE )
' utilise ERATHOSENE et DIVISIONS
' Test de validité
If Nb < 2 Then Exit Function

' Paramères
Dim Liste As Long, Saut As Long, t As Long
Dim A As Long, A1 As Long, A2 As Long
Dim Nbp() As Boolean, L() As Long
Dim Pi_NbP As Long, bs As Double, Pi_Nbp2 As Long
Dim Prod As Double
' Paramètres d'optimisation
Pi_NbP = 5   'indice de 0 à 5
Prod = 30030 'produit de 2*3*5*7*11*13

' ALGO ERATHOSTENE : Génére liste nb premier jusqu'à pi(A+1)
A = Prod + 1
A1 = Int((A ^ 0.5 - 3) / 2)
A2 = Int((A - 3) / 2)
ReDim Nbp(A2)
For Liste = 0 To A1
    If Nbp(Liste) = False Then
    Saut = 2 * Liste + 3
    For t = (Saut ^ 2 - 3) / 2 To A2 Step Saut
        Nbp(t) = True 'pas premier
    Next t
    End If
Next Liste

' Forme la liste
ReDim L(A2 + 1)
L(0) = 2
Pi_Nbp2 = 0
For t = 0 To A2
If Nbp(t) = False Then
    Pi_Nbp2 = Pi_Nbp2 + 1
    L(Pi_Nbp2) = 2 * t + 3
End If
Next t
  
' Test si trivial
If Nb > Prod Then GoTo suite 'évite si pas nécessaire
For t = 0 To Pi_Nbp2
    If Nb = L(t) Then isNP = True: Exit Function
Next t
suite:
' Test si multiple
For t = 0 To Pi_Nbp2
    If Nb = L(t) * Int(Nb / L(t)) Then Exit Function
Next t
' Forme liste complète
Dim nbp2 As Long
ReDim L2(5627)
For t = Pi_NbP + 1 To Pi_Nbp2
    nbp2 = nbp2 + 1
     L2(nbp2) = L(t)
Next t
' On rajoute les multiples
Dim t2 As Long
For t = Pi_NbP + 1 To Pi_Nbp2
If L(t) * L(t) > A Then Exit For
    For t2 = t To Pi_Nbp2
    If L(t) * L(t2) < A Then
        nbp2 = nbp2 + 1
        L2(nbp2) = L(t) * L(t2)
    Else
        Exit For
    End If
    Next t2
Next t
' ALGO DIVISIONS
Dim fin As Long, m As Long
fin = Sqr(Nb)
For m = 0 To fin Step Prod
    For t = 1 To nbp2
    If Nb = (m + L2(t)) * Int(Nb / (m + L2(t))) Then Exit Function
    Next t
Next m
isNP = True
End Function
Remarque :
Test: isNP(999999999989) => VRAI.
Langage : Java
Date ajout : 10/02/2008
Posté par vincjava [Liste]
DateMAJ : 25/07/2008
public static boolean isNP(int a) { 
 
  a = Math.abs(a);                     // si l'utilisateur non averti rentre un nombre négatif 
  if (a < 2) return false;             // 1 et 0 ne sont pas premiers 
 
  if(a%2==0) return false;           // Si le reste de la division euclidienne de a par 2 est 0 
  // soit a divisible par 2 
 
 
  int b = new Double(Math.sqrt(a)).intValue();   // on effectue les calculs jusqu'à la partie entière 
  // de la racine carré du nombre 
     
  for(int i = 3;i<=b;i = i+2) { 
    if(a%i == 0) return false; 
  } 
     
  return true; 
     } 
 

public static void main(String[ ] args) { 
  System.out.println(isNP(99999989)); 
} 
 
Langage : Delphi 5
Date ajout : 25/07/2008
Posté par f0xi [Liste]
DateMAJ : 25/07/2008
procedure UDivMod(const Dividend, Divisor: LongWord; var Result, Remainder: LongWord); register; asm   push ebx;   mov ebx,edx;   xor edx,edx;   div ebx;   mov ebx,Remainder;   mov [ecx],eax;   mov [ebx],edx;   pop ebx; end; function IsPrimeNumber(const Number: LongWord): boolean; var DivisorA,     DivisorB,     Modulo,     DivisorsCount : LongWord; begin   Result := false;   if Number < 2 then     exit;   DivisorA := 1;   DivisorB := Number;   Modulo := 0;   DivisorsCount := 0;   if DivisorA < DivisorB then     repeat       UDivMod(Number, DivisorA, DivisorB, Modulo);       if Modulo = 0 then         DivisorsCount := DivisorsCount + 2;       DivisorA := DivisorA + 1;     until (DivisorA >= DivisorB) or (DivisorsCount >= 3);   Result := DivisorsCount = 2; end;
Remarque :
~4,5 millions de cycles / 1.3 secondes (boucle comprise) pour trouver les 100 000 nombres premier en partant de 1 (soit 1 299 710 nombres testés).

~8 millions de cycles / 2.25 secondes (boucle comprise) pour trouver les 100 000 nombres premier suivant,donc en partant de 1 299 710, soit 1 450 450 nombres testés.

~48.6 millions de cycles / 13.5 secondes (boucle comprise) pour trouver les 500 000 nombres premiers en partant de 1, soit 7 368 788 nombres testés.
Langage : VB 2008
Date ajout : 13/08/2008
Posté par us_30 [Liste]

Function isNP(ByVal Nb As Long) As Boolean

' TEST SI NB EST UN NOMBRE PREMIER ( ALGO RAPIDE )

' utilise ERATHOSENE et DIVISIONS

' Test de validit‚

If Nb < 2 Then Exit Function

' ParamŠres

Dim Liste As Integer

Dim Saut As Integer

Dim t As Integer

Dim A As Long

Dim A1 As Integer

Dim A2 As Integer

Dim Pi_NbP As Integer

Dim Pi_Nbp2 As Integer

Dim Prod As Long

Dim nbp2 As Integer

Dim t2 As Integer

Dim fin As Long

Dim m As Long

' ParamŠtres d'optimisation

Pi_NbP = 5 'indice de 0 … 5

Prod = 30030 'produit de 2*3*5*7*11*13

' ALGO ERATHOSTENE : G‚n‚re liste nb premier jusqu'… pi(A+1)

A = Prod + 1
A1 = CInt(Int((A ^ 0.5 - 3) / 2)) 
A2 = CInt((A - 3) / 2)
Dim Nbp(A2) As Boolean

For Liste = 0 To A1 
If Nbp(Liste) = False Then

Saut = 2 * Liste + 3
For t = CInt((Saut ^ 2 - 3) / 2) To A2 Step Saut 
Nbp(t) = True 'pas premier
Next t 
End If
Next Liste 
' Forme la liste

Dim L(A2 + 1) As Long

L(0) = 2

Pi_Nbp2 = 0
For t = 0 To A2 
If Nbp(t) = False Then

Pi_Nbp2 = Pi_Nbp2 + 1

L(Pi_Nbp2) = 2 * t + 3

End If
Next t 
' Test si trivial

If Nb > Prod Then GoTo suite '‚vite si pas n‚cessaire
For t = 0 To Pi_Nbp2 
If Nb = L(t) Then isNP = True : Exit Function
Next t 
suite:

' Test si multiple
For t = 0 To Pi_Nbp2 
If Nb = L(t) * Int(Nb / L(t)) Then Exit Function
Next t 
' Forme liste complŠte

Dim L2(5627) As Long
For t = Pi_NbP + 1 To Pi_Nbp2 
nbp2 = nbp2 + 1

L2(nbp2) = L(t)
Next t 
' On rajoute les multiples
For t = Pi_NbP + 1 To Pi_Nbp2 
If L(t) * L(t) > A Then Exit For
For t2 = t To Pi_Nbp2 
If L(t) * L(t2) < A Then

nbp2 = nbp2 + 1

L2(nbp2) = L(t) * L(t2)

Else

Exit For

End If
Next t2 
Next t
' ALGO DIVISIONS

fin = CLng(Math.Sqrt(Nb)) 
For m = 0 To fin Step Prod
For t = 1 To nbp2 
If Nb = (m + L2(t)) * Int(Nb / (m + L2(t))) Then Exit Function
Next t 
Next m
isNP = True

End Function 
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 'Chrono
Dim Stopwatch As System.Diagnostics.Stopwatch Stopwatch = New Stopwatch 'Donn‚e Dim a As Long a = CLng(TextBox1.Text) Dim b As Boolean Stopwatch.Start() b = isNP(a) Stopwatch.Stop() 'Renvoi MsgBox(b & " " & Stopwatch.Elapsed().TotalMilliseconds & " millisecondes") End Sub
Remarque :
Mettre :
- La fonction dans un module
- Une Form1 composée de 1 TextBox + 1 Bouton (+ le code)

On peut tester la borne "999999999989" qui renvoit vrai en environ 15 millisecondes sur processeur 2 GHz.
Langage : Tcl
Date ajout : 06/07/2009
Posté par gersoo [Liste]

proc IsPrime {n} {  set max [expr {int(sqrt($n))}]  incr max  set res 1  for {set i 3} {$i < $max} {incr i 2} {     if {!($n % $i)} {       set res  0       break     }  }  return $res

}


Snippets en rapport avec : Nombre, Premier, Erathostène



Codes sources en rapport avec : Nombre, Premier, Erathostène

{C / C++ / C++.NET} FACTORISATION D'UN ENTIER EN PRODUIT DE NOMBRES PREMIERS AVEC UNE FONCTION RÉCURSIVE
Ce programme affiche les facteurs premiers composant le nombre entré en paramètre, grâce à un algori...

{Javascript / DHTML} TROUVER LES FACTEURS D'UN NOMBRE
Un petit script utile qui va vous permettre de trouver les facteurs d'un nombre. Il peut trouver les...

{Visual Basic, VB6, VB.NET, VB 2005} NOMBRES PREMIERS
L'utilisateur entre un nombre entier positif au clavier et appuie sur Entrée ou clique sur OK pour s...

{Visual Basic, VB6, VB.NET, VB 2005} TROUVER DES NOMBRES PREMIERS
Ceci est un programme tout simple qui permet de trouver des nombres premiers entre X et Y. Le temps...

{PHP} NOMBRE_PREMIER
Un petit programme qui liste des nombres premiers jusqu'a $limit limite...

{Visual Basic, VB6, VB.NET, VB 2005} NOMBRE PREMIER AUTRE METHODE
voila encore un nouveau prog sur les nombres premiers. mais la methode différe , il me semble de l'...

{Delphi} RECHERCHER LES PREMIERS NOMBRES PREMIERS
Tout est dans le titre ce petit programme permet de chercher beaucoup de nombre premier. On part de ...

{Visual Basic, VB6, VB.NET, VB 2005} FACTORISATION EN NOMBRES PREMIERS
Programme permettant de factoriser des nombres composés jusqu'à 100000. J'ai voulu faire plus grand ...

{Visual Basic, VB6, VB.NET, VB 2005} UN PETIT PROGRAMME DE CALCUL DES NOMBRE PREMIERS
qu'on vous appuiez sur calculer il va mettre les nombre dans un fichier texte dans C: appeler premie...

{Visual Basic, VB6, VB.NET, VB 2005} CRIBLE D' ERATOSTHÈNE
Petit programme donnant la liste des NP en utilisant l'algorithme du crible d'Eratosthène. A vos com...