2P by GN⁺ | ★ favorite | 댓글 1개
  • 중학교 때 그래프 종이에 그린 정사각형 복제 패턴을 12년간 벽에 붙여 둔 뒤, 이를 wallflower라는 프랙탈로 분석하며 L-System, 선형대수, 수 체계, 고차원 일반화까지 연결함
  • 한 정사각형에서 시작해 현재 모양을 상하좌우로 복제하고, 다음 단계에서는 약 27도 회전된 방향으로 복제하는 절차가 평면을 채우는 프랙탈을 만듦
  • 단순한 L-System 규칙 R → RLR, L → RLL은 비슷한 윤곽을 만들지만 같은 도형은 아니며, 더 흔한 형태는 Quadratic von Koch island, Quadratic Flake, Minkowski Sausage 등으로 문서화돼 있음
  • wallflower는 행렬 (M=\begin{bmatrix}-2&1\1&2\end{bmatrix})를 밑으로, 방향 벡터를 숫자로 쓰는 행렬 기반 수 체계로 해석할 수 있고, (\det(M)=-5)가 반복마다 방향을 뒤집음
  • 3D 일반화는 대칭과 겹침 문제로 어색해졌고, 4D에서는 조건을 만족하는 행렬로 orthotopeflower를 만들 수 있었지만 같은 제약에서는 1D·2D·4D만 가능해 보임

벽에 붙어 있던 프랙탈의 시작

  • 중학교 때 그래프 종이에 정사각형을 반복적으로 합치고 복제하는 낙서를 만들었고, 나중에 분석하려고 벽에 붙여 둠
  • 꽃잎처럼 퍼지는 구조와 벽에 오래 붙어 있던 사연 때문에 이 프랙탈을 wallflower라고 부름
  • 원래 그린 절차는 다음과 같음
    • 한 개의 정사각형에서 시작함
    • 현재 상태의 복사본 4개를 왼쪽, 오른쪽, 위, 아래에 배치함
    • 다음에는 현재 상태의 복사본 4개를 같은 네 방향에서 약 27도 시계 방향으로 기울어진 위치에 배치함
    • 그래프 종이가 다 찰 때까지 두 배치 방식을 번갈아 반복함
  • 이 절차는 Gosper Curve처럼 반복하면 평면의 임의 영역을 덮을 수 있고, 각 중간 상태도 평면을 타일링할 수 있음

L-System과 거의 같지만 다른 윤곽

  • 약 1년 전, 이 윤곽을 L-System으로 만들 수 있다고 봄
  • 사용한 규칙은 90도 오른쪽 회전 (R)과 왼쪽 회전 (L)만으로 구성됨
    • 시작 문자열은 (RRRR)
    • 각 반복에서 (R \rightarrow RLR), (L \rightarrow RLL)로 치환함
  • 처음 몇 단계는 wallflower와 같은 윤곽처럼 보였지만, 애니메이션을 만들면서 4번째 반복부터 두 방식이 어긋난다는 점을 확인함
  • 차이는 복사본 배치 방식에서 나옴
    • “drag and drop” 방식은 3번째 반복의 복사본을 중심 기준 상하좌우에 바로 배치함
    • L-System 방식은 복사본을 대각선 방향에 배치함
  • L-System이 만드는 형태는 이미 여러 곳에 문서화돼 있음
  • 벽에 있던 drag and drop 변형은 Google 이미지 검색과 Wikipedia 탐색으로는 같은 형태를 찾지 못함
  • wallflower에 맞는 규칙으로 (L \rightarrow RLR), (R \rightarrow LLR)를 찾았지만, 이 규칙은 단계마다 윤곽을 그리는 방향이 뒤집히는 효과를 냄

프랙탈을 세는 방식

  • wallflower는 원점에서 바깥으로 커지므로, 자연수와 격자 좌표를 대응시키는 방식으로 볼 수 있음
  • 중심 정사각형을 0으로 두고, 첫 반복에서 추가되는 주변 4개 정사각형을 시계 방향으로 1, 2, 3, 4로 번호 매김
  • 다음 반복에서는 위에서 아래, 왼쪽에서 오른쪽으로 훑어 번호를 붙일 수도 있지만, 이 방식은 재귀 구조와 잘 맞지 않음
  • 각 꽃잎이 이전 반복의 복사본이라는 점을 이용하면, 꽃잎 내부와 꽃잎 사이 모두에서 중앙에서 바깥으로 번호를 재사용할 수 있음
  • 이 번호 매김에서는 5의 배수, (5n+1), 25의 배수 등이 기울어진 격자 패턴을 이룸
  • 이유는 각 반복의 정사각형 수가 (1, 5, 25, 125, ...)로 늘어나기 때문임
    • 매 반복은 이전 상태 1개에 복사본 4개를 더해 총 5배가 됨
    • 그래서 5의 거듭제곱과 5진수 표현이 구조와 잘 맞음

행렬을 밑으로 쓰는 수 체계

  • 어떤 수를 5진수 자릿값처럼 분해하면, 각 자릿값에 대응하는 벡터를 더해 프랙탈 격자에서의 위치를 찾을 수 있음
  • 예를 들어 231은 (200 + 30 + 1)로 보고, 각각의 위치 벡터를 더해 231의 위치를 얻음
  • 한 자리 값은 방향 벡터로 정의됨
    • (\vec{0}=(0,0))
    • (\vec{1}=(1,0))
    • (\vec{2}=(0,1))
    • (\vec{3}=(-1,0))
    • (\vec{4}=(0,-1))
  • (10^n) 꼴의 자릿값은 처음에는 짝수·홀수에 따라 나뉘는 조건식으로 표현됐지만, 행렬 하나를 반복 적용하면 조건 없이 계산할 수 있음
  • 사용한 행렬은 다음과 같음

[ M=\begin{bmatrix} -2 & 1 \ 1 & 2 \end{bmatrix} ]

  • 이 행렬은 (M^2=5I)가 되어, 두 단계마다 크기가 5배로 정렬됨
  • 따라서 다음과 같이 표현할 수 있음

[ \overrightarrow{(10^n)}=M^n\vec{1} ]

  • 이 구조는 스칼라 밑과 스칼라 숫자를 쓰는 일반 진법 대신, 행렬 밑벡터 숫자를 쓰는 수 체계로 볼 수 있음

determinant가 두 프랙탈을 가름

  • (M)의 행렬식은 (\det(M)=-5)이며, 음수 행렬식 때문에 반복마다 공간의 방향이 뒤집힘
  • 이 뒤집힘 때문에 원래 번호 매김과 비교해 20과 40 같은 값의 위치가 바뀌어 보임
  • 뒤집힘을 피하려면 양의 행렬식을 가진 행렬을 고를 수 있음

[ M'=\begin{bmatrix} 2 & 1 \ -1 & 2 \end{bmatrix} ]

[ \det(M')=5 ]

  • (M')는 방향을 뒤집지 않고 숫자 벡터를 계속 시계 방향으로 회전시키며, 이 행렬을 밑으로 쓰면 앞서 나온 L-System 버전이 재현됨
  • 두 프랙탈의 차이는 다음과 같음
    • wallflower는 (\det(M)=-5)인 (M)에서 나옴
    • 더 흔한 quadratic flake 계열은 (\det(M')=5)인 (M')에서 나옴
  • 행렬식의 절댓값 5는 매 반복에서 프랙탈 크기가 5배가 되는 구조와 맞음
    • 행렬식이 더 크면 복사본이 너무 빨리 커져 빈 공간이 생김
    • 행렬식이 더 작으면 복사본이 너무 느리게 커져 반복이 겹침
  • 27도라는 각도는 정수 좌표, 행렬식 (\pm5), 벡터 크기 (\sqrt5) 조건에서 나오는 (\langle1,2\rangle) 벡터와 관련됨
    • 이 벡터의 각도는 (\arctan(2/1)\approx63.43^\circ)
    • y축 기준으로는 약 27도 떨어져 있음

덧셈 규칙과 자리올림

  • 벡터 덧셈은 전개된 자릿값에는 잘 맞지만, (\vec{2}+\vec{2}\neq\vec{4})처럼 일반적인 숫자 덧셈과는 다르게 동작함
  • 1부터 4까지는 실제 숫자라기보다 위, 오른쪽, 아래, 왼쪽 방향으로 보는 편이 더 자연스러움
  • 반대 방향은 서로 상쇄됨
    • (\vec{1}+\vec{3}=\vec{0})
    • (\vec{2}+\vec{4}=\vec{0})
  • 단위 벡터 조합을 표로 만들면 일부 덧셈 결과가 두 자리 값이 됨
  • 이 때문에 큰 수를 더할 때는 일반적인 긴 덧셈처럼 자리올림을 처리해야 함
  • 예시로 (\vec{22}+\vec{1})을 계산하면, (\vec{2}+\vec{1}=\vec{13}) 규칙 때문에 결과가 133으로 나옴
  • 이 덧셈 체계가 일반적으로 작동하는지는 증명하지 않고 독자 검증 대상으로 남김

관련된 수 체계와 연구

  • 벽꽃 프랙탈의 수 체계는 숫자에 자연수만 쓰지 않는 다른 진법들과 연결됨
  • Balanced Ternary는 (-1,0,1)을 숫자로 쓰고 3을 밑으로 쓰며, wallflower는 여기에 y축의 양·음 방향 숫자를 더한 2차원 유사체처럼 볼 수 있음
  • generalized balanced ternary는 퍼뮤토헤드론 격자로 임의 차원에 일반화되며, 2차원에서는 육각 격자가 됨
  • Quater-imaginary Base는 (2i)를 밑으로 쓰고 0, 1, 2, 3을 숫자로 쓰는 체계임
  • (M')는 복소수 (2+i)에 대응하는 밑으로 볼 수 있으며, Timothy James McKenzie Makarios의 Balanced base 2+i (and some gratuitous fractals)가 이 개념을 다룸
  • 관련 자료로 다음을 찾음
    • Project BinSys: 행렬식이 2인 행렬 밑을 찾는 프로젝트
    • Andrew Vince의 Replicating Tesselations: 프랙탈, 타일링, 선형대수, 수 체계를 더 엄밀하게 다루고 (\mathbb{Z}^2)를 넘어 일반 격자로 확장함

3D와 4D로 확장하기

  • 3D에서는 정육면체 하나에서 시작해 여섯 방향으로 복사하는 “3D plus” 구조를 생각함
  • 3x3 행렬에 원하는 조건은 다음과 같음
    • 모든 항목이 정수여야 함
    • 각 열 벡터는 원점에서 해밍 거리 3이어야 함
    • 반복마다 6개 복사본을 더하므로 크기가 7배가 되어야 하고, 행렬식은 (\pm7)이어야 함
  • 조건을 만족하는 3x3 행렬을 찾았지만, 시각화 결과는 반복이 눌린 듯한 형태가 되고 이전 반복이 드러나는 문제가 생김
  • 두 개의 3D plus를 추가하면 빈 부분을 메울 수 있었고, 8개 중심점이 뒤틀린 큐브의 꼭짓점처럼 배열됨
  • 더 대칭적인 배치를 위해서는 각 열이 서로 직교하고 같은 크기를 가져야 하는 조건이 충분할 수 있지만, 3D에서는 정수 좌표 조건과 맞지 않아 불가능해 보임
  • 4D에서는 조건이 맞아떨어짐
    • 각 열 벡터의 성분 제곱합이 3이면 됨
    • 4개 성분 중 3개를 (\pm1), 하나를 0으로 두는 방식이 가능함
  • 다음 4x4 행렬로 4D 프랙탈을 구성함

[ \begin{bmatrix} 0 & -1 & -1 & -1 \ 1 & 0 & -1 & 1 \ 1 & 1 & 0 & -1 \ 1 & -1 & 1 & 0 \end{bmatrix} ]

  • 이 4D 프랙탈은 orthotopeflower라고 부름
  • 4D 시각화는 (w) 값을 고정한 3D 슬라이스로 보거나, 7x7 격자 안에 7x7 격자를 배치해 4차원 창을 표현하는 방식으로 다룸
  • 31x31x31x31 보기 창에서는 3D에서 보였던 과도한 눌림 없이 바깥으로 확장되는 것처럼 보임

더 높은 차원과 마지막 반전

  • 같은 제약을 고차원으로 확장하면, 조건을 만족하는 차원은 1D, 2D, 4D뿐인 것으로 보임
    • 1D는 balanced ternary
    • 2D는 wallflower 또는 quadratic flake
    • 4D는 orthotopeflower
  • 4D에서 고른 행렬은 쿼터니언 (i+j+k)를 인코딩하며, 이를 통해 밑이 (i+j+k)이고 숫자가 (0,\pm1,\pm i,\pm j,\pm k)인 balanced nonary quaternion base를 생각할 수 있음
  • 이 쿼터니언 체계가 실제로 작동하는지는 확실하지 않아, 더 많은 수학을 아는 미래의 자신에게 남김
  • 번아웃 이후 수학과 프로그래밍에 대한 흥미를 되살리려는 시도가 오래된 낙서를 프랙탈, 수 체계, 선형대수, 고차원으로 이어지는 탐색으로 바꿈
  • 마지막 반전으로, 글의 시각화들은 썸네일 속 실제 벽 프랙탈과 일치하지 않음
    • 실제 벽의 4번째 반복은 약 27도 반대 방향으로 복사돼 있음
    • 당시에는 계속 같은 방향으로 기울이면 축에서 벗어날 것이라고 생각해 보정하려 했지만, (M)의 구조는 이미 단계마다 스스로 보정됨
    • Donald Knuth도 벽에 프랙탈을 붙일 때 wrong turn을 한 적이 있다는 점으로 마무리함

댓글과 토론

Hacker News 의견들
  • 통찰 있고 정성스러운 글이었고, 3D 시각화가 특히 좋았음
    예전에 임의의 이미지에서 프랙털 비슷한 효과를 만들려고 재귀적 데시메이션을 만지며 만든 것이 떠오름
    여기서 직접 해볼 수 있음: https://jsfiddle.net/nicobrenner/a1t869qf/
    Blursort 2x2를 몇 번 눌러 프레임을 만들고 Animate를 누르면 됨. 이미지 복사/붙여넣기도 가능하고, 백엔드 없이 전부 브라우저에서 실행됨. 모바일에서는 추천하지 않음

    • 이게 3D에서도 동작할지 궁금함
  • 여기에 꽂혀서 L-system으로 “wallflower”를 채우는 형태를 만든 것 같음
    https://onlinetools.com/math/l-system-generator?draw=AB&skip...
    다시 생각해보니 이건 아마 다른 프랙털을 생성하는 것 같지만 확실하진 않음

  • 가볍게 읽을 글일 줄 알았는데, 일해야 해서 일부는 훑어볼 수밖에 없었음
    나중에 다시 와서 이것저것 만져볼 생각이고, 정말 잘 만든 글임

  • 예상보다 훨씬 깊고 빡센 글이라 헌신이 느껴짐
    글쓴이에게 묻고 싶은데, 지금 아이 방 벽에는 무엇을 걸어두는 걸 추천할지 궁금함

    • 육아 전문가는 전혀 아니지만, 아이가 그 순간 열정이나 경이감을 느끼는 것과 관련된 것이라면 무엇이든 좋다고 봄
      글 끝부분에 번아웃에 대한 문단을 살짝 넣었음. 내 경우 문제의 뿌리는 수학과 프로그래밍에 대해 갖고 있던 매혹과 호기심을 잃어버린 것이었고, 이 글을 쓰면서 예전에는 쉽게 느끼던 어린아이 같은 경이감에 다시 닿을 수 있었음
  • 두 자리 수 두 개의 산술을 확인해봤는데 실제로 동작함
    41+1412가 될 거라고 예상했음. 오른쪽 두 칸과 위쪽 두 칸을 더하면 오른쪽 두 칸, 위쪽 두 칸이기 때문임
    아래의 긴 덧셈에서 =는 동치인 줄을 보일 때, 즉 항 재배열 (1+2=2+1), 수 분해 (41=40+1), 한 자리 덧셈 (1+4=22)에 사용했고, ->는 알고리즘이 자릿수를 줄 때, <는 다음 열로 이동할 때 사용함
    41+14 = (40+1)+(10+4) = 40 + 10 + (1+4) = 40 + 10 + 22 -> 1s digit = 2 < 4 + 1 + 2 = 22 + 2 = 20 + 2 + 2 = 20 + 41 -> 10s digit = 1 < 2 + 4 = 0 -> done == 12
    글에는 서로 다른 두 기수 체계가 있는데, 하나는 10, 20, 30, 40이 시계 방향이고 다른 하나는 반시계 방향임. 둘 다 1, 2, 3, 4는 시계 방향임. 위 덧셈은 덧셈표에 쓰인 두 번째 체계, 즉 10의 자리들이 반시계 방향인 체계 기준임
    다른 체계에서도 동작함. 14+2112가 되어야 함
    14+21 =10+20+42 ->2 <1+2+4 =13+4 =10+3+4 =10+31 ->1 <1+3 =0 ==12

  • middle out” 번호 체계를 어떻게 떠올렸는지 궁금함
    혼자 수학 문제를 풀 때는 이런 영감을 받은 듯한 발상을 좀처럼 못 떠올리겠음

    • 글에서는 순서가 조금 다르게 보이지만, 결국 어느 순간 프랙털이 5배로 성장하는 방식, 5진법 수 체계, 글에서 말한 “나선”이 서로 맞물릴 수 있다는 걸 깨달은 데서 출발했음
      프랙털을 프로그램으로 어떻게 그릴지도 많이 생각했는데, 자연스러운 방식은 가운데에서 시작해 바깥으로 확대해 나가는 것이었음
      Richard Feynman이 머릿속 뒤편에 무작위 문제를 열댓 개쯤 두고 있다가 연결고리가 보일 때마다 조금씩 진전시키고, 마침내 하나를 풀면 사람들이 그가 마법처럼 즉석에서 알아냈다고 생각했다는 일화가 있음. 이번도 조금 비슷했지만, 난 그 수준에는 한참 못 미치고 열댓 개가 아니라 문제 하나에 대해서만 겨우 그렇게 할 수 있었음
  • 예전에 일하던 곳 벽에 이걸 대형 출력물로 걸어뒀음
    https://raw.githubusercontent.com/cies/haskell-fractal/refs/... [17MB, Github라 미안함]
    생성에 사용한 Haskell 코드도 들어 있음: https://github.com/cies/haskell-fractal
    특히 sharpen 함수를 떠올리는 과정이 흥미로웠음. 곡선 맞춤에는 지금은 사라진 도구를 썼음: https://github.com/cies/haskell-fractal/blob/master/fractal....
    재미있는 작은 프로젝트였음

  • “더 많은 수학을 아는 미래의 나에게 위임하기로 했다”는 부분이 공감됨
    어떤 학위를 할지 결정하는 데도, 풀어야 했지만 지도와 인터넷 연결이 부족해 해결하지 못했던 문제 목록이 큰 영향을 줬음. 대부분 선형대수 문제였음

  • 패턴 공식에서 오타가 있는 것 같음. “Looking closely you might pick up on the pattern” 바로 뒤의 식은 5**n이 아니라 5**(n/2), 5**(n-1)이 아니라 5**((n-1)/2)가 되어야 함
    \overrightarrow{10*4}[0, 25]인데 원래 공식으로는 [0, 625]가 나옴
    또한 Knuth의 실수에 관해서는, YouTube 댓글에서 그의 프랙털이 사실은 맞고 시작점과 끝점을 착각했을 뿐이라고 함. 느슨하게 말하면 그 프랙털은 가운데 회전을 기준으로 대칭이고, 바로 그 회전을 Knuth가 틀렸다고 여긴 것임. 어쨌든 프랙털 관련 실수는 한 셈이니 결론은 유지됨

    • 잘 찾았고, 공식을 고쳤음