이 영역을 누르면 첫 페이지로 이동
Arc 블로그의 첫 페이지로 이동

Arc

페이지 맨 위로 올라가기

Arc

[Algorithm] 모듈러 산술(modular Arithmetic)

  • 2023.03.09 15:38
  • Algorithm/Algorithm
글 작성자: SeoArc

모듈로(Modulo) 연산

컴퓨팅에서 어떤 한 숫자를 다른 숫자로 나눈 나머지를 구하는 연산으로, 나머지 연산(mod)이라고 한다.

즉 일반적으로 정수 범위의 내에서 대부분 a를 n으로 나눈 나머지 r과 몫 q는 다음을 충족한다. 

일반적으로 a와 n이 모두 정수인 상태에서 수행되지만 요즘은 많은 곳에서 정수 범위 이상의 피연산자를 사용할 수 있다.

하지만, mod 0은 Divide by Zero 에서 예외가 발생할 수 있기 때문에 주의해야한다.

 

이 모듈로 연산에 관련된 규칙이 모듈러 산술이다.

 

모듈러 산술(Modular Arithmetic)

모듈로 합동(Congruence Modulo)

두 정수 a, b와 정수 n (n > 1)이 주어질 때 n이 a, b의 차의 약수인 경우 (즉, a - b = kn을 만족하는 정수 k가 있는 경우) 모듈로 합동이라고 한다.

이는 a ≡ b (mod n), 즉 a mod n = b mod n 라는 뜻이다. (≡ 는 동치의 의미이다)

 

모듈로 합동은 다음 조건을 만족시킨다.

  • 반사성: a ≡ a (mod n)
  • 대칭성: a ≡ b (mod n) 이면, b ≡ a (mod n)
  • 추이성: a ≡ b (mod n) 이고, b ≡ c (mod n) 이면, a ≡ c (mod n)

다음은 음수 값에도 적용되는 예시이다.

2 ≡ -3 (mod 5)

-8 ≡ 7 (mod 5)

-3 ≡ -8 (mod 5)

 

모듈러 연산(Modular Operation)

덧셈

 

뺄셈

 

곱셈

 

모듈러 역원(Modular Inverse)

모듈러 연산은 산술적으로 나눗셈 연산이 없지만 역원이 존재한다.

a (mod n)의 역원은 a^(-1) 이다. 이때, a * a^(-1) ≡ 1 (mod n) 이다.

 

이는 a의 역원 a^(-1)은 (a * a^(-1)) mod n = 1을 성립하는 a^(-1) 값을 뜻한다.

 

이때 이를 나머지 연산의 곱셈 역원이라고도 부르며, a^(-1)은 정수 a를 n으로 나눈 나머지 연산의 곱셈 역원이다.

이 역원은 a와 n이 서로소인 경우에만 존재한다.

 

역원?

집합 S와 이항연산자 *에 대해, 만약 항등원 e가 존재한다고 할 때, S의 원소 a에 대해 

를 만족하는 S의 원소 b가 유일하게 존재할 때, b를 a의 역원이라고 한다.

 

예를 들어,

실수 집합 R과 덧셈 연산자에 대해, 원소 x의 역원은 -x이다.

R에서 0을 제외한 집합과 곱셈 연산자에 대해, 원소 x의 역원은 1/x이다.

 

활용

a 값을 구하는 과정에서 a가 데이터 형식 범위를 넘어가 구할 수 없을 때 아래 성질을 활용할 수 있다.

즉 a값과 b^(-1)를 각각 모듈러 후 곱해서 다시 모듈러를 취하면 된다.

여기서 b^(-1)은 n이 소수라면 페르마의 소정리를, 소수가 아니라면 확장 유클리드 알고리즘을 통해 구할 수 있다.

 

이 외에 제일 간단한 방법을 설명하자면,

정수 a를 m으로 나눈 나머지 연산의 곱셈 역원은 다음 식을 만족하는 a^(-1)을 의미한다.

즉, a^(-1) ≡ x (mod m) 을 만족하는 x를 말한다.

역원은 a와 m이 서로소인 경우에만 존재하며, 이를 코드로 작성하면 다음과 같다.

for (int i = 1; i < m; i++) {
    if ((a * i) % m == 1) {
        x = i;
    }
}

하지만 이 방법은 O(m)의 시간복잡도를 가지고 있어, 보통 문제들의 m이 1000000007인 것을 고려하면 시간이 오래 걸린다.

 

때문에 위에서 언급한 두 방법으로 해결하는 것이 좋다.

'Algorithm > Algorithm' 카테고리의 다른 글

[Algorithm] 상계/하계(Upper Bound/Lower Bound)  (1) 2023.03.11
[Algorithm] 이진 탐색(Binary Search)  (0) 2023.03.11
[Algorithm] 위상 정렬(Topological Sort)  (0) 2023.03.07
[Algorithm] 프림 알고리즘(Prim's algorithm)  (0) 2023.02.28
[Algorithm] 다익스트라(Dijkstra)  (0) 2023.02.26

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • [Algorithm] 상계/하계(Upper Bound/Lower Bound)

    [Algorithm] 상계/하계(Upper Bound/Lower Bound)

    2023.03.11
  • [Algorithm] 이진 탐색(Binary Search)

    [Algorithm] 이진 탐색(Binary Search)

    2023.03.11
  • [Algorithm] 위상 정렬(Topological Sort)

    [Algorithm] 위상 정렬(Topological Sort)

    2023.03.07
  • [Algorithm] 프림 알고리즘(Prim's algorithm)

    [Algorithm] 프림 알고리즘(Prim's algorithm)

    2023.02.28
다른 글 더 둘러보기

정보

Arc 블로그의 첫 페이지로 이동

Arc

  • Arc의 첫 페이지로 이동

검색

메뉴

  • 홈
  • 태그
  • 방명록

카테고리

  • 분류 전체보기 (106)
    • Language (28)
      • C++ (0)
      • C# (0)
      • Java (28)
    • Algorithm (47)
      • Algorithm (15)
      • Data Structure (6)
      • PS (26)
    • Computer Science (22)
      • Design Pattern (1)
      • Network (14)
      • OS (7)
    • Game (0)
      • Unity (0)
    • Backend (3)
      • Spring (1)
      • JPA (2)
    • DB (0)
      • SQL (0)
    • DevOps (2)
      • AWS (0)
      • Docker (2)
      • Jenkins (0)
      • Nginx (0)
    • Software Engineering (4)
      • OOP (4)
    • AI (0)
      • Machine Learning (0)
    • Others (0)

최근 글

인기 글

댓글

공지사항

아카이브

태그

  • algorithm
  • 네트워크
  • network
  • 그래프
  • 자바
  • 알고리즘
  • java
  • graph

나의 외부 링크

정보

SeoArc의 Arc

Arc

SeoArc

블로그 구독하기

  • 구독하기
  • RSS 피드

방문자

  • 전체 방문자
  • 오늘
  • 어제

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기
Powered by Tistory / Kakao. © SeoArc. Designed by Fraccino.

티스토리툴바