#mytetration (1)

복소평면에 지수연산을 반복해서 수행하면 무슨 일이 일어날까요?

#mytetration (1)

여러 달 전 역사상 최고의 수학자도 풀지못한 문제라는 영상을 보고 신기하기도 하고 또 흥미롭기도 한 감정을 가졌습니다. 그 후 얼마 지나지 않아 복소평면에서 각 복소수에 대한 무한번의 지수연산을 통해 각 복소수가 발산하는지 혹은 수렴하는지에 따라 다른 색상으로 표시하면 신기한 패턴이 나타난다는 사실과 이를 직접 실행해볼 수 있는 당신을 수학자로 만들어줄 챌린지 영상이 올라왔지만 직접 돌려 봐야겠다는 생각만 했을 뿐 또 시간이 지났습니다.

그렇게 한참 다른 온갖 잡다한 일로 이 생각을 다시 떠올리지 못하다가 얼마 전 한번 각 잡고 돌려 보자는 생각을 한 다음 그 주 주말에 시간을 내 직접 복소평면에서 각 복소수의 무한번 지수연산에 따라 수렴, 발산 여부에 따른 패턴을 만들어 보기로 마음 먹었습니다.

구체적인 방법은 'mytetration'을 따르면 되는데요, 개인적으로 겪은 문제는 복소평면에 대한 테트레이션 연산을 수행한 결과를 출력하기 위해서는 대충 생각해도 3840 x 2160 해상도에서 복소수 하나에 대한 500번의 지수연산을 수행하려면 적어도 41억 4천 7백만번의 지수연산이 필요한데 이걸 위 챌린저 웹사이트에서 제공하는 코드로 그냥 수행하면 필요한 연산 횟수에 비해 CPU가 너무나 고요하고 평화롭게 동작해 이미지 한 장을 뽑는데 너무 긴 시간이 걸렸다는 점입니다.

그런데 풀리퀘스트를 살펴보니 감사하게도 누군가 멀티 프로세싱을 사용한 계산 속도 향상 코드를 올려주셔서 저는 이 코드를 사용해 이전에 비해 훨씬 빠르게 결과를 얻을 수 있었습니다. 이 코드를 사용하면 제 인텔 12700KF CPU 기준으로 3840 x 2160 해상도의 이미지를 뽑는데 기존 약 20분 정도에서 7분 정도로 연산 시간을 줄일 수 있었습니다. 다른 풀리퀘스트를 살펴보니 GPU를 사용하는 방법도 있어 보이고 또 연산의 구성이 GPU를 활용하기에 굉장히 적합한 각 점의 연산 결과가 다른 점의 연산 결과에 영향을 안 주는 모양이지만 제 기술 수준으로는 GPU를 사용할 수 없어 CPU를 사용하는 선에서 타협했습니다.

그럼 제가 만들어본 이미지를 한번 살펴보세요.


경계선과 실체

사실 처음 제공되는 코드를 수정하지 않고 바로 연산을 수행하면 네 번째 패턴을 얻을 수 있습니다. 하지만 저는 맨 처음 이 패턴을 줌아웃 하면 어떤 모양이 될지 궁금했습니다. 그래서 패턴을 본격적으로 줌인 하기 전에 일단 줌아웃 해 보았습니다. 사실 여기에는 그저 흰색 영역과 검정색 영역이 복소평면의 원점을 중심으로 실수축 기준 음의 방향을 향해 튀어나온 지점이 있을 뿐입니다.

하지만 이를 1000배씩 확대해 감에 따라 그냥 직선처럼 보였던 두 색상의 경계면이 사실은 아주 복잡하지만 규칙적이고 또 규칙적이라고 하기에는 너무나도 복잡하고 아름다우며 심지어 차가운 느낌마저 드는 패턴들로 가득하다는 사실 자체가 너무 즐거웠습니다. 처음 그저 직선으로 보일 뿐인 이미지를 뽑았을 때는 '그런가?' 싶었지만 배율을 늘려 가며 확대할 때 드러나는 경계면의 패턴을 찾아가는 과정이 무척 즐거웠습니다.

숨겨진 블랙홀

패턴의 이곳 저곳을 확대해 보던 저는 문득 첫 번째 이미지의 정 중앙에서 약 아홉 시 삼십 분 방향으로 조금 이동한 곳에 작은 소용돌이 무늬를 보았습니다. 이 배율에서는 소용돌이 무늬인지 구분하기 조금 힘들었지만 확대해 보면 알 수 있을 것 같았습니다. 다만 한 번 시행착오를 겪을 때마다 약 8분 정도를 연산에 사용해야 했기 때문에 함부로 아무 곳이나 연산을 시도하기는 어려웠습니다. 일단 시행착오를 최소화 하기 위해 제가 본 소용돌이 무늬를 화면 정 중앙으로 정렬한 이미지를 한 장 더 만들었습니다. 그게 두 번째 이미지입니다.

제가 원하는 소용돌이를 향해 좌표가 잘 정렬되었다는 사실을 확인한 다음 냅다 뛰어들어 봅니다. 멀리서 볼 때는 그저 평범한 소용도리일 거라고 생각했지만 막상 소용돌이를 중앙에 정렬하고 그 속으로 뛰어들자 그 소용돌이를 구성하는 무늬 하나하나가 다시 프랙탈 조각들로 이루어져 있었습니다. 소용돌이의 정 중앙은 어떤 복소수도 더 이상 발산하지 않는 수렴 영역처럼 보여 더 이상 깊이 들어가는 대신 소용돌이를 구성하는 작은 프랙탈 조각들을 살펴보았습니다.

뾰족한 가지의 본질

복소평면에 대한 무한번의 지수 연산으로 만들어진 이 프랙탈의 세계에서 길을 잃을 때마다 다시 원점으로 돌아와 다음 목표를 설정하곤 했습니다. 만약 목표 설정과 결과 획득의 과정의 이터레이션이 훨씬 빨랐다면 지금처럼 다음 확대할 영역을 선정하는데 신중하지 않았을른지도 모릅니다. 하지만 한 번 시도하면 제 CPU에 8분 동안 연산을 시켜야만 했고 그 결과가 그저 시커먼 화면이라면 그 시간과 전력이 아깝다는 생각이 들었습니다. 이번에는 초기 위치에서 정 중앙에 있는 무늬를 확대해 보기로 결정했습니다.

마치 어떤 곤충의 뿔처럼 보이기도 하는 첫 번째 이미지의 정 중앙을 그대로 둔 채 확대한 두 번째 패턴은 이 패턴이 자신의 위, 아래로 뻗은 뾰족한 사슬 모양을 통해 주변과 조화를 이룬 완벽한 위치에 나타나 있었습니다. 이번에는 이 패턴을 원점 기준으로 계속해서 확대해 들어가기 보다는 시점을 조금 옮겨 상하로 뻗은 뾰족한 모양의 가지를 확대해 보기로 했습니다.

뾰족한 가지 모양에 중점을 잘 맞춰 확대해 네 번째 이미지를 얻었습니다. 아마도 이 패턴은 계속해서 규칙성을 이루며 무한히 뾰족해질 거라고 생각했습니다. 그래서 그 뾰족한 끝 부분에 정렬해 계산한 결과가 다섯 번째 이미지입니다. 하지만 이 사슬은 그저 이런 잘 보이지도 않는 패턴을 보인 채 끝나는 것일까요? 그렇지 않았습니다. 어슴푸레한 가지 부분에 좌표를 정렬한 다음 다시 한 번 확대해 보았습니다. 그러자 이 가늘고 뾰족한 가지 모양의 본질은 또 다른 작은 패턴으로 이루어진 사슬이라는 사실을 발견할 수 있었습니다.


사실 제가 가진 연산장치의 한계 상 더 빠른 탐험은 어려웠습니다. 어쩌면 제 CPU 대신 GPU를 사용해 더 빠른 병렬 연산이 가능할 수도 있겠지만 몇 번의 시도에도 불구하고 제 기계에서 GPU를 사용해 이 연산을 수행하는 방법은 아직 잘 모르겠습니다. 하지만 지금까지는 오히려 한 번의 시도에 7분에서 8분 정도가 소요된다는 사실 때문에 탐험 대상을 더 신중하게 고르고 조심스럽게 행동하게 되는 것 같아 오히려 재미있다고 느꼈습니다.

다음에도 자투리 시간이 날 때마다 비슷한 시도를 해 볼 작정입니다. 제 조심스러운 시도를 살펴보시는 분들도 저만큼 즐거우셨으면 좋겠네요. 비록 저는 인스타그램을 활발하게 사용하고 있지는 않아 인스타그램에 올리지는 않겠지만 구글 검색에 나타날 수 있게 태그를 붙여 두겠습니다. #mytetration