Ridicare la putere în timp logaritmic

09.07.2024

Doresc să pun în evidenţă o modalitate simplă de calcul a valorii expresiei xn, unde x este un număr real, iar n este număr natural. O primă variantă, cea care se învaţă odată cu instrucţiunile repetitive, este bazată pe relaţia:

xn = x * x * ... * x, adică înmulţire repetată de n ori a lui x

Funcţia care realizează acest lucru este:

double Putere(double x, int n) { double p = x ; for (int i = 1 ; i < n ; i++) p *= x ; return p ; }

Există însă o soluţie mai rapidă, bazată pe relaţiile următoare:

  • dacă n este impar, atunci xn = xn-1 * x
  • dacă n este par, atunci xn = xn/2 * xn/2

În acest fel, numărul total de operaţii de înmulţire va scădea semnificativ. De exemplu pentru calculul lui x13 se vor efectua numai 5 înmulţiri, iar x100 doar 8 înmulţiri. Funcţia este următoarea:

double PutereLogaritmic(double x, int n) { double p = 1 ; while (n > 0) { if (n & 1) // n este impar { p *= x; n-- ; } x = x * x ; n >>= 1 ; // sau n = n / 2 } return p ; }

Share