02. 두 번째 수업: 크기가 같은 분수 (Equivalent Fractions)
유리수의 가장 신기한 성질은 “모양과 화장이 달라도 본질은 같을 수 있다”는 점입니다. 우리가 피자 한 판을 시켰을 때, 반으로 잘라서 $\frac{1}{2}$ 판을 먹나, $4$조각으로 잘라서 $\frac{2}{4}$ 조각을 먹나, $8$조각으로 잘라서 $\frac{4}{8}$ 조각을 먹나 결국 내 배에 들어온 피자의 양은 완벽히 똑같습니다.
1. 크기가 같은 분수의 성질
분수의 분모와 분자에 $0$이 아닌 같은 수를 곱하거나, 같은 수로 나누어 주면 항상 그 분수의 원래 크기(비율)는 변하지 않습니다.
수식으로 쓰면 이런 규칙입니다 ($c \neq 0$):
- 곱하기 규칙: $\frac{a}{b} = \frac{a \times c}{b \times c}$
- 나누기 규칙: $\frac{a}{b} = \frac{a \div c}{b \div c}$
이 두 번째 ‘나누기 규칙’을 이용해서 숫자가 비정상적으로 뚱뚱해진 분수를 가장 가벼운 상태로 다이어트시키는 과정을 우리는 약분(Reduction of a fraction)이라고 부릅니다. 그리고 더 이상 다이어트(약분)가 불가능한, 즉 분모와 분자의 공약수가 $1$뿐인 뼈대만 남은 분수를 기약분수(Irreducible fraction)라고 합니다.
2. 파이썬과 math.gcd를 이용한 자동 기약분수 만들기
사실 약분을 사람이 일일이 소인수분해해가며 계산하는 것은 실수하기 딱 좋습니다. 하지만 우리는 컴퓨터를 다룰 줄 알기 때문에 최대공약수(Greatest Common Divisor, GCD)라는 마법을 부리면 1초 만에 약분을 끝낼 수 있습니다!
분자와 분모를 각각 두 수의 “최대공약수”로 나누어 버리면, 순식간에 기약분수가 완성됩니다. 파이썬에 내장된 math.gcd 함수를 써보겠습니다.
# [Python] 방대한 분수를 뼈대만 남은 '기약분수'로 압축하기
import math
def simplify_fraction(numerator, denominator):
# 1. 두 숫자의 최대공약수를 구한다!
common_divisor = math.gcd(numerator, denominator)
# 2. 분자와 분모를 각각 최대공약수로 나눈다 (// 는 정수 나눗셈)
simp_num = numerator // common_divisor
simp_den = denominator // common_divisor
return simp_num, simp_den
# 테스트해보기: 1024 / 4096 이라는 거대한 분수
num = 1024
den = 4096
simp_n, simp_d = simplify_fraction(num, den)
print(f"원본 분수: {num} / {den}")
print(f"기약 분수: {simp_n} / {simp_d}")
print(f"적용된 최대공약수: {math.gcd(num, den)}")
[실행 결과]
원본 분수: 1024 / 4096
기약 분수: 1 / 4
적용된 최대공약수: 1024
이렇게 $1024$와 $4096$이라는 무지무지 큰 숫자도, 파이썬이 최대공약수 $1024$를 찰나의 순간에 찾아내어 나누어주면 $\frac{1}{4}$이라는 귀엽고 심플한 기약분수로 변신합니다!
3. 동치(Equivalent)의 중요성
“생긴 건 다른데 완벽히 같다.” 이는 수학에서 단순히 분수뿐만 아니라, 나중에 배울 방정식, 함수, 심지어 암호학에서도 아주 중요한 개념입니다. 복잡한 시스템의 에러를 잡기 위해선 그 시스템을 “자신과 동치(Equivalent)이면서 가장 단순한 형태”로 변환(약분)해서 쳐다보면 오류가 금방 보이기 때문입니다.