부호 규칙의 이해
두 규칙은 두 수가 모두 양수일 때 동일한 결과를 내지만, 음수 값이 포함되면 아래와 같이 서로 달라집니다.
| a | b | 바닥형 결과 (b의 부호) | 절단형 결과 (a의 부호) |
|---|---|---|---|
| 13 | 5 | 3 | 3 (동일 — 둘 다 양수) |
| −13 | 5 | 2 | −3 |
| 13 | −5 | −2 | 3 |
| −13 | −5 | −3 | −3 (동일 — 둘 다 음수) |
- 바닥형 모듈로(여기서는 기본적으로 주 결과로 표시)는 순수 수학과 정수론에서 가장 흔히 쓰이는 규칙이며, Python의 내장 % 연산자와 일치합니다.
- 절단형 모듈로(보조 결과로 표시)는 나머지의 부호가 피제수를 따르는 JavaScript, C, C++, Java 및 대부분의 C 계열 언어의 내장 % 연산자와 일치합니다.
- 0에 대한 모듈로는 정의되지 않으며 이 계산기에서 계산되지 않습니다. 제수는 0이 아닌 수여야 합니다.
모듈로 연산이란 무엇입니까?
a mod b(또는 a % b)로 표기하는 모듈로 연산은 a를 b로 나눈 나머지를 반환합니다. 예를 들어 13 mod 5 = 3인데, 이는 13 = 2 × 5 + 3이기 때문입니다. 즉 13을 5로 나누면 몫이 2이고 3이 남습니다. 모듈로는 정수론(모듈러 산술 또는 시계 산술), 컴퓨터 과학(해싱, 순환 인덱싱, 체크섬), 그리고 나머지와 주기에 관한 일상적 사고(요일이나 시계의 시각 등)에서 근본적인 역할을 합니다.
음수가 포함될 때 결과의 부호를 정의하는 방식에는 널리 쓰이는 두 가지 수학적 규칙이 있습니다. 결과가 항상 제수 b와 같은 부호를 갖는 바닥형 모듈로와, 결과가 항상 피제수 a와 같은 부호를 갖는 절단형 모듈로입니다. 둘 다 '나머지'에 대한 수학적으로 타당한 정의이며, a와 b가 모두 양수일 때는 정확히 일치합니다. 두 규칙은 음수 값이 포함될 때에만 갈라집니다.
프로그래밍 언어마다 기본 구현이 다르기 때문에 규칙의 선택은 실무에서 중요합니다. Python의 % 연산자는 바닥형 모듈로를 사용하는 반면, JavaScript, C, C++, Java를 비롯한 대부분의 C 계열 언어는 절단형 모듈로(피제수의 부호와 일치)를 사용합니다. 이 계산기는 두 결과를 모두 명시적으로 보여주므로 어느 규칙이든 바로 읽어낼 수 있습니다.
이 모듈로 계산기 사용법
- 피제수 (a) — 나누어지는 수 — 를 입력합니다.
- 제수 (b) — 나누는 수 — 를 입력합니다. 0으로 나누는 것(그리고 0에 대한 모듈로)은 정의되지 않으므로 제수는 0이 될 수 없습니다.
- 바닥형 규칙 결과(부호가 항상 제수와 일치)를 읽습니다. 정수론에서 가장 흔히 쓰이는 수학적 규칙입니다.
- 특정 프로그래밍 언어의 내장 % 연산자와 맞춰야 한다면 절단형 규칙 결과(부호가 항상 피제수와 일치)와 비교하고, 단계별 풀이를 확인하려면 몫과 전체 나눗셈 등식을 살펴봅니다.
바닥형 모듈로와 절단형 모듈로 공식
바닥형 모듈로는 몫을 q = ⌊a ÷ b⌋(음의 무한대 방향으로 내림)로 정의한 뒤 r = a − b×q를 계산합니다. 이렇게 하면 나머지 r은 항상 제수 b와 같은 부호를 갖거나 0이 되며, b > 0일 때 0 ≤ r < |b|를 만족합니다. 계산 예: 13 mod 5의 경우 q = ⌊13/5⌋ = 2, r = 13 − 5×2 = 3입니다.
피제수가 음수인 계산 예: −13 mod 5(바닥형)의 경우 q = ⌊−13/5⌋ = ⌊−2.6⌋ = −3, r = −13 − 5×(−3) = −13 + 15 = 2입니다. 결과가 양수(양의 제수와 일치)라는 점에 주목하십시오. 이는 아래의 절단형 결과와 다릅니다.
절단형 모듈로는 몫을 음의 무한대 방향이 아니라 0 방향으로 반올림하여 정의한 뒤 같은 방식으로 나머지를 계산합니다. 이렇게 하면 나머지는 항상 피제수 a와 같은 부호를 갖거나 0이 됩니다. 계산 예: −13 mod 5(절단형, 즉 JavaScript/C/Java의 % 결과)에서는 몫 −2.6이 0 방향으로 −2가 되므로 r = −13 − 5×(−2) = −13 + 10 = −3입니다. 음의 피제수와 부호가 같은 음수로, 같은 입력에 대한 바닥형 결과 +2와 다릅니다.
흔한 실수
- 모든 프로그래밍 언어가 음수에 대해 a mod b를 같은 방식으로 계산한다고 가정하는 것 — JavaScript, C, C++, Java는 절단형 모듈로를 사용하고 Python과 많은 수학 교재는 바닥형 모듈로를 사용하므로, a가 음수일 때마다 결과가 달라집니다.
- 바닥형 결과가 피제수가 아니라 항상 제수의 부호를 따른다는 점을 잊는 것 — 이는 절단형(JavaScript 방식) 규칙이 주는 결과와 정반대입니다.
- a mod 0을 계산하려는 것 — 모듈로 연산은 나눗셈과 마찬가지로 제수가 0일 때 정의되지 않습니다.
- 정수가 아닌 값을 입력하고 정수식 모듈러 산술을 기대하는 것 — 이 계산기는 실수를 받아들여 동일한 내림/절단 논리를 적용하지만, 고전적인 모듈러 산술의 여러 성질(예: 시계 산술)은 특히 정수에 대해 정의되어 있습니다.
자주 묻는 질문
바닥형 모듈로와 절단형 모듈로의 차이는 무엇입니까?
바닥형 모듈로는 몫을 음의 무한대 방향으로 내리므로 나머지가 항상 제수와 같은 부호를 갖습니다. 절단형 모듈로는 몫을 0 방향으로 반올림하므로 나머지가 항상 피제수와 같은 부호를 갖습니다. 두 수가 모두 양수이면 일치하지만 어느 한쪽이 음수이면 달라집니다. 예를 들어 −13 mod 5는 바닥형 규칙에서 2이지만 절단형 규칙에서는 −3입니다.
왜 −13 mod 5가 계산기마다 다른 답을 냅니까?
어떤 부호 규칙을 사용하는지에 따라 달라집니다. 바닥형 모듈로는 2를 줍니다(결과가 양의 제수의 부호를 따르고 0 ≤ r < 5를 만족). 절단형 모듈로는 −3을 줍니다(결과가 음의 피제수의 부호를 따름). Python의 % 연산자는 2(바닥형)를 반환하고, JavaScript, C, Java의 % 연산자는 −3(절단형)을 반환합니다. 어느 쪽이 '더 옳은' 것은 아니며, 둘 다 똑같이 타당한 서로 다른 수학적 정의입니다.
a mod b를 손으로 어떻게 계산합니까?
a를 b로 나누어 몫을 구하고, 선택한 규칙에 따라 반올림한 뒤(바닥형은 내림, 절단형은 0 방향), a에서 b 곱하기 그 반올림된 몫을 뺍니다. 즉 나머지 = a − b × 몫입니다. 13 mod 5의 경우 13 ÷ 5 = 2.6이고 어느 규칙에서든 몫은 2가 되므로 나머지 = 13 − 5×2 = 3입니다.
모듈러 산술과 시계 산술에서 mod는 무엇을 의미합니까?
모듈러 산술은 법(modulus)에 도달한 뒤 수가 '순환'하는 것으로 다룹니다. 대표적인 예가 12시간제 시계로, 시각을 12로 나눈 나머지(24시간제에서는 24)로 계산합니다. 예를 들어 24시간 표기의 15시는 15 mod 12 = 3이므로 12시간제 시계판에서 3시에 해당합니다. 모듈로는 이렇게 '순환된' 나머지를 만들어내는 연산입니다.
제수가 음수일 때도 모듈로를 구할 수 있습니까?
가능합니다. 바닥형 규칙에서 b가 음수인 a mod b는 b와 같은 부호의 나머지를 냅니다. 예를 들어 13 mod −5 = −2인데, 13 = (−3)×(−5) + (−2)이기 때문입니다. 절단형 규칙에서는 나머지가 대신 피제수의 부호를 따릅니다. 절단형에서 13 mod −5 = 3인데, 몫이 0 방향으로 −2가 되어 13 − (−5)×(−2) = 13 − 10 = 3이 되기 때문입니다.
참고 자료
- Rosen KH. Elementary Number Theory and Its Applications. 6th ed. Pearson, 2010. (Division algorithm and modular arithmetic.)
- Leijen D. Division and Modulus for Computer Scientists. Utrecht University Technical Report UU-CS-2001-20, 2001. (Formal comparison of flooring, truncating and Euclidean division conventions.)
- ECMA International. ECMA-262: ECMAScript Language Specification — the remainder operator (%). ecma-international.org.