59 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			59 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| ---
 | |
| title: Exponentiation
 | |
| ---
 | |
| ## Exponentiation
 | |
| 
 | |
| Given two integers a and n, write a function to compute a^n.
 | |
| 
 | |
| #### Code
 | |
| 
 | |
| Algorithmic Paradigm: Divide and conquer.
 | |
| 
 | |
| ```C
 | |
| int power(int x, unsigned int y) { 
 | |
|     if (y == 0) 
 | |
|         return 1; 
 | |
|     else if (y%2 == 0) 
 | |
|         return power(x, y/2)*power(x, y/2); 
 | |
|     else
 | |
|         return x*power(x, y/2)*power(x, y/2); 
 | |
| } 
 | |
| ```
 | |
| Time Complexity: O(n) | Space Complexity: O(1)
 | |
| 
 | |
| ####  Optimized Solution: O(logn)
 | |
| 
 | |
| ```C
 | |
| int power(int x, unsigned int y) { 
 | |
|     int temp; 
 | |
|     if( y == 0) 
 | |
|         return 1; 
 | |
|     temp = power(x, y/2); 
 | |
|     if (y%2 == 0) 
 | |
|         return temp*temp; 
 | |
|     else
 | |
|         return x*temp*temp; 
 | |
| } 
 | |
| ```
 | |
| 
 | |
| ## Modular Exponentiation
 | |
| 
 | |
| Given three numbers x, y, and p, compute (x^y) % p
 | |
| 
 | |
| ```C
 | |
| int power(int x, unsigned int y, int p) { 
 | |
|     int res = 1;  
 | |
|     x = x % p; 
 | |
|     while (y > 0) {  
 | |
|         if (y & 1) 
 | |
|             res = (res*x) % p; 
 | |
|   
 | |
|         // y must be even now 
 | |
|         y = y>>1; 
 | |
|         x = (x*x) % p;   
 | |
|     } 
 | |
|     return res; 
 | |
| } 
 | |
| ```
 | |
| Time Complexity: O(Log y).
 |