Decomposition facteurs premiers

Soyez le premier à donner votre avis sur cette source.

Snippet vu 5 919 fois - Téléchargée 30 fois

Contenu du snippet

"Un nombre premier est un entier naturel non-nul n'ayant que deux diviseurs : 1 et lui-même."
Cette fonction vous permettra de décomposer un nombre en un produit de facteurs premiers. Exemples :
FPremier(8) retourne 2^3
FPremier(35) retourne 5*7
FPremier(12) retourne 2^2*3
FPremier(7) retourne 7 (puisque 7 est un nombre premier)
FPremier(0) et FPremier(1) ainsi que tous les nombres négatifs retournent "Error"

Source / Exemple :


Function FPremier(D As Long) As String
'On vérifie les cas, 1 et 0, ainsi que les nombres négatifs. Si c'est le cas on stoppe la fontion.
If D <= 1 Then FPremier = D: Exit Function
Dim A, X, I, N, L As Long, B As String, M, O As Integer
'Préparation du premier passage de la boucle : cette boucle va vérifier si notre nombre est multiple de A ou X ; on lui met donc les valeurs des 2 exceptions : 2 et 3.
A = 2
X = 3
N = 9
O = 9
'Cette boucle sera effectuée 2 fois, une fois pour les cas 2 et 3, et une autre pour tous les facteurs de la forme 6t + 1
For M = 0 To 1
'Tant que A est inférieur ou égal a la racine carrée de N
  While A <= Sqr(N)
  'On vérifie que D est bien un multiple de D ou X (D et X sont les nombres premiers qui seront testés, soit 2 et 3 lors du premier passage, ensuite ils seront redéfinis a 5 et 7
    If D Mod A = 0 Or D Mod X = 0 Then
  'On assigne le diviseur de D a la variable L
      L = IIf(D Mod A = 0, A, X)
  'On calcule le nombre sous la forme D^I, ce qui évite d'avoir par exemple 8 = 2*2*2
      While D Mod L = 0
        I = I + 1
        D = D / L
      Wend
  'On ajoute le résultat à la suite de la variable B (si I est plus grand que 1, alors le nombre est écrit sous la forme D^I
      B = B & Chr(32) & L & IIf(I > 1, Chr(94) & Trim(I), "")
  'On réinitialise la variable I. Au premier passage, on met N égal 9 (racine de 3...). Au 2nd passage, il prendra la valeur de D.
      I = 0
      N = D * M + O
    Else
  'Si le nombre n'est pas diviseur de A ou X, on ajoute 6 aux valeurs de A et X, ce qui stoppe la boucle au premier passage, et ce qui permet de la continuer au 2nd passage.
    A = A + 6
    X = X + 6
    End If
  Wend
'Le premier passage est terminé, on vérifiera désormais les valeurs 5 et 7, qui seront incrémentées de 6 a chaque fois, tous les nombres premiers sont donc vérifiés (11, 13, 17, 19, etc...)
  A = 5
  X = 7
  N = D
  O = 0
Next M
'On retourne le résultat en remplaçant les espaces par des étoiles.
FPremier = Replace(Trim(IIf(D > 1, B & Chr(32) & Trim(D), B)), Chr(32), Chr(42))
End Function

Conclusion :


Ce code est mon premier en Visual Basic, donc n'hésitez pas pour les conseils d'optimisation ;)

A voir également

Ajouter un commentaire

Commentaires

Messages postés
2065
Date d'inscription
lundi 11 avril 2005
Statut
Membre
Dernière intervention
14 mars 2016
8
Oui, bien sur... (j'ai juste signalé une alternative à "Replace" puisque je ne dispose pas de cette fonction, éventuellement pour d'autres lecteurs qui serait dans mon cas de figure...)


...Enfin, maintenant pour moi, l'intérêt c'est de comprendre pourquoi ton algorithme est le plus rapide...



Bonne programmation....


Us.
Messages postés
879
Date d'inscription
vendredi 22 octobre 2004
Statut
Membre
Dernière intervention
29 juin 2007

Salut,
Effectivement, le fonctionnement de ton code est a peu près similaire au mien, j'avais pas regardé ce code.
Je vais laisser quand même la fonction replace, plus claire a mon gout :)
Merci pour tes encouragements

MaX_62
Messages postés
2065
Date d'inscription
lundi 11 avril 2005
Statut
Membre
Dernière intervention
14 mars 2016
8
Salut,

Oui, maintenant j'ai bien saisi son fonctionnement... que je dois de qualifier d'asticieux... Bon, je dois aussi dire que votre algorithme est dans son principe parfaitement identique à celui que j'ai déposé (http://www.vbfrance.com/code.aspx?ID=31149)... Néanmoins, le votre est plus rapide dans certain cas particulier où l'on choisit un nombre premier trés grand... Ce qui m'étonne d'ailleurs... mais bon... c'est comme ça... (est-ce dû à l'emploi de While...Wend plutôt que Do...loop ?)

JE l'ai regardé de trés près, sans trouvé de défaut... J'ai juste remarqué la répétition : "D Mod A = 0" mais sans trouvé qlq chose de mieux...

{
Extrait :

If D Mod A 0 Or D Mod X 0 Then
'On assigne le diviseur de D a la variable L
L IIf(D Mod A 0, A, X)

}

IL me semble donc, trés bien... ET comme on dirait dans les chiffres et les lettres : PAS MIEUX !



Toute de même une p'tite remarque, (pour d'autres lecteurs)... Dans mon cas, je l'ai testé avec VBA dans Excel 97... et la fonction "Replace" n'existe pas... J'ai donc contourné le problème en modifiant les lignes :

B = B & Chr(32) & L & IIf(I > 1, Chr(94) & Trim(I), "")
en :
B = B & L & IIf(I > 1, "^" & Trim(I), "") & "*"

Puis,
FPremier = Replace(Trim(IIf(D > 1, B & Chr(32) & Trim
(D), B)), Chr(32), Chr(42))
en :
If Len(B) > 0 Then FPremier Left(B, Len(B) - 1) & IIf(D > 1, "*" & D, "") Else FPremier D


Voilà ! mes félicitations...


A+
Us.
Messages postés
921
Date d'inscription
vendredi 20 décembre 2002
Statut
Membre
Dernière intervention
23 septembre 2010

Dis... des noms de variables du style A, X, O, N, etc etc c'est pas très parlant, ça aide pas trop à la compréhension justement...
Messages postés
879
Date d'inscription
vendredi 22 octobre 2004
Statut
Membre
Dernière intervention
29 juin 2007

Merci pour le 'if', je vais mettre a jour et commenter le code pour qu'il soit plus compréhensible.
Afficher les 6 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.