EXPONENTIATION RAPIDE

cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 - 26 nov. 2005 à 16:16
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 - 27 nov. 2005 à 13:56
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/34807-exponentiation-rapide

us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
27 nov. 2005 à 13:56
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.
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 2
27 nov. 2005 à 11:15
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à !
@+
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
26 nov. 2005 à 17:13
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
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
26 nov. 2005 à 16:53
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.
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
26 nov. 2005 à 16:19
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]
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
26 nov. 2005 à 16:16
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
Rejoignez-nous