Valeur puissance

rouday55 Messages postés 40 Date d'inscription jeudi 28 février 2008 Statut Membre Dernière intervention 8 décembre 2011 - 5 mars 2008 à 18:50
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 - 6 mars 2008 à 22:15
hello !
je suis donc a ma 4eme heure de programmation en VBa et j'ai trouvé quelques exercices mais certaines réponses me sont introuvables pouvez m'aider  s il vous plait?
1) Ecrire une fonction recursive valeurPuissanceRec (VPR) qui étant donnés un nombre x et un exposant n (positif ou negatif) calcule x puissance n en faisant n multiplications successives 

2) Ecrire une fonction itérative valeurPuissanceIte (VPI) qui étant donnés un nombre x et un exposant n (positif ou negatif) calcule x puissance n en faisant n multiplications successives 

3)Ecrire une fonction recursive valeurPuissanceRecBis (VPRB) répondant a la meme spécification, qui ne fait que log_2(n)multiplications pour calculer x puissance n

4) Ecrire une fonction itérative valeurPuissanceItTer(VPIT) répondant a la meme spécification, qui ne fait que  log_2(n) ( a lire log indice 2) multiplications pour calculer x puissance n

J'ai reussi la premiere et la deuxieme question par contre je ne vois pas du tout pour les 2 dernieres. Merci de m eclairer

16 réponses

us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
5 mars 2008 à 21:18
Bonsoir,

Cherche du côté de l'exponentiation rapide...

Amicalement,
Us.
0
rouday55 Messages postés 40 Date d'inscription jeudi 28 février 2008 Statut Membre Dernière intervention 8 décembre 2011
5 mars 2008 à 22:23
je ne connais pas, ca te dérange de m expliquer vite fait comment ca se passe.?
merci
0
rouday55 Messages postés 40 Date d'inscription jeudi 28 février 2008 Statut Membre Dernière intervention 8 décembre 2011
5 mars 2008 à 22:44
un code comme ca c est bon ?
Function vpn (byval x as long n as long ) as double<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??>








    If n = 0 then








        1








     Else








        if n = 1 then








                   x








        else








                  tmp = vpn (x, n/2)








     
     if n pair then        








            tmp * tmp








     else








         x * tmp * tmp








     end if







  end if







end if







end  function
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
5 mars 2008 à 22:47
coté maths, je saurais pas dire, mais y'a un semblant d'optimisation

Renfield
Admin CodeS-SourceS- MVP Visual Basic
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
rouday55 Messages postés 40 Date d'inscription jeudi 28 février 2008 Statut Membre Dernière intervention 8 décembre 2011
5 mars 2008 à 23:18
c est a dire que tu penses que ca pourrait etre bon comme code
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
6 mars 2008 à 08:35
Bonjour,

Le logarithme d'un nombre porté x à la puissance y est tout simplement égal au logartithme de x multiplié par le logarithme de y.

L'exponentielle d'un logarithme permet d'extraire le nombre correspondant à ce logarithme

Ta fonction est dès lors tout simplement celle du traitement d'une multiplication en traitant par addition !!!

voilà en itérativité, donc :

Private Sub Command5_Click()
  MsgBox tou(2, 3)
End Sub



Private Function tou(nb As Integer, puis As Integer) As Double
  While puis > 0
    tou = tou + Log(nb)
    puis = puis - 1
  Wend
  tou = Exp(tou)
End Function


Je te laisse maintenant traiter en récursivité (c'est fastoche) car c'est là ton exercice ... qui sera noté !!!
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
6 mars 2008 à 08:48
Euh ...(me suis planté en frappant )

Corriger

Le logarithme d'un nombre porté x à la puissance y est tout simplement égal au logartithme de x multiplié par y. (pas par le logarithme de y !!!)

Regarde ceci, destiné, sans même une fonction, à mieux comprendre l'expression mathématique

  'ici : calcul de 4 à la puissance 3
  MsgBox Exp(Log(4) * 3)
0
rouday55 Messages postés 40 Date d'inscription jeudi 28 février 2008 Statut Membre Dernière intervention 8 décembre 2011
6 mars 2008 à 14:53
Merci beaucoup jmfmarques

Je ne connaissais pas trop les rapports entre les fonctions log et exp. Mais juste une petite derniere question a quoi sert (je connais juste MsgBox mais je ne vois pas ce qu il affiche ici) :
Private Sub Command5_Click()
  MsgBox tou(2, 3)
End Sub
?

Merci
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
6 mars 2008 à 15:14
Il est là pour afficher le résultat (donné par la fonction itérative tou) de 2 à la puissance 3 ...
0
rouday55 Messages postés 40 Date d'inscription jeudi 28 février 2008 Statut Membre Dernière intervention 8 décembre 2011
6 mars 2008 à 15:16
ok c est un test en fait ?
0
rouday55 Messages postés 40 Date d'inscription jeudi 28 février 2008 Statut Membre Dernière intervention 8 décembre 2011
6 mars 2008 à 15:39
En recursion :
Ca donne :
Function puisRec (Byval x as integer, Byval n as integer) as Long
   If (n = 0) Then
     puisRec = 1
   Else
     puisRec = puisRec (x, n - 1) * x
   End If
End Function

NON?
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
6 mars 2008 à 17:23
C'est là une fonction récursive et elle est juste ...

Elle ne répond toutefois pas à l'exercice qu'il t'est demandé de faire

pour mémoire :

3)Ecrire une fonction recursive valeurPuissanceRecBis (VPRB) répondant a la meme spécification, qui ne fait que log_2(n)multiplications  pour calculer x puissance n




et tu n'utilises pas le logarithme !!!
0
rouday55 Messages postés 40 Date d'inscription jeudi 28 février 2008 Statut Membre Dernière intervention 8 décembre 2011
6 mars 2008 à 18:55
j'ai fait de la programmation recursive en scheme et je me souviens a peu prés d une définition de la puissance dichotomique; je ne sais pas si le cas peut s appliquer ici; toujours est il que je suis la pour apprendre :)
Function VPRB (byval x as integer, byval n as integer) as long
     if  n = 0 Then
         1<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??>

    Else  
       if  even ? n Then

     ((VPRB  (x * x) (quotient n 2)))

   Else( x  *(VPRB (x * x) (quotient n 2)))
  End if
end function

c est possible ca?
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
6 mars 2008 à 20:00
Je n'en sais rigoureusement rien... (ce que tu montres n'est pas du VB ...)

Ce que je vois par contre (ou ne vois pas du tout, même), c'est qu'il n'y a là aucune utilisation du logarithme ...

Et la lecture de ton énnoncé me donne à penser que c'est ce qui est attendu (une fonction récursive de multiplication utilisant le logaritme)

Je t'ai montré par ailleurs comment faire de façon itérative en utilisant la multiplication et  le logarithme.

Je t'ai précisé que la récursivité serait dans ce cas celle d'une simple multiplication (il te suffit de transformer maintenant l'itérativité en récursivité)...
La chose est simple .... désolé...(je ne compte ni faire cet exercice à ta place, ni continuer à répondre à tes différentes tentatives en te disant si "c'est bon, çà" ou "c'est pas bon, çà"... C'est (je te le rappelle) un exercice que TU dois faire ... et il est fort simple !
0
rouday55 Messages postés 40 Date d'inscription jeudi 28 février 2008 Statut Membre Dernière intervention 8 décembre 2011
6 mars 2008 à 21:59
oui merci pour ton aide c est tres gentil. Ce que je pense c est qu il ne faut pas utiliser le log en fait mais en realité il y  a plusieurs facons de calculer x a la puissance n. Suivant les codes différents le programme fait plus ou moins de calculs plus ou moins rapidement. Par exemple on peut calculer x a la puissance n en passant par la fonction x au carré. A partir de la il n y a donc qu une seule évalutation de x puissance n/2. Il y a une facon de programmer un code qui ne fera que log2(n) opérations. Enfin voilou c est pour ca que je bloque mais je finirai par debloquer
bonne soirée et merci encore.
0
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
6 mars 2008 à 22:15
Bonsoir à tous,

Oh, là... Jmfmarques tu t'égares, me semble-t-il...

La substance de la question est :

"Ecrire une fonction qui en log_2(n) multiplications donne x puissance n"

ensuite, on doit la décliner comme on veut (itératif ou récursif)...
L'utilisation du LOG pour le calcul de x^n, est possible mais ne répond pas à la question, car on doit faire n opérations, et non log2(n) opérations... c'est toute la nuance, il me semble...

Le seule algorithme possible est l'exponentiation rapide ou dichotomique (c'est juste une différence d'appellation)...

IL existe 2 sources sur VBF, et un snippets, comme exemple... il suffit de rechercher un petit peu...

http://www.codyx.org/snippet_exponentiation-dichotomique_384.aspx
http://www.vbfrance.com/codes/EXPONENTIATION-RAPIDE_34807.aspx
http://www.vbfrance.com/code.aspx?ID=31388

Ce dernier lien donne aussi une explication...

Amicalement,
Us.
0
Rejoignez-nous