모듈로
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
모듈로는 수학에서 동치류의 일종으로, 어떤 대표원으로도 선택될 수 있으며, 일반적으로는 유클리드 나눗셈의 나머지를 대표원으로 선택한다. 모듈로 연산은 거의 모든 컴퓨팅 시스템에서 사용되며, 프로그래밍 언어에 따라 연산 결과의 부호 처리 방식에 차이가 있다. 모듈로 연산은 암호학, 컴퓨터 과학 등 다양한 분야에 응용되며, 2의 거듭제곱으로 나눌 때 비트 연산을 사용하여 성능을 최적화할 수 있다. 모듈로 연산의 결과는 피제수의 부호에 따라 달라질 수 있으므로 주의해야 하며, 확장된 모듈로 연산도 존재한다.
더 읽어볼만한 페이지
- 연산자 (프로그래밍) - 중위 표기법
중위 표기법은 사람이 이해하기 쉬운 연산자 표기 방식이지만, 컴퓨터가 구문 분석하기 어렵고 연산 순서를 위해 괄호나 연산자 우선순위 규칙이 필요하다. - 연산자 (프로그래밍) - 형 변환
형 변환은 프로그래밍에서 변수의 데이터 타입을 변경하는 것으로, 암시적 형 변환과 명시적 형 변환으로 나뉘며, 객체 지향 프로그래밍에서는 업캐스팅과 다운캐스팅이 발생하고, 각 언어는 고유한 규칙과 방법을 제공하며 잘못된 형 변환은 오류를 유발할 수 있다. - 모듈러 산술 - 이산 로그
이산 로그는 유한군에서 이산 거듭제곱의 지수를 찾는 역함수로, 소수 p를 법으로 하는 정수 모듈러 곱셈 그룹에서 계산적으로 풀기 어려운 문제이며, 현대 암호 시스템의 안전성 기반이지만 양자 알고리즘으로 효율적 해결이 가능하여 양자 내성 암호 연구가 필요하다. - 모듈러 산술 - 중국인의 나머지 정리
중국인의 나머지 정리는 여러 개의 연립 합동식의 해 존재성과 유일성에 대한 정리이며, 정수론, 대수학, 암호학 등 다양한 분야에 응용된다. - 컴퓨터 산술 - IEEE 754
IEEE 754는 부동소수점 숫자를 표현하고 처리하기 위한 국제 표준으로, 다양한 형식과 연산, 반올림 규칙, 예외 처리 등을 정의한다. - 컴퓨터 산술 - 1의 보수
1의 보수는 이진수에서 양수는 일반적인 이진수로, 음수는 양수의 각 비트를 반전시켜 표현하며, 덧셈 시 자리올림수가 발생하면 결과값에 더해야 하고, 0을 중복 표현하는 단점으로 현대에는 2의 보수가 주로 사용된다.
| 모듈로 | |
|---|---|
| 모듈로 연산 | |
| 유형 | 이항 연산 |
| 기호 | mod |
| 정의 | a mod n은 a를 n으로 나눈 나머지 |
| 예시 | |
| 7 mod 4 | 3 |
| 5 mod 3 | 2 |
| 4 mod 2 | 0 |
| 3 mod 5 | 3 |
| 속성 | |
| 분배 법칙 | (a + b) mod n = ((a mod n) + (b mod n)) mod n (a * b) mod n = ((a mod n) * (b mod n)) mod n |
| 항등원 | 0 (덧셈에 대한 항등원) |
| 역원 | 덧셈에 대한 역원은 존재함 (모듈로 n 합동에 따라) |
| 관련 연산 | |
| 나눗셈 | a = (n * q) + (a mod n) (q는 몫) |
| 합동 | a ≡ b (mod n) (a mod n = b mod n) |
| 응용 분야 | |
| 암호학 | RSA 암호 등 |
| 컴퓨터 과학 | 해시 테이블, 의사 난수 생성기 등 |
2. 정의 및 표기법
수학에서 모듈로 연산은 기본적으로 나눗셈의 나머지를 구하는 연산이다. 수학적으로 모듈로 연산의 결과는 특정 정수들의 동치류를 나타내며, 이 동치류에 속하는 어떤 정수든 대표원으로 사용할 수 있다. 하지만 일반적으로는 해당 동치류에서 가장 작은 음이 아닌 정수인 '''최소 양의 나머지'''를 사용하는데, 이는 유클리드 나눗셈의 나머지와 같다.[2]
컴퓨터 과학이나 프로그래밍 언어에서는 모듈로 연산의 정의나 사용 방식이 수학적인 정의와 약간 다를 수 있다. 컴퓨터는 숫자를 표현하고 저장하는 방식이 다양하기 때문에, 특히 피제수()나 제수()가 음수일 때 나머지의 부호를 처리하는 방식이 구현 환경이나 언어마다 다를 수 있다. 대부분의 시스템에서 몫()과 나머지()는 이고 이라는 기본 조건을 만족하지만, 나머지의 부호를 결정하는 데에는 여러 가지 규칙이 존재한다. 예를 들어 나머지가 피제수와 같은 부호를 갖도록 하는 '절단 나눗셈', 제수와 같은 부호를 갖도록 하는 '바닥 나눗셈', 항상 음수가 아니도록 하는 '유클리드 나눗셈' 등이 있다.[3][4][5] 어떤 규칙을 따르는지는 프로그래밍 언어의 설계나 표준에 따라 결정된다.
프로그래밍 언어에서는 모듈로 연산을 위해 다양한 표기법을 사용한다. 많은 언어에서 '%' 기호를 연산자로 사용하며('a % n'), 'mod' 또는 'Mod'와 같은 키워드나 함수 이름('a mod n', 'mod(a, n)')을 사용하기도 한다.
간단한 예로, 양의 정수 5를 2로 나눈 나머지는 1이므로 "5 mod 2"의 결과는 1이다. 9를 3으로 나눈 나머지는 0이므로 "9 mod 3"의 결과는 0이다.
모듈로 연산은 정수론의 합동 산술과 깊은 관련이 있다.
2. 1. 수학적 정의
수학에서 모듈로 연산은 나눗셈의 나머지를 구하는 연산이다. 엄밀히 말하면, 모듈로 연산의 결과는 특정 정수들의 동치류이며, 이 동치류에 속하는 어떤 정수든 대표원으로 사용할 수 있다. 하지만 일반적으로는 해당 동치류에서 가장 작은 음이 아닌 정수, 즉 유클리드 나눗셈의 나머지를 사용하며 이를 '''최소 양의 나머지'''라고 부른다.[2]그러나 컴퓨터나 계산기는 숫자를 저장하고 표현하는 방식이 다양하기 때문에, 실제 프로그래밍 언어나 하드웨어에서는 모듈로 연산의 정의가 조금씩 다를 수 있다.
대부분의 컴퓨팅 시스템에서, 정수 를 정수 으로 나눈 몫 와 나머지 은 다음 세 가지 조건을 만족한다.
(1)
이 정의에 따르면, 나머지가 0이 아닐 경우 부호에 대한 모호성이 생긴다. 예를 들어, -21을 5로 나누는 경우를 생각해보자.
- : 몫은 -4, 나머지는 -1이다.
- : 몫은 -5, 나머지는 4이다.
두 경우 모두 위의 조건 (1)을 만족한다. (과 모두 절댓값이 5보다 작다.) 정수론에서는 보통 양수인 나머지(여기서는 4)를 선택하지만, 컴퓨팅 환경에서는 프로그래밍 언어나 또는 의 부호에 따라 다른 나머지를 선택할 수 있다. 예를 들어, 표준 파스칼이나 ALGOL 68은 제수 이 음수라도 나머지는 항상 양수(또는 0)가 되도록 정의한다. 반면, C90 표준 이전의 C언어나 C++03 이전의 C++ 등 일부 언어에서는 나 이 음수일 때 나머지의 부호를 명확히 규정하지 않고 구현 환경에 따라 달라지도록 허용했다.[65]
한편, 를 0으로 나누는 연산()은 대부분의 시스템에서 정의되지 않으며, 실행 시 0으로 나누기 오류를 발생시킬 수 있다. 일부 시스템에서는 이를 로 정의하기도 한다.
피제수 와 제수 의 부호에 따라 나머지의 부호를 결정하는 방식에는 여러 가지 규칙이 있으며, 이는 몫 를 어떻게 정의하느냐에 따라 달라진다. 주요 규칙들은 다음과 같다.
| 규칙 | 몫 () 정의 | 나머지 () 부호 특징 | 관련 인물/표준 |
|---|---|---|---|
(Truncated Division) | (0 방향으로 절삭) | 피제수()와 같거나 0 | C99, C++11 등 다수 |
(Floored Division) | (음의 무한대 방향 내림) | 제수()와 같거나 0 | 도널드 크누스[3][66] |
(Euclidean Division) | q = \sgn(n) \left\lfloor\frac{a}{\left>n\right|} | \right\rfloor || 항상 음수가 아님 (0 이상) || 레이먼드 T. 부테[4][67]