수의 체계와 연산의 조건
자연수부터 복소수까지 수의 집합을 값으로 구분하고, 연산 결과가 원래 집합에 남는지를 뜻하는 닫힘과 교환·결합·분배 법칙, 합·곱 기호와 계승을 계산하며 익힙니다.
상품의 개수는 3개처럼 셀 수 있는 수로 충분하지만, 통장 잔액은 -3000원이 될 수 있고, 거리는 3.5km처럼 소수가 필요합니다. 어떤 종류의 수를 쓰기로 하느냐는 어떤 연산을 마음 놓고 할 수 있느냐와 이어집니다. 개수끼리 빼면 음수가 나올 수 있고, 정수끼리 나누면 정수가 아닌 값이 나올 수 있기 때문입니다. 이 글에서는 수를 담는 집합들을 구분하고, 계산 결과가 원래 집합 안에 남는지 판단하는 방법을 익힙니다. 마지막으로 이 교재 전체에서 쓰는 합과 곱의 기호, 계승을 펼쳐 읽는 연습을 합니다.
수를 담는 집합
수학에서는 자주 쓰는 수의 모임에 이름과 기호를 붙여 둡니다. 이 교재에서는 자연수를 로 정하고 0을 포함합니다. 자연수를 1부터 시작하는 교재도 있으므로, 개수를 세거나 귀납법을 쓸 때는 시작값을 따로 밝히겠습니다. 정수 는 자연수에 음의 정수를 더한 것입니다. 유리수 는 두 정수 , 로 처럼 나타낼 수 있는 수이고, 이때 분모 는 0이 아니어야 합니다. 0으로 나누는 것은 정의되지 않기 때문입니다.
유리수를 소수로 나타내면 처럼 끝나거나, 처럼 어느 자리부터 같은 숫자 묶음이 끝없이 되풀이됩니다. 반대로 실수이면서 두 정수의 비로 나타낼 수 없는 수를 무리수라 하고, 가 대표적인 예입니다. 무리수를 소수로 나타내면 끝나지도 되풀이되지도 않습니다. 다만 되풀이되지 않는다는 것이 숫자들이 무작위라는 뜻은 아닙니다. 0.101001000100001…처럼 1 사이의 0이 하나씩 늘어나는 규칙으로 만든 수도 되풀이되는 묶음이 없으므로 무리수입니다.
유리수와 무리수를 합친 것이 실수 입니다. 복소수 는 실수 , 와 인 수 로 처럼 나타내는 수이고, 이면 실수이므로 실수는 복소수에 포함됩니다. 그래서 다섯 집합은 자연수가 정수 안에, 정수가 유리수 안에, 유리수가 실수 안에, 실수가 복소수 안에 들어가는 포함 관계를 이룹니다.
이산수학 · 연결과 계산
수의 포함 관계를 값으로 읽습니다
자연수는 정수 안에, 정수는 유리수 안에, 유리수는 실수 안에, 실수는 복소수 안에 들어갑니다.
- 포함된 사각형: 부분집합
넓이가 수의 개수를 뜻하지 않습니다. 이 교재는 0을 자연수에 포함합니다. √2는 실수 안이면서 유리수 밖에 있습니다.
모양이 아니라 값으로 분류하기
수가 어느 집합에 속하는지는 적힌 모양이 아니라 값으로 판단합니다. 은 제곱근 기호가 있지만 값이 6이므로 자연수이고, 포함 관계에 따라 정수, 유리수, 실수, 복소수에도 모두 속합니다. 이처럼 하나의 수가 여러 집합에 함께 속하므로, 분류는 "가장 좁은 집합이 어디인가"를 묻는 것으로 생각하면 편합니다. 은 정수부터 속하고 자연수는 아닙니다. 은 무리수인 에 2를 곱한 것이라 무리수입니다.
유리수는 같은 값을 여러 분수로 쓸 수 있으므로, 분자와 분모의 최대공약수가 1이 되도록 줄인 기약분수로 적는 것이 보통입니다. 는 18과 24의 최대공약수 6으로 분자와 분모를 나누어 가 됩니다. Python의 fractions.Fraction은 분수를 정확한 유리수로 다루며, 만들 때 자동으로 기약분수로 줄여 줍니다.
from fractions import Fraction
import math
print(Fraction(18, 24), math.gcd(18, 24))
print(Fraction(3, 8) == 0.375, Fraction(1, 3))3/4 6
True 1/3math.gcd는 두 정수의 최대공약수를 돌려줍니다. 은 0.375와 같고, 0.375는 이진수로도 끝나는 소수라 float에 정확히 저장되므로 비교가 참이 됩니다. 반면 은 소수로 끝나지 않으므로 Fraction이 분수 그대로 담아 둡니다.
닫힘: 계산 결과가 집합 안에 남는가
집합 에서 아무 두 원소를 골라 어떤 연산을 해도 결과가 늘 에 들어 있으면, 가 그 연산에 대해 닫혀 있다(closed)고 합니다. 자연수는 덧셈과 곱셈에 닫혀 있지만, 이 자연수가 아니므로 뺄셈에는 닫혀 있지 않습니다. 정수는 뺄셈에도 닫혀 있지만, 가 정수가 아니므로 나눗셈에는 닫혀 있지 않습니다. 0이 아닌 유리수끼리는 나눗셈을 해도 유리수입니다. 무리수는 곱셈에 닫혀 있지 않은데, 처럼 무리수끼리 곱해도 유리수가 될 수 있기 때문입니다.
닫혀 있다는 것은 "모든" 두 원소에 대한 말이므로, 닫혀 있지 않다는 것을 보이려면 결과가 집합 밖으로 나가는 예, 곧 반례 하나면 충분합니다. 반대로 닫혀 있다는 것을 보이려면 몇 가지 예를 계산하는 것으로는 부족하고, 모든 경우에 성립하는 이유를 설명해야 합니다.
프로그래밍 언어도 이 문제를 다룹니다. Python에서 정수끼리 /로 나누면 결과는 실수에 해당하는 float이 되고, 정수 안에 머물고 싶으면 몫만 구하는 //를 씁니다. 정수를 나눗셈에 닫혀 있게 만들 수는 없으므로, 언어가 서로 다른 두 연산을 마련한 것입니다.
print(7 // 2, 7 / 2, 7 % 2)
print(-7 // 2, -7 % 2)3 3.5 1
-4 1%는 나머지입니다. -7 // 2가 -3이 아니라 -4인 것은 Python의 //가 몫을 소수점 아래에서 버리는 것이 아니라 더 작은 쪽 정수로 내리기 때문입니다. 그래서 몫 × 2 + 나머지 = (-4) × 2 + 1 = -7이 늘 성립하고, 나머지는 0 이상이 됩니다. 음수의 몫과 나머지는 언어마다 정하는 방식이 다르므로, 다른 언어로 옮길 때는 확인해야 합니다.
교환·결합·분배 법칙과 역원
덧셈과 곱셈에는 계산 순서를 바꾸어도 되는 법칙들이 있습니다. 교환법칙은 , 처럼 두 수의 순서를 바꾸어도 된다는 것이고, 결합법칙은 처럼 어느 둘을 먼저 계산해도 된다는 것입니다. 분배법칙은 처럼 곱셈을 덧셈 위에 나누어 할 수 있다는 것입니다. 뺄셈과 나눗셈에는 교환법칙이 없습니다. 이지만 입니다.
어떤 수에 연산을 했다가 원래대로 되돌리는 수를 역원(inverse)이라고 합니다. 덧셈에서 의 역원은 로, 더하면 0이 되어 아무것도 더하지 않은 것과 같아집니다. 곱셈에서 0이 아닌 의 역원은 로, 곱하면 1이 됩니다. 0에는 곱해서 1이 되는 수가 없으므로 곱셈의 역원이 없고, 이것이 0으로 나눌 수 없는 이유입니다.
수학의 실수에서는 결합법칙이 늘 성립하지만, 컴퓨터의 float에서는 그렇지 않을 수 있습니다. float은 실수를 정해진 자릿수로 반올림해 저장하므로, 계산하는 순서에 따라 반올림이 일어나는 곳이 달라지기 때문입니다.
import math
print((0.1 + 0.2) + 0.3, 0.1 + (0.2 + 0.3))
print(math.sqrt(2) * math.sqrt(2))0.6000000000000001 0.6
2.0000000000000004같은 세 수를 더했는데 묶는 순서에 따라 결과가 달라졌습니다. 도 수학에서는 정확히 2이지만, math.sqrt(2)가 이미 반올림된 근삿값이라서 곱한 결과가 2에서 조금 벗어났습니다. 이 오차가 생기는 원리는 다음 글에서 다룹니다.
복소수 계산하기
복소수의 계산은 를 문자처럼 다루며 다항식처럼 전개한 뒤, 이 나오면 로 바꾸면 됩니다. 를 전개하면 이고, 이므로 실수 부분을 모아 , 허수 부분을 모아 가 되어 입니다. Python은 허수 단위를 j로 적어 복소수를 바로 계산할 수 있습니다.
print((2 + 1j) * (3 - 2j), 1j ** 2)(8-1j) (-1+0j)더 깊이: 복소수에는 크기 순서를 줄 수 없다
실수끼리는 어느 쪽이 큰지 물을 수 있지만, 복소수에는 사칙연산과 어울리는 크기 순서를 줄 수 없습니다. 여기서 어울린다는 것은 실수의 부등호처럼 두 규칙이 성립한다는 뜻입니다. 첫째, 서로 다른 두 수는 반드시 한쪽이 크고, 이면 양변에 같은 수를 더해도 입니다. 둘째, 이고 이면 입니다. 이런 순서를 가진 수의 체계를 순서체(ordered field)라고 합니다.
이 두 규칙만으로 0이 아닌 수의 제곱은 언제나 양수라는 것이 나옵니다. 이면 둘째 규칙에서 이고, 이면 양변에 를 더해 이므로 입니다. 그런데 이므로 이어야 하고, 양변에 1을 더하면 과 반대인 이 됩니다. 한편 이므로 모순이고, 따라서 복소수에는 이런 순서가 없습니다.
그래서 와 가운데 어느 쪽이 크냐는 질문에는 답이 없습니다. 복소수끼리 크기를 견주어야 할 때는 절댓값 처럼 실수로 바꾼 값을 비교합니다. Python도 공식 문서에 적힌 대로 복소수가 끼면 <, <=, >, >=에서 TypeError를 내며, ==로 같은지만 비교할 수 있습니다.
합·곱 기호와 계승
여러 항을 더하거나 곱하는 식을 짧게 쓰려고 기호를 씁니다. 는 합 기호, 는 곱 기호입니다. 은 아래의 에서 시작해 위의 3까지, 에 1, 2, 3을 차례로 넣은 항 1, 3, 5를 모두 더하라는 뜻이라서 9입니다. 같은 범위의 은 세 항을 곱한 입니다. 여기서 는 수를 차례로 넣는 자리를 나타낼 뿐입니다.
시작값과 끝값은 모두 범위에 들어갑니다. 에서 항은 개입니다. 처럼 범위 대신 집합의 원소를 차례로 넣을 수도 있는데, 이 쓰임은 12장에서 확률변수의 값별로 더할 때 다시 나옵니다.
범위에 넣을 수가 하나도 없는 경우도 정해 두어야 합니다. 더할 항이 없는 빈 합은 0, 곱할 항이 없는 빈 곱은 1로 정합니다. 어떤 합에 아무것도 더하지 않으면 값이 그대로여야 하고, 어떤 곱에 아무것도 곱하지 않아도 값이 그대로여야 하므로, 각각 덧셈과 곱셈에서 값을 바꾸지 않는 수인 0과 1이 알맞습니다. 그래서 , 입니다.
0 이상의 정수 에 대해 1부터 까지를 모두 곱한 것을 의 계승(factorial)이라 하고 로 씁니다. 이고, 곱 기호로는 입니다. 0!은 빈 곱이므로 1입니다. 이면 이므로, 처럼 겹치는 부분을 약분해 간단히 계산할 수 있습니다. Python으로 같은 값들을 확인해 보겠습니다.
import math
print(sum(2 * i - 1 for i in range(1, 4)), math.prod(2 * i - 1 for i in range(1, 4)))
print(sum(i for i in range(1, 1)), math.prod(i for i in range(1, 1)))
print(math.factorial(4), math.factorial(0), math.factorial(5) // math.factorial(3))9 15
0 1
24 1 20range(1, 4)는 1, 2, 3을 내놓으므로 수학의 부터 3까지에 해당합니다. range(1, 1)은 아무것도 내놓지 않는 빈 범위인데, sum은 0을, math.prod는 1을 돌려주어 빈 합과 빈 곱의 약속과 같습니다. 합과 곱의 기호는 행렬의 곱과 기댓값에서, 계승은 순열과 조합에서 다시 씁니다.
정리
- 자연수 (이 교재에서는 0 포함), 정수 , 유리수 , 실수 , 복소수 는 차례로 앞의 것을 포함하며, 수는 적힌 모양이 아니라 값으로 분류합니다.
- 유리수는 분모가 0이 아닌 두 정수의 비이고, 소수로 나타내면 끝나거나 되풀이됩니다. 실수 가운데 유리수가 아닌 수가 무리수입니다.
- 집합의 모든 두 원소에 대해 연산 결과가 그 집합에 남으면 닫혀 있다고 하며, 닫혀 있지 않음은 반례 하나로 보일 수 있습니다.
- 덧셈과 곱셈에는 교환·결합·분배 법칙이 성립하고 뺄셈과 나눗셈에는 교환법칙이 없습니다. 0에는 곱셈의 역원이 없고, 컴퓨터의
float에서는 결합법칙이 깨질 수 있습니다. - 와 는 범위의 값을 차례로 넣어 더하거나 곱하며, 빈 합은 0, 빈 곱은 1입니다. 은 1부터 까지의 곱이고 입니다.
연습 문제
1. 수를 집합으로 분류하기
, , , , 가 각각 어느 집합에 속하는지 쓰세요.
해설 보기
먼저 값을 계산합니다. 0과 는 이 교재의 자연수이므로 자연수, 정수, 유리수, 실수, 복소수에 모두 속합니다. 는 정수부터, 는 유리수부터 속합니다. 는 5가 어떤 정수의 제곱도 아니라서 무리수이며, 실수와 복소수에 속하고 유리수에는 속하지 않습니다. 자연수를 1부터 정하는 교재를 따르면 0이 자연수에서 빠지는 것만 달라집니다.
2. 닫혀 있지 않음을 보이는 반례
무리수의 집합이 덧셈에 닫혀 있지 않다는 것과, 양의 정수의 집합이 뺄셈에 닫혀 있지 않다는 것을 각각 반례로 보이세요.
해설 보기
와 는 둘 다 무리수인데 더하면 0으로 유리수가 됩니다. 양의 정수 2와 5에서 은 양의 정수가 아닙니다. 닫혀 있다는 것은 모든 경우에 결과가 집합 안에 남는다는 주장이므로, 밖으로 나가는 경우 하나만 보이면 그 주장이 틀렸음을 보일 수 있습니다.
3. 기호를 펼쳐 계산하기
, , , 을 각각 펼쳐 계산하세요.
해설 보기
에 2, 3, 4를 넣으면 항은 3, 4, 5입니다. 그래서 합은 , 곱은 입니다. 로, 겹치는 를 약분하면 됩니다. 마지막 식은 범위가 1부터 0까지라 넣을 수가 없는 빈 곱이므로 1입니다. 빈 합이었다면 0이었을 것이므로, 합인지 곱인지를 먼저 확인해야 합니다.
분류가 헷갈리면 기호를 보기 전에 값을 계산해 보세요. 가 무리수라는 증명은 증명 방법에서 다룹니다. 다음 글 진법과 컴퓨터의 수 표현에서는 컴퓨터가 수를 비트로 저장하는 방식과, 앞에서 본 float의 오차가 생기는 이유를 봅니다.