05. 차원이 다른 무한: 칸토어의 대각선 논법
1. 학습 목표 (Learning Objectives)
- 자연수나 유리수($\aleph_0$)를 아득히 초월하는, 인간이 셀 수조차 없는 공포의 괴물 무한인 실수(Real Numbers)의 스케일을 체감합니다.
- 절대 목록으로 나열될 수 없는 새로운 차원의 무한을 증명해 낸 역사상 가장 소름 돋는 해킹 로직, ‘칸토어의 대각선 논법(Cantor’s Diagonal Argument)’을 파이썬 스크립트로 해부합니다.
2. 신도 셀 수 없는 진짜 무한의 강림
우리는 앞선 챕터에서 짝수, 정수, 방대한 분수(유리수)까지 모조리 파이썬 zip을 통해 1대1로 번호표(자연수)를 매길 수 있는, 즉 크기가 동일한 알레프-널($\aleph_0$) 카테고리 임을 증명했습니다.
“아하, 우주에 무한 덩어리는 그냥 다 하나로 통일되나 보다!”
하지만 무리수(소수점 아래 패턴 없이 영원히 불규칙하게 뻗어 나가는 수, 예: $\pi=3.141592…$)를 포함한 완벽한 꽉 찬 수직선 덩어리인 ‘실수(Real Numbers)’를 가져왔을 때 상황은 급반전됩니다.
“실수 무한은 자연수 무한보다 압도적으로 더 큰 덩어리를 가진 돌연변이다. 어떤 컴퓨터 알고리즘을 가져와 1:1로 짝을 지으려 애를 써도, 영원히 짝을 찾지 못해 남겨지는 실수가 ‘무한히’ 발생한다!!”
3. 위대한 파괴자, ‘대각선 논법 (Diagonal Argument)’
칸토어는 누군가 “아닌데? 난 0과 1 사이의 모든 실수를 다 자연수와 1:1로 리스트화(배열)로 번호를 매겨서 엑셀표로 짤 수 있는데?”라고 주장하는 방어 논리를 펼친다고 가정했습니다. (귀류법)
그러면서 그는 소름 끼치는 살인 무기를 꺼냅니다.
“좋아. 네가 모든 실수를 리스트로 다 적었다고 인정해 줄게. 자, 네가 짠 그 완벽하다는 무한 표를 내가 딱 1초 만에 박살 내고, 네 표에 존재하지 않는 새로운 실수를 새로 창조해서 던져 주마.”
[칸토어의 해킹 스텝]
- 상대방이 만든 무한 표에서 첫 번째 실수의 소수점 1번째 자리를 꺼내 다르게 바꾼다. (예: 1$\rightarrow$2)
- 두 번째 실수의 소수점 2번째 자리를 꺼내 다르게 바꾼다. (예: 4$\rightarrow$5)
- 세 번째 실수의 소수점 3번째 자리를 꺼내 다르게 바꾼다.
- $n$번째 실수의 소수점 $\mathbf{n}$번 자리를 계속해서 바꿔 치기 하여(대각선으로 내려오며), 그 숫자들을 주르륵 이어 붙여 완전 신상 실수 넘버($X$) 를 하나 조합해 냅니다.
“방금 내가 만든 새로운 수 $X$를 봐라. 얘는 너의 리스트 1번과는 첫째 자리가 다르고, 너의 2번과는 둘째 자리가 다르다. 100만 번째수와는 100만째 자리가 반드시 다르다. 결국, 내가 만든 실수 $X$는 네가 호언장담한 ‘모든 실수가 담긴 리스트’ 그 어느 구석에도 존재하지 않는다!! 번호표를 묶는 시도는 철저하게 실패했다!”
4. 파이썬 “대각선 논법” 데몬 시뮬레이터 (Python)
아무리 리스트에 무작위 실수를 꽉꽉 채워 넣어도, 파이썬 배열의 Index 대각선을 파고들어 기어이 탈옥해 버리는 칸토어의 해킹 로직 코드를 작성해 보겠습니다.
import random
def cantors_diagonal_hack(real_number_list):
"""
주어진 실수 리스트를 깨부수는 새로운 탈옥 수(New Number)를 대각선 논법으로 생성합니다.
(소수점 자리수는 리스트의 개수 N개와 똑같이 일치해야 합니다)
"""
n = len(real_number_list)
hacked_new_number = "0." # 새로운 실수는 무조건 0.x 로 시작
print("-" * 50)
print("⚔️ [칸토어의 대각선 논법 해킹 알고리즘 가동]")
for index, real_str in enumerate(real_number_list):
# 1. 원본 숫자 출력 (대각선 타겟을 [ ] 로 강조)
# 소수점 '0.' 부분(2글자)을 건너뛰고 매핑하기 위해 index + 2 픽업
target_char = real_str[index + 2]
display_str = real_str[:index+2] + f"[{target_char}]" + real_str[index+3:]
print(f"Index {index+1:02d}: {display_str}")
# 2. 치명적인 해킹 (변조 규칙): 타겟 숫자가 1이면 2로, 아니면 1로 바꿔버림!
if target_char == '1':
new_char = '2'
else:
new_char = '1'
hacked_new_number += new_char
print("-" * 50)
print(f"🔥 [해킹 완료] 새로 창조된 돌연변이 수: {hacked_new_number}")
print("이 숫자는 리스트의 1번과 1째자리가, 2번과 2째자리가 다르므로 위 목록에 '절대' 존재하지 않습니다!!")
return hacked_new_number
# --- [시뮬레이션 가동] 가상의 무한 실수 표 생성 (여기선 10개만 테스트) ---
random.seed(42)
TOTAL_SIZE = 10
# 0.xxxxxxxxx 모양의 난수 실수 문자열 10개 리스트 생성
database_list = []
for _ in range(TOTAL_SIZE):
# 소수점 10자리 난수 문자열 생성 (예: '0.1432567891')
digits = ''.join(str(random.randint(1, 9)) for _ in range(TOTAL_SIZE))
database_list.append(f"0.{digits}")
# 실행
cantors_diagonal_hack(database_list)
터미널 실행 콘솔 렌더링:
--------------------------------------------------
⚔️ [칸토어의 대각선 논법 해킹 알고리즘 가동]
Index 01: 0.[2]154154948
Index 02: 0.9[9]39434316
Index 03: 0.17[2]3359556
Index 04: 0.978[2]815347
Index 05: 0.2871[5]37237
Index 06: 0.92552[8]9851
Index 07: 0.613312[5]936
Index 08: 0.6558661[4]98
Index 09: 0.61633513[1]7
Index 10: 0.276332766[3]
--------------------------------------------------
🔥 [해킹 완료] 새로 창조된 돌연변이 수: 0.1111111121
이 숫자는 리스트의 1번과 1째자리가, 2번과 2째자리가 다르므로 위 목록에 '절대' 존재하지 않습니다!!
결국 인간이 아무리 긴 1경 개짜리 배열 번호표를 늘여놓더라도, 칸토어의 컴퓨터 코드는 대각선을 긁으며 조롱하듯 “네 목록에 없는 1경+1번째의 새로운 신규 실수가 생성되었다” 라고 영원히 터져 나옵니다. 이로서 실수(Real Number) 무한의 크기는 셀 수 있는 한계 스케일인 알레프-널($\aleph_0$)을 압도하는, 차원이 다른 절대적 크기의 무한 기수($\aleph_1$)임이 수학 역사상 가장 짜릿하게 증명되었습니다.
5. 학습 정리 (Summary)
- 셀 수 없는 무한(Uncountable Infinity): 정수나 자연수처럼 떨어져 있는 배열과 달리, 실수 집합은 소수점 아래 빈틈이 너무나도 크고 연속적으로 빽빽하여 번호 매기기 자체가 철저히 붕괴하는 급이 다른 큰 차원의 무한 덩어리($\aleph_1$)입니다.
- 대각선 논법(Diagonal Argument): 실수를 강제로 엑셀 표로 늘어놓았다고 가정했을 때, 대각선 인덱스 위치의 숫자들만 모아서 고의로 +1 조작을 시킨 뒤 이어붙이면 기존 표에 무조건 예외가 발생하는 모순 무기를 발동시켜 “일대일 대응 시도가 100% 무조건 실패함”을 완벽 증명해 내는 우아한 논리 기법입니다.