Processing math: 100%

새소식

반응형
컴퓨터공학 (Computer Science)/알고리즘 | Algorithm

거듭제곱 형태의 나머지를 log n만에 계산하는 방법

  • -
반응형

1. Introduction

abmodm형태를 계산하는 방법은 여기에 포스팅했다.

이번 포스팅에서는 이것을 돌리기 위한 코드를 최적화하는 방법을 소개한다.

2. Approach

ab의 형태의 자연수에 대한 나머지 계산에 대한 방법들을 소개한다.

2.1 일반적인 방법

def powMod1(base, index, mod): r = 1 for i in range(index): r *= base r %= mod return r

시간복잡도가 O(b)이다. r이 ab까지 커지기 때문에 overflow일어나기 매우 쉽다.

2.2 개선된 방법

def powMod2(base, index, mod): if index == 1: return base if index % 2 == 0: r = powMod2(base, index // 2, mod) return (r ** 2) % mod else: return (base * powMod2(base, index - 1, mod)) % mod

합동식 연산의 특성을 이용한 방법이다. 시간복잡도가 O(logb)으로 줄어든다.

2.3 최적화

def powMod3(base, index, mod): r = 1 while index: if index & 1: r = (r * base) % mod base = (base ** 2) % mod index >>= 1 return r

재귀를 반복문으로 고치고, 비트연산자를 사용한다.

반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.