Factorisation rapide

0/5 (3 avis)

Vue 3 729 fois - Téléchargée 225 fois

Description

Bon ben y'en a deja surement 10 000 des sources pour ca, mais c'ets pour eviter aux newbee de faire des bocules qui mettent 10 000 ans a tourner.
De plus y'a des remarques et des questions sur l'optimisation des lignes de code.
Voili voilo

Source / Exemple :


'Vous devez creer :
'       un TextBox   : Text1
'       un commandbutton cmdFactoriser

Dim div, nbr, nbrdiv As Long
Dim Lst() As Long

Private Sub Text1_KeyPress(KeyAscii As Integer)
 If KeyAscii < 48 And KeyAscii <> 8 Or KeyAscii > 57 Then KeyAscii = 0
End Sub

Private Sub cmdFactoriser_Click()
 'Initialisation : on rappelle que 1 n'est pas consideré comme un nombre premier

 ReDim Lst(0)
 nbr = Val(Text1.Text)
 div = 2
 nbrdiv = 0
 Text2.Text = ""
 
 If nbr < 2 Then MsgBox "Quel utilité de calculer ? "
 Text1.Locked = True
 cmdFactoriser.Enabled = False
 
 'Le Caption du label3 sera toujours égale a "En Travail :"
   'Un autre label ( le 4) indiquera à droite du label3 le nombre
   'Ca évitera au pc d'avoir a rajouter a chaque fois "En travail :"
 Label3.Caption = "En travail :    Test du diviseur :"
 

 
 While div <= Sqr(nbr) 'Rajouter Int() ralenti t'il le test ? Mais sans Int() le test s'effectue sur des nombre de type single... ce qui ralenti ) A voir ...
 
    Label4.Caption = div & " sur " & Int(Sqr(nbr))
 
    'Plusieurs possiblités :
       ' --> If nbr/div =int(nbr/div)   Then
       ' --> If nbr mod div Then
       ' --> If nbr-(nbr\div)*div Then
 
    If nbr / div = Int(nbr / div) Then
       Lst(nbrdiv) = div
       nbrdiv = nbrdiv + 1
       ReDim Preserve Lst(nbrdiv)
       nbr = nbr / div
       div = div - 1 ' si nbr multiple de 4 ? il faut retester "2"
    End If           ' On enleve donc 1 ...
    div = div + 1 ' pour le rajouter la . resultat : aucun ( ou alors incremente )
    DoEvents
 Wend
 
 If nbr Then
    For div = 0 To nbrdiv - 1
        Text2 = Text2 & Lst(div) & " * "
    Next div
    Text2 = Text2 & nbr
 Else
    MsgBox " Votre nombre est premier !"
 End If
 
 Text1.Locked = False
 cmdFactoriser.Enabled = True
 Label3.Caption = "Factorisation terminée."
End Sub

Conclusion :


bon ben si vous avez plus rapide hein ... no pb je suis preneur !

-={[ ZeroCool ]}=-

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
2676
Date d'inscription
vendredi 28 juin 2002
Statut
Membre
Dernière intervention
13 janvier 2016
18
salut,

si tu veux une méthode vraiment très rapide et vu que tu as l'air d'aimer les maths...tu devrais jetter un oeil sur les courbes elliptiques...je ne connais pas vraiment le principe mais ca permet de factoriser des nombres énormes très rapidement...

ShareVB
Messages postés
367
Date d'inscription
lundi 1 avril 2002
Statut
Membre
Dernière intervention
11 février 2010

Salut ! Merci de tes conseils je ls aplmliqueria plus tard...
Je viens de vérifier quelquechose, et je ne comprend pas le conseil :
"Pour chaque nombre qui divise fait une boucle tant qu'il arrive à diviser
Do
Loop (While | Until)"

étant donné que c'est déja ce qu'il se passe !
Tapes 256 comme nombre et suis la lecture du programme ! Si tu regardes bien, lorsque div divise Nbr, une ligne de code enlève 1 à div. Ainsi lorsque la ligne de code qui suit le test de division est executé, div est incrémentée. Ainsi tout se passe comme s'il n'etait rien arrivé à div. Cela permet de refaire le test avec un nouveau Nbr mais avec un div inchangé (ici div =2)
Le code continue à tester 2 jusqu'à ce qu'il ne divise plus Nbr ou soit plus grand que ca racine carré.

-={[ ZeroCool ]}=-
Messages postés
473
Date d'inscription
mercredi 7 août 2002
Statut
Membre
Dernière intervention
10 juin 2015

Salut,
Pour chaque nombre qui divise fait une boucle tant qu'il arrive à diviser
Do
Loop (While | Until)

Utilise une collection pour stocker tes valeurs (c'est moins casse bonbons à utiliser qu'un tableau redimensionnable)

Dès que tu trouves un diviseur, recalcule ta racine carrée et transforme le résultat en long (clng) pour le réutilisé lors des tests d'après.
Un petit truc logique, ton premier diviseur c'est 2, comme c'est le seul nombre pair premier tu peux faire ton pas de 2 en 2.
Comme c'est long de faire une division à virgule flottante préfère utiliser la fonction modulo et la division entière (antislash)
if nbr mod div = 0 Then
nbr = nbr \ div ' <-- plus rapide de très loin parce que tu évite 3 conversions
end if

bonne continuation

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.