05. 다섯 번째 수업: 파이썬의 j 와 신의 예술, 만델브로트 집합 (Python Complex Type)

복소수로 더하기 빼기를 하고 마법처럼 90도로 궤도를 꺾기까지 해 보았습니다. 허수는 존재하지 않는 가짜 숫자에서 시작했지만, 차원을 넓히고 꺾이는 각도를 통제하며 파동이나 자연계 나뭇잎의 성장을 모델링하는 핵심 도구가 되었습니다.

복소수 파트의 대장정을 장식하기 위해, 이번에는 파이썬의 복소수 엔진을 한계까지 돌려 오직 $z = z^2 + c$ 단 한 줄의 복소수 방정식이 그리는 우주의 예술, ‘만델브로트 집합(Mandelbrot Set)’ 프랙탈 시뮬레이터를 직접 여러분의 콘솔창에 띄워보겠습니다!


1. 전제가 된 1줄의 우주 공식 방정식: $z = z^2 + c$

프랙탈(Fractal) 구조란 “확대하고 또 확대해도 끝없이 미세한 번개 모양이나 달팽이 모양의 자기 형태가 무한히 반복되어 튀어나오는 수학적 예술”입니다.

자연계의 눈송이 결절이나 혈관 구조가 이 원리를 따르는데, 위대한 수학자 만델브로트(Mandelbrot)는 그저 복소 평면 위의 어떤 좌표 $c$ 하나를 잡고 저 단순한 식에 수십, 수백 번 뺑뺑이를 돌려(재귀 대입) 넣었을 때 좌표가 우주 밖으로 발산해 폭발하는지, 아니면 안전하게 빨려들어 안정화되는 지점(내부)인지 를 검사하여 컴퓨터 모니터에 점을 찍어 보았습니다.

그랬더니 그 1줄의 식에서부터 우주보다 더 화려하고 기괴한 끝없는 나비 웜홀 그래픽이 터져 나왔던 것입니다!

2. 파이썬 복소수 하드코어 벤치마크 (만델브로트)

자, 파이썬이 네이티브로 제공하는 거대한 복소수 연산력을 동원해 실제로 터미널 창에 이 거대 웜홀의 궤적 단면을 조각배(문자 무늬)로 스케치해 보겠습니다!

# [Python] 거대한 복소 평면을 터미널에 그려보는 만델브로트 집합 (Mandelbrot Set)
# z = z**2 + c 방정식 하나가 만들어내는 2차원의 아름다운 프랙탈 나비

print("우주 스케치북 로딩 완료. 복소 평면의 심연을 들여다봅니다...\n")

# 스크린 도화지의 Y축(허수축: 위아래) 과 X축(실수축: 좌우) 범위를 잡습니다
# 허수축은 -1.2i ~ 1.2i 해상도로, 실수축은 -2.0 ~ 1.0 해상도로 밀집해서 스캔합니다
y_range = [y * 0.1 for y in range(-12, 13)]
x_range = [x * 0.05 for x in range(-40, 20)]

# 위에서부터 아래쪽으로 한줄 한줄(Y좌표) 픽셀을 내려가며 콘솔에 문자를 프린트할 겁니다
for y in y_range:
    line_drawing = "" # 콘솔 한 줄을 채울 문자열
    
    for x in x_range:
        # 1. 캔버스의 특정 좌표점(x, y) 를 테스트할 복소수 c (c = x + yj) 로 조립!
        c = complex(x, y)
        
        # 2. 중심 좌표 변수 z 를 0 위치로 초기화 세팅
        z = 0j
        
        # 만델브로트 안쪽 구역인지 바깥 구역인지 판별할 깃발 마커
        is_inside_blackhole = True
        
        # 3. 우주의 방정식 (z = z^2 + c) 에 재귀 루프를 25번 뺑뺑이 태워 봅니다!
        for _ in range(25):
            z = z**2 + c
            
            # 파이썬 abs(z) 는 원점 거리. 거리가 2.0 을 넘어가면 우주 저 멀리 무한대로 발산 확정!
            if abs(z) > 2.0:
                is_inside_blackhole = False
                break # 더 뺑뺑이 돌 필요 없이 루프 강제 종료
                
        # 4. 결론 렌더링. 안전 부지에 남았으면 검은 심연(██), 터졌으면 허공(..)
        if is_inside_blackhole:
            line_drawing += "██"
        else:
            line_drawing += ".."
            
    # X축 한 줄 검사가 모두 끝났으면 그 줄(Layer)을 모니터에 출력!
    print(line_drawing)

print("\z = z^2 + c 하나가 파이썬의 복소 평면 위에서 증식했을 때 그려지는 마법의 무늬였습니다.")

[실행 결과 (간략 예시)]

우주 스케치북 로딩 완료. 복소 평면의 심연을 들여다봅니다...

........................................................................................................................
........................................................................................................................
........................................................................................................................
..............................................................████......................................................
..........................................................████████████..................................................
......................................................████████████████████..............................................
..................................................██████████████████████████████........................................
..............................................██████████████████████████████████████....................................
....................████..................████████████████████████████████████████████..................................
................████████████............████████████████████████████████████████████████................................
............████████████████████......████████████████████████████████████████████████████████..........................
..........████████████████████████████████████████████████████████████████████████████████████..........................
............████████████████████......████████████████████████████████████████████████████████..........................
................████████████............████████████████████████████████████████████████................................
....................████..................████████████████████████████████████████████..................................
..............................................██████████████████████████████████████....................................
..................................................██████████████████████████████........................................
......................................................████████████████████..............................................
..........................................................████████████..................................................
..............................................................████......................................................
........................................................................................................................

우리가 파이썬 콘솔 창에 출력해 낸 저 곤충, 달팽이, 검은 심연의 나비 형태의 덩어리가 바로 “방정식이 수렴하여 터지지 않는 점(좌표)들의 복소수 군락” 입니다. 가상의 숫자 $i$, 그리고 수직선을 깨부수어 그려낸 2D 공간(아르강 도표)의 힘이 없었다면 인간은 이처럼 아름다운 수학의 숨겨진 코드를 결코 시각화해 낼 수 없었을 것입니다.

“상상 속의 가짜 숫자”로 취급받던 억울했던 유령 조각은, 마침내 회전 엔진이자 3차원 프랙탈 우주의 코어를 담당하는 절대 신의 자리에 올라 복소 평면 세계의 문을 닫게 됩니다.

축하합니다! 수 체계의 길고 찬란했던 여정이 모두 막을 내렸습니다.

서브목차