begin process at 2012 02 17 11:26:06
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Maths

 > [VB 8][.NET 2]LES DIVISEURS D'UN NOMBRE + NOMBRES PREMIERS (ENUMÉRATOR & TESTEUR) + FACTORISATION PREMIÈRE + PGCD + PPCM

[VB 8][.NET 2]LES DIVISEURS D'UN NOMBRE + NOMBRES PREMIERS (ENUMÉRATOR & TESTEUR) + FACTORISATION PREMIÈRE + PGCD + PPCM


 Information sur la source

Note :
Aucune note
Catégorie :Maths Source .NET ( DotNet ) Classé sous :diviseur, nombre, rapide, diviseurs, nombres Niveau :Débutant Date de création :22/01/2007 Date de mise à jour :27/01/2007 12:28:07 Vu / téléchargé :10 857 / 237

Auteur : FREMYCOMPANY

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

 Description

Cliquez pour voir la capture en taille normale
Tout est dans le titre ;)

Bon ici pour des raisons de simplicité j'ai utilisé une list(Of Integer) pour les résultats.
Il est évident que si on veut encore gagner en rapidité, on doit passer par des array...
On peut aussi éviter Sort en mettant les div1 dans un array et les div2 dans un autre puis joindre les deux tableau (Div1[0]=>Div1[X] & Div2[X]=>Div2[0])

Enfin le résultat est la !
33 fois plus rapide à trouver les diviseurs de 2007 que la méthode classique !
A part pour 2 et 3 ou cela est plus long (à peine) - à cause de l'appel de List.Sort() -, le script prouve son efficacité !

Pour calculer des diviseurs de 15, ma méthode s'est avérée 1,5 fois plus rapide !

Juste à titre d'exemple, la recherche des diviseurs de 53612 prend 191 fois moins de temps avec ma méthode (326406 contre 62337475)
Celles des diviseurs de 100 mille : 230 fois plus rapide(514768 contre 118490968)

<EDIT()> _
Public Class Comment
'' La nouvelle version est en mode Windows et permet en plus tout ce qui est dit dans le titre ! (PGCD, PPCM, Factorisation première, ...)
'' De plus, les chiffres de rapidité décrit au dessus ne sont plus valide. La vitesse a été augmentée par deux pour les nombres pairs (et est restée inchanger pour les impairs)
End Class

Source

  • ' ANCIEN CODE (Application Console, démontrer la puissance de getDivs, une nouvelle version encore plus rapide existe dans le ZIP)
  • Public Module MainModule
  • Public Sub Main()
  • On Error GoTo EndSub
  • Do
  • Console.Write("Entrez un nombre pour en connaître les diviseurs, N pour quitter: ")
  • Dim Number As Integer = CInt(Console.ReadLine())
  • Dim Diviseurs As List(Of Integer) = getDivs(Number)
  • Console.Write("Le nombre que vous avez choisit a ")
  • For I As Integer = 0 To Diviseurs.Count - 1
  • Console.Write(Diviseurs(I) & IIf(I = Diviseurs.Count - 1, " ", ","))
  • Next
  • Console.WriteLine("pour diviseurs.")
  • '' <TEST>
  • Dim TimeWatcher As New Diagnostics.Stopwatch()
  • TimeWatcher.Start()
  • For X As Integer = 0 To 10000
  • getDivs(Number)
  • Next
  • TimeWatcher.Stop()
  • Console.WriteLine("La méthode que j'utilise :" & TimeWatcher.ElapsedTicks)
  • TimeWatcher.Reset()
  • TimeWatcher.start()
  • For X As Integer = 0 To 10000
  • getDivs_Bad(Number)
  • Next
  • TimeWatcher.Stop()
  • Console.WriteLine("La méthode classique :" & TimeWatcher.ElapsedTicks)
  • '' </TEST>
  • Loop While True
  • EndSub:
  • End Sub
  • Public Function getDivs(ByVal Number As Integer) As List(Of Integer)
  • getDivs = New List(Of Integer)
  • Dim Div1 As Integer = 1
  • Dim Div2 As Integer = Number
  • While Div1 <= Div2
  • If Div1 * Div2 = Number Then
  • getDivs.Add(Div1)
  • If Div1 <> Div2 Then getDivs.Add(Div2)
  • End If
  • Div1 += 1
  • Div2 = Number \ Div1
  • End While
  • getDivs.Sort()
  • End Function
  • Public Function getDivs_Bad(ByVal Number As Integer) As List(Of Integer)
  • Dim getDivs As New List(Of Integer)
  • getDivs_Bad = getDivs
  • For Div As Integer = 1 To Number
  • If Number Mod Div = 0 Then getDivs.Add(Div)
  • Next
  • End Function
  • End Module
' ANCIEN CODE (Application Console, démontrer la puissance de getDivs, une nouvelle version encore plus rapide existe dans le ZIP)
Public Module MainModule

    Public Sub Main()
        On Error GoTo EndSub
        Do
            Console.Write("Entrez un nombre pour en connaître les diviseurs, N pour quitter: ")
            Dim Number As Integer = CInt(Console.ReadLine())
            Dim Diviseurs As List(Of Integer) = getDivs(Number)
            Console.Write("Le nombre que vous avez choisit a ")
            For I As Integer = 0 To Diviseurs.Count - 1
                Console.Write(Diviseurs(I) & IIf(I = Diviseurs.Count - 1, " ", ","))
            Next
            Console.WriteLine("pour diviseurs.")
            '' <TEST>
            Dim TimeWatcher As New Diagnostics.Stopwatch()
            TimeWatcher.Start()
            For X As Integer = 0 To 10000
                getDivs(Number)
            Next
            TimeWatcher.Stop()
            Console.WriteLine("La méthode que j'utilise :" & TimeWatcher.ElapsedTicks)
            TimeWatcher.Reset()
            TimeWatcher.start()
            For X As Integer = 0 To 10000
                getDivs_Bad(Number)
            Next
            TimeWatcher.Stop()
            Console.WriteLine("La méthode classique :" & TimeWatcher.ElapsedTicks)
            '' </TEST>
        Loop While True
EndSub:
    End Sub

    Public Function getDivs(ByVal Number As Integer) As List(Of Integer)
        getDivs = New List(Of Integer)
        Dim Div1 As Integer = 1
        Dim Div2 As Integer = Number
        While Div1 <= Div2
            If Div1 * Div2 = Number Then
                getDivs.Add(Div1)
                If Div1 <> Div2 Then getDivs.Add(Div2)
            End If
            Div1 += 1
            Div2 = Number \ Div1
        End While
        getDivs.Sort()
    End Function

    Public Function getDivs_Bad(ByVal Number As Integer) As List(Of Integer)
        Dim getDivs As New List(Of Integer)
        getDivs_Bad = getDivs
        For Div As Integer = 1 To Number
            If Number Mod Div = 0 Then getDivs.Add(Div)
        Next
    End Function

End Module

 Conclusion

COMMENT CA MARCHE ?
====================

Et bien c'est simple ! (Soit N le nombre)

1) La technique habituelle :
On teste tous les nombres (X) de 0 à N, et si N\X=0, on le prend
Cela veut dire que l'on fait N fois l'opération

2) L'autre technique
On teste tous les nombres jusqu'à ce que le premier diviseurs soit plus grand que le deuxième.

Conctrètement : cherchons les diviseurs de 10 :
1) 1 : Divseur, 2 : Diviseur, 3, 4, 5 : Diviseurs, 6, 7, 8, 9, 10 : Diviseur (10=10 : FIN)
2) 1 et 10 : Diviseurs, 2 et 5 : diviseurs, 3 et 3, (4>2 : FIN)
==> J'ai fais 4 opération, alors qu'il en faut 10 avants :

Concrètement, ce gain s'exprime avec la formule suivante :
1) Opérations = N
2) Opérations = (Racine de N) + 1

Si qqun trouve encore mieux (passer par des arrays déjà triés, ...), qu'il poste, moi j'ai donné le principe, je ne compte pas aprofondir (c'est pas tous les jours qu'on chercher les diviseurs de 852047!)

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

22 janvier 2007 20:17:54 :
Explication du principe (et gain)
27 janvier 2007 12:28:07 :
Ajout de fonctions, améliorations de l'algorythme, ...

 Sources du même auteur

Source avec Zip Source avec une capture Source .NET (Dotnet) [VB 8][.NET 2]APPELER UN FICHIER DISTANT AVEC LES MÉTHODES P...
Source avec Zip Source avec une capture Source .NET (Dotnet) [VB 8][.NET 2]UN EDITEUR HTML : APERCU DANS UN IE ET UN MOZI...
Source avec Zip Source avec une capture Source .NET (Dotnet) [VB 8][.NET 2]VBSHELL .NET : UNE SORTE DE POWERSHELL POUR EX...
Source avec Zip Source avec une capture Source .NET (Dotnet) IMITER LA TRANSPARENCE DE LA BARRE DES TITRE DE WINDOWS VIST...
Source avec Zip Source .NET (Dotnet) CREER CLASSES / FONCTIONS .NET PENDANT L'APPLICATION / DURAN...

 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

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture EVALUER UN NOMBRE D'OBJETS AVEC UNE BALANCE ET DEUX ÉCHANTIL... par lexsty
Source avec Zip Source avec une capture NMULOC V2.06 par Softmama
Source avec Zip Source avec une capture Source .NET (Dotnet) NOMBRE EN LETTRES par lermite222
Source avec Zip NOMBRES PREMIERS par MLH19
CHIFFRE EN LETTRE FONCTION par ElDoktor

Commentaires et avis

Commentaire de FREMYCOMPANY le 22/01/2007 20:44:36

Un petit truc, cette fonction peut être utilisiée pour savoir si un nombre est premier ou pas :

Return getDivs(Number).Count == 2 ' Un nombre est premier si il possède 2 diviseurs distincts

Pour connaître le PGCD : Vous faites une itération de (Count-1) --> 0 STEP -1 et vous prenez le premier commun aux deux

Pour le PPCM, ca marche autrement, là faut une liste des nombres premiers et faut diviser le nombre tant que c'est possible par ces nombres et stocker le tout dans un array pour comparer... Mais c'est trop long à poster en commentaire ;)

Commentaire de FREMYCOMPANY le 27/01/2007 12:30:50

Des fonctions ont été ajoutées ;)
N'hésitez pas à commentez la source ;)

Commentaire de pifou25 le 14/03/2007 16:48:46

bonjour,
c'est pas mal!
est ce qu'il est possible en .NET de définir un nouveau type (BigInt par exemple) et de surcharger les opérations + - / * etc à l'aide d'une classe comme c'est fait en cpp ici? http://www.codeproject.com/useritems/BN.asp ...

Commentaire de FREMYCOMPANY le 11/04/2007 11:52:44

Oui, d'ailleurs une source a été postée dans ce sens il y a peu... C# peut-être...

Commentaire de pifou25 le 12/04/2007 14:05:42

je l'ai trouvé, j'ai posté il y a quelques semaines les classes BigInt, Complexe (pour les nombres complexes) et matrice (pour le calcul matriciel) qui sont des structures et permettent donc d'utiliser les opérateurs mathématiques usuels et un peu plus... :) tout en VB.NET!

Commentaire de kanelesavant le 24/07/2008 22:37:58

salut a tout j'ai installer timewatcher mais je ne cé pas comment utilise pour creer des codes merci de me repondre a ce -email kaneassane2008@gmail.com

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Liste de nombres aléatoires [ par Supo ] Hello j'voudrais savoir comment on fait une liste de nombre aléatoire QUI NE RÉPÈTE JAMAIS 2 FOIS LE MÊME NOMBRE. base de données ajout de nombres [ par kidpigeyre ] je cherche à lire un nombre du text1 qui se rapporte à la base de données de lui ajouté un autre nombre et de le replacer dans la base de donnée.Aidez base de données ajout de nombres [ par kidpigeyre ] je cherche à lire un nombre du text1 qui se rapporte à la base de données de lui ajouté un autre nombre et de le replacer dans la base de donnée.Aidez Comment faire pour que l'ordi genere 2 nombres qui divisé entre eux donne un nombre entier [ par RickBlood ] RickBloodmailto: beaumontdominic@hotmail.comPour vous servirJe veut savoir comment on fai manipulation de grand nombres [ par pop49 ] Bonjour, Au-delà de 99999... (15 fois le chiffre 9), un nombre (pourtant défini de type Double) est systématiquement tronqué par VB 6 et noté en écrit nombre aleatoir [ par tarzom ] salut , voila j'ai plusieur label avec des nombres different et je voudrais faire un tirage aleatoir avec ces nombres comment faire ?merci de votre ai Sortie aléatoire "spéciale" !!! [ par rocknroll2 ] Salut à tous.Désolé de solliciter vos connaissances encore une fois !Mon problème:J'ai des données string qui sont à 90 pour cent des nombres (enregis VB6 Supprimer des nombres après la virgule [ par JeffC1977 ] Salut...Je suis &#224; la recherche du code pour pourvoir supprimer une quantit&#233; de chiffre ap&#232;s la virgulePar exemple, j'ai le nombre 52,99


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
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 : 6,302 sec (3)

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