begin process at 2008 07 06 19:45:44
1 205 742 membres
305 nouveaux aujourd'hui
14 119 membres club

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 !

DECOMPOSITION FACTEURS PREMIERS


Information sur la source

Catégorie :Maths Niveau : Débutant Date de création : 07/05/2005 Date de mise à jour : 08/05/2005 07:30:05 Vu : 3 689

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

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

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 ;)
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...
  • signaler à un administrateur
    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.

  • signaler à un administrateur
    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.

  • signaler à un administrateur
    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...

  • signaler à un administrateur
    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.

  • signaler à un administrateur
    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

  • signaler à un administrateur
    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

Pub



Appels d'offres

WEB DESIGN
Budget : 1 000€
Plugin Dialer outlook
Budget : 2 000€
Travail graphique- ill...
Budget : 1 000€

CalendriCode

Juillet 2008
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

VS Express FR Gratuit !

VS Express en français et 100% gratuit !

Boutique

Boutique de goodies CodeS-SourceS