[Algorithm] 분할정복을 이용한 거듭제곱
728x90
반응형
# 분할정복을 이용한 거듭제곱
- C**n연산은 x를 n번 곱하므로 O(N)이지만, 이 방법을 사용하면 O(logN)에 거듭제곱 값을 구할 수 있다.
- 아래 코드에서 fpow함수가 그 방법이다.
- n이 1이면 그냥 C의 1제곱이므로 return C를 해준다.
- n이 2이상일 때, C의 n제곱은 다음과 같다.
- n이 짝수이면 윗줄의 식을 만족하고, n이 홀수이면 아래줄의 식을 만족한다.
코드로 짜면 다음과 같다.
1. 재귀사용
def fpow(C, n):
if n == 1:
return C
else:
x = fpow(C, n//2)
if n % 2 == 0:
return x * x
else:
return x * x * C
2. 반복문 사용
- n & 1은 n이 짝수이면 0이므로 False이고, n이 홀수이면 1이어서 True이다.)
- n >> 1은 비트연산에서 오른쪽으로 비트를 하나씩 미는 것이다. 즉, n //= 2와 같다)
- 반복문이 약간 빠르다.
def fpow(C, n):
res = 1
while n:
if n & 1:
res *= C
C *= C;
n >> 1
return res
대표적인 문제들로는
등등이 있다.
728x90
반응형
'알고리즘, Module > 알고리즘' 카테고리의 다른 글
[Algorithm] Trie(트라이) 자료구조 (0) | 2021.09.30 |
---|---|
[Algorithm] 이분탐색(Binary Search) vs 매개변수 탐색(Parametric Search) (0) | 2021.08.01 |
[Algorithm] 유클리드 호제법 (0) | 2021.03.24 |
TAGS.