Notice
Recent Posts
Recent Comments
Link
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

공hannah부

거듭제곱 본문

공부/알고리즘

거듭제곱

Hannah0226 2023. 8. 3. 23:11

거듭제곱

기본 거듭제곱

  • 음이 아닌 정수 a, x와 자연수 m에 대해 a^x(mod m)  ← 모듈러 취하는 이유: integer overflow 때문!
  • 거듭 제곱 정의대로 a를 x번 곱하면 된다.
  • 시간 복잡도: O(x)

 

분할정복을 이용한 거듭제곱 (더 빠른 방법)

  • x가 짝수일 때 a^x = a^(x/2) * a^(x/2) 로 구하기
  • x가 홀수일 때 a^x = a^(x/2) * a^(x/2) * a 로 구하기
  • 시간 복잡도: O(logx)

C++로 구현

  • 반복문
int m;
int fpow2(int a, int x) {
	int ret = 1;
	while (x) {
		if (x % 2) ret = ret * a % m;
		a = a * a % m;
		x /= 2;
	}
	return ret;
}

 

  • 재귀문
int m;
int fpow1(int a, int x) {
	if (x == 0) return 1;
	int ret = fpow1(a, x / 2);
	ret = ret * ret % m;
	if (x % 2) ret = ret * a % m;
	return ret;
}