여태껏 n화에 조금이라도 n이랑 연관성 있는 주제를 골라온 건 다음이 아니라 막 이 시리즈 쓰기 시작할 때 쯤 한 번 "미쳐버린 수학계 근황"이란 제목으로 베스트 간 이 글을 17화로 하기 위해서였다!
뭐 이 수식이 실제로는 2000년대 초반에 발표된 거라 저 제목이 언제나처럼 유게식 근황이라는 것에 이 결과는 수학 쪽 보다는 컴퓨터 쪽에서 나온 결과라는 것은 차치하고, 이 수식은 보통 그래프 하면 떠올리는 y=f(x) 형태의 수식은 아니지만, x, y 값에 따라 참 거짓이 결정되고, 참인 경우를 칠하는 것이라고 보면 됨.
이 "투퍼의 자기 언급 식"이라는 수식에서 중요한 것은, 저 k라는 값임. 사실 저 그림은 그려지기는 하는데 보통 사람들이 상상하듯 원점 근처에서 저렇게 그려지는 것이 아니라 k가
960939379918958884971672962127852754715004339660129306651505519271702802395266424689642842174350718121267153782770623355993237280874144307891325963941337723487857735749823926629715517173716995165232890538221612403238855866184013235585136048828693337902491454229288667081096184496091705183454067827731551705405381627380967602565625016981482083418783163849115590225610003652351370343874461848378737238198224849863465033159410054974700593138339226497249461751545728366702369745461014655997933798537483143786841806593422227898388722980000748404719
라는 무지막지한 값을 가지는 영역에서 그려지는 것이고, 잘 보면 알겠지만 x축과 y축 또한 뒤집혀져 있음.
우선, 그래프가 자기 자신과 일치하는 식을 생각할 때, 임의의 수식은 상하 좌우 유한이기 때문에 이 식이 무한한 xy 평면에 골고루 그려지는 것을 상상하기는 힘드므로, 일정 부분을 추출하는 것 자체는 마땅함. 원점 주변이 아닌 것은 다소 치사하다고 할 수 있겠지만 이 식을 조금 개조하다보면 억지로 원점으로 끌어오는 것 자체는 실제 시도는 안 해봐서 확신은 없지만 가능하지 않을가 싶음.
그리고 x축과 y축이 뒤집힌 것은 사실 크게 중요한 문제가 아니고, k를 다른 값을 고르면 x y축 뒤집지 않고 저 모양이 나오게 할 수도 있음. 굳이 저렇게 뒤집힌 것을 채택한 것은 아마 k를 조금이라도 작은 값으로 만들기 위해서가 아닐까 싶음.
여하튼 저 식을 뜯어보면 사실 그렇게 어렵지는 않은데 mod(x,n)은 x가 정수인 경우에는 n으로 나눈 나머지를 가리키고, 임의의 실수 x로도 그와 비슷하게, 항상 0이상 n미만 값을 가지도록 n의 배수를 빼서 옮겨주는 함수임. 뭔가 대괄호 [] 그리다 만 것은 단순히 소숫점을 버림하는 것으로 생각해도 됨. 다만 음수 -1.5 같은 경우는 -1 - 0.5 로 해석해서 -1로 만드는 것이 아니라 -2 + 0.5로 생각해서 -2가 되는 식임.
이 둘의 정의를 이용하면 위 식이 말하고자 하는 바를 뜯어볼 수 있는데, 우선
이 부분에서 우변은 결국 mod를 통해 0이상 2 미만의 값이 되고, 이걸 정수값을 취하므로 0이나 1이라는 값만 가짐. 따라서 사실 이 식은 1 <= 이라고 해도 의미가 같고, mod를 취한 결과가 1이상 2 미만이면 칠하고, 0이상 1 미만이면 칠하지 않는다는 의미가 됨.
여기서, mod를 취한 결과가 1이상 2 미만이라는 것은 mod를 취하기 전의 정수부가 홀수라는 의미이고, mod를 취한 결과가 0이상 1 미만이라는 것은 mod를 취하기 전의 정수부가 짝수라는 의미임. 즉 이제 남은 것은
의 정수 부분이 홀수인지, 짝수인지를 판별하는 문제가 됨. 그리고 여기서 k의 성질이 사용되는데, 다름이 아니라 저 무지 긴 식이 "17의 배수" 라는 점임. 위 그래프가 그려지는 영역을 보면 k<= y < k + 17인 영역에서 그림을 그리는 것을 볼 수 있는데, 여기서 k가 17의 배수 17k' 이므로
가 성립함. 즉, 이 영역에서
은 상수임. 이제 정수부가 홀수냐 짝수냐는, 2진법으로 나타냈을 때 1의 자리 수고, 뒤에 붙은 2의 거듭제곱에 음수를 붙이는 것은 그냥 2진법에서 자리를 하나씩 낮추는 것에 불과함. 우리가 정수부에만 관심이 있으므로 소수부는 버려도 되고, 따라서 저 부분은 프로그래밍 언어로 나타내면
과 다를 바가 없음. 따라서 우리에게 주어진 식은 다른 게 아니라 위의 이 식을 계산해서 2진법으로 1의 자리를 취하고 (프로그래밍 언어의 용어로 설명하자면 1과 bitwise and 를 취하고) 그 값이 1이면 칠하고 0이면 칠하지 않는 것에 불과함. 즉 k'의 각 자리에 칠해야 하는 비트 정보를 넣어두면 그에 맞게 그림을 그려주는 함수라고 할 수 있고, 저 기나긴 k의 값은 다른 게 아니라 이 수식을 도트 장인 처럼 01 수열로 만든 뒤 17을 곱한 수에 불과하다는 것을 알 수 있음.
이 매커니즘을 이해하고 나면 이 수식이 어떻게 만들어졌는지를 알 수 있는데, 결국 근본적인 것은 순수 수학적인 식 하나로 표현하기 위해서는 변수나 배열 등을 사용할 수 없기 때문에 이런 형태가 된 것임. 궁극적으로 이 식이 하고자 하는 것은
1. 그림 흑백 도트 찍은 것을 2중 배열 a[m][17]으로 표현함
2. 이 2중 배열을 단일 배열 b에 저장하고 a[x][y] = b[x * 17 + y] 를 통해서 접속함. (0 <= y < 17)
3. 이 배열을 b[0] + b[1] * 2 + b[2] * 2^2 + b[3] * 2^3 + ... 이라는 수 k'으로 저장함.
4. 이 k'이라는 수가 너무 커서 수식 내에 인용할 수가 없으므로 이를 그래프가 그려지는 영역을 통해서 표현하기로 하고, y값을 이와 연관해서 저장. 이 과정에서 y가 커지므로 b[x*17 + y] 를 b[x*17 + (y % 17)]로 변형
해서 만들어진 식임. 따라서 이 식에서 17은 별다른 의미를 가지지 않고, 이 17을 수정하면 그림의 높이를 수정할 수 있음. 또 여기서 2를 수정하면 이제 비트의 배열이 아니라 더 많은 정보의 배열을 표현할 수 있고, 이를 색깔과 결합하면 그림에 색을 입힐 수도 있음. 사실 여기까지 가면 저 k라는 값은 사실 bmp 파일과 원리가 거의 완전히 일치한다는 것이 보임.
실제로 저 k 값을 이용해서 17로 나눈 뒤 2진수 문자열로 변형하고, 앞에 적절하게 0을 패딩해주거나, 뒤부터 출력하는 방식을 택하거나 해서 17자마다 개행하는 방식을 써보면 저 수식을 표현하는 그림이 나오는 것을 쉽게 관찰할 수 있을 거임.
(IP보기클릭)210.104.***.***
(IP보기클릭)112.156.***.***