1. 정의
모듈러 역원(modular multiplicative inverse)이란, 두 정수 a와 m에 대하여 다음 식을 만족하는 정수 a−1을 말한다.
a⋅a−1≡1(modm)
즉, a⋅a−1을 m으로 나누었을 때 나머지가 1이 되도록 하는 정수 a−1을 의미한다.
- 여기서 정수 a−1은 흔히 a의 모듈러 역원이라고 부른다.
2. 존재 조건
정수 a의 모듈러 역원 a−1이 존재하려면, 다음과 같은 조건이 반드시 성립해야 한다.
gcd(a,m)=1
즉, a와 m이 서로소(coprime)일 때만 모듈러 역원이 존재한다.
이유:
-
gcd(a,m)=1일 때, 베주 항등식(Bézout’s Identity)에 따라 정수 x,y가 존재하여
ax+my=1
를 만족하므로, 양변을 모듈러 연산하면
ax≡1(modm)
이 되어, x가 a의 모듈러 역원이 된다.
3. 계산 방법
(1) 확장 유클리드 알고리즘 (Extended Euclidean Algorithm)
모듈러 역원을 찾는 대표적인 방법은 확장 유클리드 알고리즘을 사용하는 것이다.
알고리즘의 과정:
두 정수 a, m에 대하여 확장 유클리드 알고리즘을 이용해 다음을 만족하는 x,y를 찾는다.
ax+my=gcd(a,m)=1
이때의 x값을 m으로 나눈 나머지가 바로 모듈러 역원이다.
예제
a=3, m=11일 때 모듈러 역원을 찾는다.
확장 유클리드 알고리즘을 적용하면:
- 11=3×3+2
- 3=2×1+1
- 2=1×2+0
역으로 올라가면서 1을 표현하면,
- 1=3−2×1
- 1=3−(11−3×3)×1=4×3−1×11
따라서
4⋅3≡1(mod11)
즉, 모듈러 역원은 4이다.
(2) 페르마의 소정리 (Fermat’s Little Theorem)
모듈러 연산의 나눗셈에서 나누는 수가 소수 p일 때 페르마의 소정리를 이용하여 모듈러 역원을 간단히 계산할 수 있다.
페르마의 소정리:
만약 소수 p와 서로소인 정수 a가 주어지면 다음이 성립한다.
ap−1≡1(modp)
이를 활용하면,
ap−2≡a−1(modp)
를 얻을 수 있다.
예제:
a=3, 소수 p=11일 때 모듈러 역원은
311−2=39≡4(mod11)
을 통해 쉽게 구할 수 있다.
4. 활용 예시 (프로그래밍에서의 적용)
컴퓨터공학적으로 큰 수의 나눗셈 연산은 직접 나누지 않고 모듈러 역원을 이용해 곱셈으로 변경하는 것이 연산 속도를 높일 수 있다.
예를 들어, 큰 수의 이항 계수(mod 연산 포함)를 구할 때 모듈러 역원을 활용한 다음 식이 널리 사용된다.
(kn)≡k!(n−k)!n!≡n!⋅(k!)−1⋅((n−k)!)−1(modm)
이 식에서 (k!)−1와 ((n−k)!)−1는 모듈러 역원이다.
5. 파이썬 예제 코드
다음은 파이썬으로 확장 유클리드 알고리즘을 구현한 모듈러 역원 계산 예시이다.
def extended_gcd(a, b):
if b == 0:
return a, 1, 0
else:
gcd, x1, y1 = extended_gcd(b, a % b)
x, y = y1, x1 - (a // b) * y1
return gcd, x, y
def mod_inverse(a, m):
gcd, x, _ = extended_gcd(a, m)
if gcd != 1:
raise ValueError("모듈러 역원이 존재하지 않습니다.")
else:
return x % m
print(mod_inverse(3, 11))
6. 정리
- 모듈러 역원은 모듈러 연산에서의 곱셈 역원을 의미한다.
- 모듈러 역원의 존재 조건은 gcd(a,m)=1이다.
- 계산 방법으로는 확장 유클리드 알고리즘이나 페르마의 소정리를 사용한다.
- 모듈러 역원을 이용하면 나눗셈 연산을 모듈러 곱셈 연산으로 전환하여 효율적으로 계산할 수 있다.