📌개요
다양한 알고리즘(암호학, 해시 함수, 알고리즘 최적화 등)에 활용할 수 있는 모듈러 연산(Modular Arithmetic)의 동작 원리를 알아 본다.
📌내용
모듈러 연산(Modular Arithmetic)은 숫자를 특정 값(모듈러, modulus)으로 나눈 나머지를 구하는 연산이다.
기본 개념
$$A \mod M = R$$- $A$ : 피연산자(나누려는 수)
- $M$ : 모듈러 값(나누는 수)
- $R$ : 나머지(결과값)
예를 들어, $17 \mod 5$를 계산하면
$$17÷5=3(몫),나머지=2$$따라서,
$$17 \mod 5=2$$동치 관계
$$A \equiv B \pmod{M}$$이 식은 A와 B가 같은 나머지를 가지는 경우를 의미한다.
$$17 \equiv 2 \pmod{5}$$이는 17과 2는 5로 나눴을 때 같은 나머지를 가진다는 뜻이다.
주요 성질
덧셈
두 수의 합을 구한 뒤 모듈러 연산을 수행하는 것과, 각각의 수에 대해 먼저 모듈러 연산을 수행한 후 더하는 것은 결과가 같다.
$$(A+B) \mod M = [(A \mod M)+(B \mod M)] \mod M$$뺄셈
두 수의 차이를 구한 뒤 모듈러 연산을 수행하는 것과, 각각 모듈러 연산 후 뺀 값을 모듈러 연산하는 것은 동일하다. 다만, 결과가 음수일 경우 $M$을 더해 양수로 변환한다.
$$(A−B) \mod M = [(A \mod M)−(B \mod M) + M] \mod M$$곱셈
두 수의 곱을 직접 모듈러 연산하는 것과, 각각의 수에 대해 먼저 모듈러 연산을 수행한 후 곱한 값을 다시 모듈러 연산하는 것은 동일하다.
$$(A×B) \mod M = [(A \mod M) × (B \mod M)] \mod M$$거듭제곱
거듭제곱 후 모듈러 연산을 수행하는 것과, 밑수를 먼저 모듈러 연산한 후 거듭제곱하여 모듈러 연산하는 것은 동일하다.
빠르게 계산하는 방법: 모듈러 거듭제곱
$$A^B \mod M=[(A \mod M)^B] \mod M$$나눗셈
모듈러 연산에서 나눗셈은 일반적인 나눗셈이 아니라, $B$의 모듈러 역원(곱셈 역원)을 찾아 곱셈으로 변환하여 계산해야 한다.
역원 개념 필요, 보통 확장된 유클리드 알고리즘 사용
$$(A/B) \mod M=(A×B^{−1}) \mod M$$Pseudo Code
각 연산에 대해 Pseudo code
를 작성해 보자.
기본 모듈러 연산
시간 복잡도: O(1)
|
|
- 입력: $A,M$
- 출력: $A \mod M$
모듈러 덧셈
시간 복잡도: O(1)
|
|
모듈러 뺄셈
시간 복잡도: O(1)
|
|
모듈러 곱셈
시간 복잡도: O(1)
|
|
모듈러 거듭제곱 (빠른 거듭제곱)
거듭제곱을 직접 계산하면 O(B) 이므로, 빠르게 계산하는 방법(O(log B))을 사용해야 한다.
시간 복잡도: O(log B) (빠른 거듭제곱)
|
|
모듈러 나눗셈 (모듈러 역원)
시간 복잡도: O(log M)
$A/B \mod M$ 를 계산하려면, $B$의 모듈러 역원 $B^{-1}$을 찾아야 한다.
페르마의 소정리, M이 소수일 때
$$ B^{−1} \equiv B^{M−2} \pmod{M} $$
|
|
- M이 소수일 때만 사용 가능
🎯결론
- 모듈러 연산은 시간복잡도 O(1)로 계산할 수 있어 효율적이다.
- 거듭제곱은 O(log B)로 최적화 가능하다.
- 나눗셈은 모듈러 역원을 활용해야 한다.
- 암호학, 해시 함수, 수학적 최적화 등에 널리 사용된다.
⚙️EndNote
Markdown 수학식 표현
Markdown
에서 수학식을 표현하는 방법은 LaTeX 수식
(TeX 수식) 또는 MathJax
라고 한다.
- LaTeX(레이텍) 수식: 수학 기호와 공식을 작성하는 데 사용되는 문법
- MathJax(매스잭스): 웹에서 LaTeX 스타일의 수식을 렌더링하는 라이브러리
인라인 수식
예시
|
|
결과
인라인 수식: $A \mod M=R$
블록 수식
예시
|
|