Valeur puissance

Signaler
Messages postés
40
Date d'inscription
jeudi 28 février 2008
Statut
Membre
Dernière intervention
8 décembre 2011
-
Messages postés
2065
Date d'inscription
lundi 11 avril 2005
Statut
Membre
Dernière intervention
14 mars 2016
-
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

Messages postés
2065
Date d'inscription
lundi 11 avril 2005
Statut
Membre
Dernière intervention
14 mars 2016
10
Bonsoir,

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

Amicalement,
Us.
Messages postés
40
Date d'inscription
jeudi 28 février 2008
Statut
Membre
Dernière intervention
8 décembre 2011

je ne connais pas, ca te dérange de m expliquer vite fait comment ca se passe.?
merci
Messages postés
40
Date d'inscription
jeudi 28 février 2008
Statut
Membre
Dernière intervention
8 décembre 2011

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
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
69
coté maths, je saurais pas dire, mais y'a un semblant d'optimisation

Renfield
Admin CodeS-SourceS- MVP Visual Basic
Messages postés
40
Date d'inscription
jeudi 28 février 2008
Statut
Membre
Dernière intervention
8 décembre 2011

c est a dire que tu penses que ca pourrait etre bon comme code
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
26
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é !!!
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
26
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)
Messages postés
40
Date d'inscription
jeudi 28 février 2008
Statut
Membre
Dernière intervention
8 décembre 2011

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
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
26
Il est là pour afficher le résultat (donné par la fonction itérative tou) de 2 à la puissance 3 ...
Messages postés
40
Date d'inscription
jeudi 28 février 2008
Statut
Membre
Dernière intervention
8 décembre 2011

ok c est un test en fait ?
Messages postés
40
Date d'inscription
jeudi 28 février 2008
Statut
Membre
Dernière intervention
8 décembre 2011

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?
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
26
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 !!!
Messages postés
40
Date d'inscription
jeudi 28 février 2008
Statut
Membre
Dernière intervention
8 décembre 2011

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?
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
26
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 !
Messages postés
40
Date d'inscription
jeudi 28 février 2008
Statut
Membre
Dernière intervention
8 décembre 2011

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.
Messages postés
2065
Date d'inscription
lundi 11 avril 2005
Statut
Membre
Dernière intervention
14 mars 2016
10
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.