begin process at 2010 02 10 15:00:05
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Maths

 > EXPONENTIATION RAPIDE

EXPONENTIATION RAPIDE


 Information sur la source

Note :
7,5 / 10 - par 4 personnes
7,50 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Maths Classé sous :exponentiation, exposants, tempsdeprocédure, vérificationdonnées Niveau :Débutant Date de création :26/11/2005 Date de mise à jour :26/11/2005 16:57:13 Vu / téléchargé :4 721 / 159

Auteur : Julien39

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

 Description

Cliquez pour voir la capture en taille normale
Ce code donne la valeure de l'exposant d'un nombre, l'ordre de grandeur et la rapidité sont de l'ordre de l'exposant pas défaut de Windows, il est possible de le vérifier avec le zip qui contient les deux facons de calculer et qui mesure le temps d'execution.

MERCI A PCPT POUR QueryPerformance AINSI QUE POUR SES NOMBREUSES CONTRIBUTIONS SUR LE FORUM VBFRANCE.

Source

  • Function EXPO(x As String, n As Integer) As String
  • r = 1 'initialisation de ce qui sera le résultat
  • If n = 0 Then
  • EXPO = 1
  • End If
  • 'Nous prendrons par convention 0^0=1
  • Do
  • If n Mod 2 = 0 Then
  • n = n / 2
  • x = x * x
  • Else: n = (n - 1) / 2
  • r = r * x
  • If n <> 0 Then
  • x = x * x
  • End If
  • End If
  • Loop While n <> 0
  • 'Cette méthode est tres simple à comprendre sur un exemple
  • '13^5, 5 est impair et 13^5 = 13*(13^2)^2
  • EXPO = r
  • End Function
Function EXPO(x As String, n As Integer) As String

r = 1  'initialisation de ce qui sera le résultat

If n = 0 Then
   EXPO = 1
End If

'Nous prendrons par convention 0^0=1


Do


   If n Mod 2 = 0 Then
      n = n / 2
      x = x * x
      
   Else: n = (n - 1) / 2
      r = r * x
      
      If n <> 0 Then
         x = x * x
      
      End If
     
   End If
   
   
Loop While n <> 0


'Cette méthode est tres simple à comprendre sur un exemple
'13^5,  5 est impair et 13^5 = 13*(13^2)^2


EXPO = r


End Function

 Conclusion

Cette méthode est assez rapide mais elle n'est pas parfaite, en la mettant sur ce sit je veux bien sur la partager mais j'espere aussi qu'on me donnera des conseils afin d'améliorer encore la vitesse de calcul.

 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

26 novembre 2005 16:57:14 :
oubli

 Sources du même auteur

Source avec Zip CARRÉ PAR MÉTHODE DE L'ABAQUE
Source avec Zip Source avec une capture ETUDE DE FONCTIONS ALÉATOIRES
Source avec Zip Source avec une capture FONCTION VRAIMENT ALÉATOIRE
Source avec Zip Source avec une capture MATHÉMATIQUES PÉDAGOGIQUES
Source avec Zip Source avec une capture DESSIN TYPE PAINT MAIS ORIENTÉ MATHS

 Sources de la même categorie

Source avec Zip Source .NET (Dotnet) PISH2010-VB2008 par SaintMaur
Source avec Zip Source avec une capture PI-SH-2010-VB6 par SaintMaur
ET... PI... par us_30
Source avec Zip Source avec une capture CHIFFRAGE ET DECHIFFRAGE FONCTION AFFINE par tresorsdevie
NB PREMIER : TEST DE FERMAT ET DE MILLER-RABIN par us_30

Commentaires et avis

Commentaire de DARKSIDIOUS le 26/11/2005 16:16:33 administrateur CS

erf, ton algorithme est déjà connu depuis belle lurette, et je pense d'ailleurs qu'il s'agit de la meilleure solution actuellement.

Pourquoi tu n'obtiens pas la même rapidité que la fonction standard de VB ? Sûrement parce que la fonction standard est optimisée au max : codée en C (voir même assembleur), sûrement une gestion très réduite des erreurs etc.

Bref, faut pas trop croire qu'en VB, on trouve des fonctions plus rapide que les fonctions standard, bien qu'il suffit d'avoir une idée de génie parfois pour trouver un algorithme encore plus efficace que ceux déjà existants.

DarK Sidious

Commentaire de PCPT le 26/11/2005 16:19:58 administrateur CS

rholala....
des variant? des int au lieu de long? des string au lieu long ou double.
le currency qui reçoit inutilement le retour du msgbox.. (donc un VbYes)...

ton code est entièrement à revoir. et à remettre en ordre également. très peu de procédures, mais dificilement lisible....
ps : un p'tit "merci" pour QueryPerformance m'aurait fait plaisir, mais bon....

(pas noté)
@+
PCPT  [AFCK]

Commentaire de Julien39 le 26/11/2005 16:53:11

J'ai vu cette méthode récemment mais je ne savais pas qu'elle était très connue, si elle est déjà très présente sur le site enlevez la source mais il ne me semble pas car je en l'ai jamais rencontrée, même si elle n'apporte rien au niveau de la vitesse on comprends mieux ce qui se passe du loins je pense.

PCPT : Pour les variables l'unique que je déclare en variant est obligatoirement déclarée comme ceci car c'est pour permettre une correction, les string au lieu des long permettent d'avoir une plus grande plage de valeur, pour les autres tu as raison mais j'ai du mal avec les variables.

Enfin Mea-culpa, j'aurai réparé l'oubli dès que la mise à jour sera effective.

Commentaire de DARKSIDIOUS le 26/11/2005 17:13:35 administrateur CS

Non je veux dire que ce code est très connu des algorithmiciens, par forcément de VBFrancistes ;)

ben si tu veux un code un peu plus optimisé déjà :

Function EXPO(x As long, n As Integer) As long

  Dim r As Long
  r = 1
  If n = 0 Then
    EXPO = 1
    Exit Function
  End If

  Do
  
    If n Mod 2 = 0 Then
       n = n / 2
       x = x * x
    Else
      n = (n - 1) / 2
    End If

    r = r * x
    If n <> 0 Then x = x * x

  Loop While n <> 0

  EXPO = r

End Function


Le typage des données est très important, s'il n'est pas fait correctement, ton algorithme sera forcément plus long à exécuter !

DarK Sidious

Commentaire de violent_ken le 27/11/2005 11:15:42

Salut !
Concernant les variables, il y a des problèmes de déclaration. Mais bon. Concernant l'algo en lui même, la vitesse est en effet équivalente à x^n directement calculé.

Je vous propose deux autres méthodes :

'1) calcul direct avec x^n=exp(n*ln(x))
Labresult.Caption = Exp(Txtexpo * Log(Txtnbr))

'2) x^n=x*x*x*...*x n fois
Function EXPO2(x As Long, n As Long) As Long
EXPO2 = Abs((n > 0) + (n = 0)): r = 1
While r < x
EXPO2 = EXPO2 * n
r = r + 1
Wend
End Function

Les vitesses sont là aussi équivalentes.
Cependant, une dernière remarque : il faut tester plusieurs fois les fonctions pour vraiment déterminer leur vitesse :
exemple :

Dim x As Long
Call QueryPerformanceCounter(TimeStart)
For x = 1 To 200000
     Labresult.Caption = EXPO2(Txtexpo, Txtnbr)
Next x
Call QueryPerformanceCounter(TimeStop)

et bien sur compiler le tout pour avoir des temps réalistes.

Voilà !
@+

Commentaire de us_30 le 27/11/2005 13:56:31

Bonjour,

Le code : http://www.vbfrance.com/code.aspx?ID=31388 me semble être meilleur, pour réaliser cet algo, même si il est encore un poil optimisable (mais pas beaucoup)...

Cet algo, semble être présent que 2 fois sur VBF, d'après mes recherches...

Amicalement,
Us.

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Comment ecrire des exposants chimique [ par aercilla ] Je m'explique :On m'a demander de pouvoir inserer des exposants chimique avant et apres un charactere classic.exemple : A² ou ²B² (désoler, je ne sa


Nos sponsors


Sondage...

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

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,530 sec (4)

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