이전 글에서 피보나치 수를 구하다가 빠른 거듭제곱이 나와 따로 글로 남기게 되었다.
거듭제곱을 위해 다음 코드를 작성하면 O(N)의 시간이 필요하다.
def pow(a,n):
r = 1
for _ in range(n):
r *= a
return r
위 코드는 거듭제곱을 an=an−1×a 방식으로 구한다.
이것을 빠르게 해 보자!
n이 짝수이면
an=an/2×an/2
n이 홀수이면
an=an/2×an/2×a 가 된다.
이제 이것을 재귀적으로 계산하면 된다.
예를 들어 360을 계산해보자
360=330×330
330=315×315
315=37×37×3
37=33×33×3
33=31×31×3
5번의 연산으로 360을 계산했다.
시간 복잡도는 계속해서 반으로 나눠 계산하기 때문에 O(logN)이 된다.
많이 쓰이는 알고리즘이라 solved에서 따로 분류가 되어있다.
'프로그래밍 > 알고리즘' 카테고리의 다른 글
[알고리즘] 이분탐색 (0) | 2021.12.23 |
---|---|
[알고리즘] 알고리즘 문제를 풀 때 알면 좋은것들 (0) | 2021.12.05 |
[알고리즘] 모듈러 연산과 페르마의 소정리 (0) | 2021.12.02 |
[알고리즘] 피보나치 수열의 성질 (0) | 2021.12.02 |
[알고리즘] 피보나치 수 구하기 (1) | 2021.12.02 |