VBA Excel - Nombres premiers

Décembre 2016



Introduction

Pour trouver tous les nombres premiers, nous allons utiliser la méthode du crible d'Eratosthène. Cela consiste à boucler sur tous les nombres de 2 à n, de vérifier si le nombre "en cours" est un multiple. S'il ne l'est pas, il s'agit d'un nombre premier.
Lien wikipédia.

Définition

Un nombre premier est un entier naturel qui admet exactement deux diviseurs distincts entiers et positifs (qui sont alors 1 et lui-même).

Fonction

Code appelant

Sub Appel()
    Debug.Print EstPremier(31)
    Debug.Print EstPremier(42)
    Debug.Print EstPremier(Cells(2, 3))
End Sub

Code de la fonction

Function EstPremier(Nb As Integer) As Boolean
Dim i As Long
    If Nb = 1 Or Nb = 0 Then Exit Function
    For i = 2 To Sqr(Nb)
        If Nb Mod i = 0 Then Exit Function
    Next i
    EstPremier = True
End Function


Nota : Cette fonction personnalisée peut être utilisée comme formule de feuille de calcul. Pour cela, saisir dans la feuille, par exemple :
=EstPremier(A1)

Tous les nombres premiers : algorithme

Pour réaliser ceci, on écrit la liste de tous les nombres jusqu'à NbreMax.
  • On élimine 1.
  • On souligne 2 et on élimine tous les multiples de 2.
  • Puis on fait de même avec 3.
  • On choisit alors le plus petit nombre non souligné et non éliminé ici 5,
  • On élimine tous ses multiples.
  • On réitère le procédé jusqu'à la partie entière de la racine de n.

Les nombres non éliminés sont les nombres premiers jusqu'à n.

Code de la fonction

Le choix du type de cette fonction est due au fait que je souhaitais voir les erreurs apparaitre comme message à l'utilisateur. Nous pourrions facilement la "bricoler" pour que cette fonction nous renvoie un nombre de type Integer ou Long...
Pour des raisons de lenteur de ce code, nous allons également nous limiter aux 1500 premiers nombres premiers...

Function NbPremiers_Eratosthène(Rang As Long) As Variant
'Détermination du nième nombre premier méthode du crible d'Eratosthène
Dim i As Long, j As Long, k As Long, NbreMax As Long, est_premier(), Flag As Boolean

If Rang >= 1 And Rang <= 1500 Then
    ReDim Preserve est_premier(Rang)
    k = 0
    NbreMax = 20 * Rang 'suffit pour un rang < 1500
    Flag = True
    For i = 2 To NbreMax
        For j = 2 To i
            If j = i Then Exit For
            If i Mod j = 0 Then Flag = False: Exit For
        Next
        If Flag = True Then
            If i = 2 Then
                est_premier(k) = 1
                k = k + 1
            Else
                est_premier(k) = i
                k = k + 1
            End If
        Else
            Flag = True
        End If
        If k = Rang Then Exit For
    Next i
    NbPremiers_Eratosthène = est_premier(Rang - 1)
Else
    NbPremiers_Eratosthène = "Rang trop grand ou trop petit (compris entre 1 et 1500 inclus)."
End If
End Function

Code d'appel

Nous avons ici deux possibilités :

Nième nombre premier

Sub Test()
'Pour obtenir le 499ième Nombre premier :
  MsgBox NbPremiers_Eratosthène(499)
End Sub

Liste des 99 premiers nombres premiers

Sub ListeNbPrems()
'Pour obtenir la liste des 99 1ers nombres premiers :
Dim i As Long, Msg As String, Tb(98)

For i = 1 To 99
    Tb(i - 1) = NbPremiers_Eratosthène(i)
Next i
MsgBox Tb(0) & " " & Tb(1) & " " & Tb(2) & " ... " & Tb(UBound(Tb))
End Sub

Fichier à télécharger

Un classeur exemple est disponible ici : Fichier au format .xls

A voir également :

Ce document intitulé «  VBA Excel - Nombres premiers  » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.