// L-22 MCS 360 Wed 13 Oct 2010 : fast_power.cpp

/* Via recursion we can compute x^n with O(log_2(n)) multiplications. */

#include <iostream>
#include <iomanip>
using namespace std;

double linear_power ( double a, int n );
// returns a^n computed in a linear way

double recursive_power ( double a, int n);
// returns a^n computed in a recursive way

int main()
{
   cout << "give a double : ";
   double x; cin >> x;

   cout << "give exponent : ";
   int e; cin >> e;

   double y1 = linear_power(x,e);
   double y2 = recursive_power(x,e);

   cout << setprecision(15)
        << x << "^" << e << " = " << y1 << endl;
   cout << setprecision(15)
        << x << "^" << e << " = " << y2 << endl;

   return 0;
}

double linear_power ( double a, int n )
{
   double y = 1.0;

   for(int i=0; i<n; i++) y = y*a;

   return y;
}

double recursive_power ( double a, int n)
{
   if(n==0)
      return 1.0;
   else if(n==1)
      return a;
   else
   {
      int d = n / 2;
      int r = n % 2;

      double y = recursive_power(a,d);
      y = y*y;

      if(r==0)
         return y;
      else
      {
         double z = recursive_power(a,r);
         return y*z;
      }
   }
}

