61 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			61 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
---
 | 
						|
title: Exponentiation
 | 
						|
localeTitle: Возведение
 | 
						|
---
 | 
						|
## Возведение
 | 
						|
 | 
						|
Для двух целых чисел a и n, напишите функцию для вычисления a ^ n.
 | 
						|
 | 
						|
#### Код
 | 
						|
 | 
						|
Алгоритмическая парадигма: разделите и покорите.
 | 
						|
 | 
						|
```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); 
 | 
						|
 } 
 | 
						|
```
 | 
						|
 | 
						|
Сложность времени: O (n) | Космическая сложность: O (1)
 | 
						|
 | 
						|
#### Оптимизированное решение: 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; 
 | 
						|
 } 
 | 
						|
```
 | 
						|
 | 
						|
## Модульное возведение в степень
 | 
						|
 | 
						|
Учитывая три числа x, y и p, вычислить (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; 
 | 
						|
 } 
 | 
						|
```
 | 
						|
 | 
						|
Сложность времени: O (Log y). |