-
Notifications
You must be signed in to change notification settings - Fork 15
/
Copy pathfast_power.cpp
58 lines (44 loc) · 1.05 KB
/
fast_power.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include<iostream>
using namespace std;
double fastPow(double x, long long n)
{
if (n == 0) {return 1.0;}
double half = fastPow(x, n / 2);
// x^n = x^{n/2} * x^{n/2}
if (n % 2 == 0)
return half * half;
else
return half * half * x;
}
double fastPow_iter(double x, long long n)
{
double ans = 1.0;
double current_product = x;
for (long long i = n; i; i /= 2)
{
if (i % 2 == 1){ans = ans * current_product;}
current_product = current_product * current_product;
}
return ans;
}
double myPow(double x, int n, bool is_recursive)
{
long long N = n;
if (N < 0)
{
x = 1 / x;
N = -N;
}
return is_recursive ? fastPow(x, N) : fastPow_iter(x, N);
}
int main()
{
int n = 10; //power
double x = 2; //base
cout << "Computing x^n recursively: ";
cout << myPow(x, n, true); //O(log n) time, O(log n) space
cout << "\nComputing x^n iteratively: ";
cout << myPow(x, n, false); //O(log n) time, O(1) space
cout << endl;
return 0;
}