08. 여덟 번째 수업: 소인수분해는 오직 한 가지뿐 (산술의 기본 정리)
수학자들은 아주 작은 규칙에도 목숨을 겁니다. 우리가 $12$라는 숫자를 분해할 때 여러분은 어떻게 조립 블록을 나누시겠습니까? 누군가는 $12 = 2 \times 6$ 으로 쪼개고, 또 다른 누군가는 $12 = 3 \times 4$ 로 먼저 쪼갤 수 있습니다. 출발선은 제멋대로 다르지만, 끝까지 레고 블록(소수)으로 부숴버리면 결과는 놀랍게도 오직 단 하나(Unique)로 똑같아집니다!
학습 목표
- 어떤 자연수든 순서를 무시하면 분해된 소수들의 조합은 우주에서 유일하다는 ‘산술의 기본 정리(Fundamental Theorem of Arithmetic)’를 배웁니다.
- 데이터베이스(DB)에서 소인수분해의 유일성이 데이터 무결성을 증명하는 기초임을 이해합니다.
- 파이썬의
List정렬 기능(sort)을 통해 쪼개진 파편들을 일정하게 정렬하여 유일성을 검증해 봅니다.
1. 산술의 기본 정리 (The Fundamental Theorem of Arithmetic)
앞서 말한 숫자 $12$를 끝까지 소수(Prime Number)로 부숴보겠습니다.
- $12 = 2 \times 6 = 2 \times (2 \times 3) \rightarrow \mathbf{2^2 \times 3}$
- $12 = 3 \times 4 = 3 \times (2 \times 2) \rightarrow \mathbf{2^2 \times 3}$
어떻게 시작하든, 누가 부수든 상관없습니다. 결과물은 무조건 다이아몬드 소수 $2$가 $2$개, $3$이 $1$개라는 똑같은 유전자 배열로 끝이 납니다. 이것이 바로 자연수가 가진 불변의 법칙, ‘산술의 기본 정리’입니다.
아무리 복잡하고 흉측하게 생긴 $1,050,000$ 같은 덩어리 숫자도, 소인수분해를 하면 지구가 멸망할 때까지 오직 딱 한 종류의 소수 조합만을 가지게 됩니다. 바로 이 흔들리지 않는 절대적 ‘유일성(Uniqueness)’ 덕분에 숫자들로 암호를 만들거나 무결성을 보장하는 보안 블록체인을 만들 수 있는 것입니다. 만약 사람마다 소인수분해 결과가 달라진다면, 비밀번호 체계는 그날로 무너져 내릴 것입니다.
2. Python의 배열 정렬(Sort)과 유일성 증명
사람들은 $2 \times 3 \times 2$ 라고 쓰기도 하고 $3 \times 2 \times 2$ 라고 쓰기도 합니다. 순서가 제멋대로 섞여 있으면 컴퓨터는 두 결과가 서로 다르다고 착각할 수도 있습니다. 이 유일성을 컴퓨터에게 확인시켜 주려면, 쪼개져서 리스트(배열)에 담긴 소수 파편들을 오름차순으로 깔끔하게 정렬(Sort)해 주어야 합니다.
# 파이썬으로 증명하는 '산술의 기본 정리' (유전자 정렬)
def get_prime_factors(number):
"""무식하게 분해해서 소수 파편들을 무작위로 수집해 옵니다."""
factors = []
divider = 2
while number > 1:
if number % divider == 0:
factors.append(divider)
number = number // divider
else:
divider += 1
return factors
# 해커 A와 해커 B가 똑같은 암호 숫자(360)를 파괴하는 임무를 맡았습니다.
target_dna = 360
# 해커 A는 파이썬 알고리즘으로 분해
hacker_a_result = get_prime_factors(target_dna)
# 해커 B는 수작업으로 다른 순서로 부숴서 종이에 적어왔습니다.
hacker_b_result = [5, 2, 3, 2, 3, 2] # 순서가 엉망진창입니다!
print(f"알고리즘 A의 조각들: {hacker_a_result}")
print(f"인간 B의 조각들: {hacker_b_result}")
# 1. 보기 좋게 오름차순으로 정렬(Sort) 해버립니다!
# 파이썬의 위대한 배열 정리 마법 .sort()
hacker_a_result.sort()
hacker_b_result.sort()
print("=" * 40)
print(f"정렬된 A 조각들: {hacker_a_result}")
print(f"정렬된 B 조각들: {hacker_b_result}")
# 2. 유일성 검증 (비교)
if hacker_a_result == hacker_b_result:
print("✅ 증명 완료: 산술의 기본 정리에 의해, 순서를 무시하면 본질적인 소수 DNA(2 세 개, 3 두 개, 5 한 개)는 우주에서 유일하게 똑같습니다.")
else:
print("❌ 불일치! 누군가 해킹하여 숫자를 변조했습니다!")
컴퓨터의 메모리(List) 안에서 숫자 배열이 .sort() 라는 명령어 한 줄로 완벽히 줄을 서게 되면, 우리는 == 기호를 통해 두 개의 거대 데이터 구조가 서로 오차 없이 완벽히 똑같은지(유일성) 검증해 낼 수 있습니다. 이 과정이 현대 디지털 포렌식(Digital Forensics) 무결성 검증의 가장 기초적인 모델입니다.
학습 정리
- 산술의 기본 정리: 크기가 1보다 큰 모든 자연수는 소수들만의 곱으로 (순서를 무시하면) 오직 단 1가지 방법으로만 분해할 수 있다는 불변의 수학 법칙.
- 분해된 조각(DNA)이 완벽히 고유하다는 성질 때문에, 자연수는 그 자체로 암호키(Cryptography Key)가 될 수 있다.
- 엉망진창으로 들어오는 빅데이터나 리스트 조각들을 비교할 때는 무조건 파이썬의
.sort()배열 정렬 로직을 거쳐야만 올바른 비교 연산(==)을 수행할 수 있다.