begin process at 2012 02 16 16:39:48
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Maths

 > DECOMPOSITION FACTEURS PREMIERS

DECOMPOSITION FACTEURS PREMIERS


 Information sur la source

Note :
10 / 10 - par 2 personnes
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Maths Niveau :Débutant Date de création :07/05/2005 Date de mise à jour :08/05/2005 07:30:05 Vu :4 510

Auteur : MaX_62

Ecrire un message privé
Commentaire sur cette source (6)
Ajouter un commentaire et/ou une note

 Description

"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

  • 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
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 ;)


 Historique

08 mai 2005 07:27:04 :
- Petit détail réglé, merci us_30 - Code désormais commenté, j'espère que c'est clair :)
08 mai 2005 07:30:05 :
- Alignement des commentaires...

 Sources de la même categorie

Source avec Zip Source avec une capture CONVERTISSEUR HEXAVIGÉSIMAL par shaeks
Source avec Zip Source avec une capture Source .NET (Dotnet) CRYPTOGRAPHIE AFFINE par Tigrou66
Source avec Zip Source avec une capture SCANNER FLEX par lajouad
Source avec Zip EQUATIONSECONDDEGRÉ,MATH,DEGRÉ par shadkitenge
Source avec Zip Source .NET (Dotnet) SOMME DE CHIFFRES CONTENUE DANS UN NOMBRE par alpha5

Commentaires et avis

Commentaire de us_30 le 07/05/2005 23:24:12

Salut,

J'ai beau essayé de décortiquer l'algorithme, je ne vois pas comment il marche ? Peux-tu expliquer... Je suis trés intéréssé...


Pour l'instant, je n'ai pas vraiment vu d'amélioration, surtout faute de compréhension du fonctionnement...


Juste un détail, le code :

If D <= 1 Then
    FPremier = "Error"
    Exit Function
End If

pourrait être remplacé par :

If D <= 1 Then FPremier = D: Exit Function

c'est plus sympa que "erreur"...


A+
Us.

Commentaire de MaX_62 le 08/05/2005 07:01:28

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

Commentaire de Saros le 08/05/2005 15:24:08

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...

Commentaire de us_30 le 08/05/2005 18:16:51

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.

Commentaire de MaX_62 le 08/05/2005 18:25:54

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

Commentaire de us_30 le 08/05/2005 18:34:38

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.

 Ajouter un commentaire




Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,343 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales