이진 거듭제곱(Binary Exponentiation)은 거듭제곱 연산인 을 빠르게 계산하기 위한 알고리즘으로, 지수를 이진수로 표현하여 효율적으로 계산하는 방식이다. 이 방법은 특히 큰 지수 을 빠르게 처리하는 데 유용하다.
일반적으로 거듭제곱 은 다음과 같이 표현할 수 있다.
하지만 이 방식은 시간복잡도가 이 되어, 지수 이 커지면 비효율적이다.
이진 거듭제곱법은 이를 최적화하여 에 수행한다.
이 알고리즘은 다음의 두 가지 원칙에 근거한다.
이진 거듭제곱의 핵심은 지수 을 이진수로 표현한 뒤, 그 비트를 따라 계산하는 것이다.
예를 들어, 이라고 하면, 이를 이진수로 나타내면 가 된다.
따라서 다음과 같은 방식으로 계산할 수 있다.
즉, 의 제곱을 반복해서 계산하며, 필요한 부분만 곱하여 결과를 얻는다.
이진 거듭제곱의 절차는 다음과 같다.
결과값(result)을 1로 초기화한다.
지수 의 이진수를 끝에서부터 순회하면서:
1
이면, result에 현재의 를 곱한다.모든 비트를 처리하면, 최종 result가 이 된다.
의사 코드 (Pseudo Code)
function binary_exponentiation(a, n):
result ← 1
while n > 0:
if (n mod 2) = 1:
result ← result × a
a ← a × a
n ← ⌊n / 2⌋
return result
이진 거듭제곱은 각 반복에서 지수 을 절반씩 줄여나가므로, 총 반복 횟수는 이다.
따라서 이 알고리즘의 시간 복잡도는 다음과 같다.
다음은 파이썬으로 구현한 예시이다.
def binary_exponentiation(a, n):
result = 1
while n > 0:
if n % 2 == 1:
result *= a
a *= a
n //= 2
return result
# 예시 사용법
print(binary_exponentiation(2, 13)) # 출력: 8192
이진 거듭제곱법은 특히 다음과 같은 경우에 유용하다.
모듈러 지수(modular exponentiation): 암호학에서 널리 사용됨
큰 수의 거듭제곱 계산 시 시간 최적화가 필요한 경우
행렬 거듭제곱 등 반복 연산이 많은 수학 및 알고리즘 문제에서의 최적화
큰 숫자의 지수를 계산할 때 중간 결과가 매우 커지는 것을 막기 위해 모듈러 연산을 함께 사용한다.
예를 들어 은 중간 연산 단계마다 mod 연산을 수행하면 된다.
def binary_exponentiation_mod(a, n, mod):
result = 1
a %= mod
while n > 0:
if n % 2 == 1:
result = (result * a) % mod
a = (a * a) % mod
n //= 2
return result
# 예시 사용법
print(binary_exponentiation_mod(2, 13, 1000)) # 출력: 192
이진 거듭제곱은 큰 지수 연산을 빠르고 효율적으로 처리할 수 있는 필수적인 알고리즘이다.
컴퓨터공학에서 매우 자주 활용되며, 시간 효율성 면에서 큰 장점을 가진다.
지수가 큰 경우에 단순 반복보다 반드시 이진 거듭제곱법을 사용하는 것이 바람직하다.