조선 후기의 학자이자 영의정이었던 최석정(崔錫鼎, 1646-1715)은 수학서 《구수략(九數略)》에 여러 수 배열을 남겼다. 그중 낙서육고도(洛書六觚圖)는 중심을 비운 거대한 육각 격자에 1부터 270까지를 배치하는 도안이다.
이 글은 이 도안을 원본 그대로 단정해 복원했다고 주장하지 않는다. 원문은 애초에 빈 격자와 기하 조건을 제시할 뿐, 칸별 숫자와 배치 순서를 지정하지 않는다. 대신 문헌의 기하 조건을 계산으로 확인하고, 그 조건을 만족하는 배치를 현대 탐색 알고리즘으로 찾은 과정을 소개한다.
먼저 알아둘 말
마방진은 칸마다 서로 다른 수를 넣고, 정해진 줄의 합이 같게 만든 배열이다. 정사각형이 아닌 도형까지 넓혀 부르면 마법 그래프 또는 마도라고 할 수 있다. 낙서육고도는 정육각형 격자 위에서 이 조건을 연구하는 사례다.
허일(虛一)은 중심의 한 칸을 비워 둔다는 뜻이다. 낙서육고도는 중심을 제외한 270칸에 1부터 270까지를 한 번씩 넣는다.
대척점은 중심을 사이에 둔 정반대 위치다. 여기서는 대척 관계에 있는 두 칸의 합이 언제나 271이 되도록 짝을 짓는다. 예를 들어 한쪽이 37이면 반대쪽은 234다. 이런 짝을 대척 관계에 있는 보수쌍이라고 부르겠다.
합동식, 또는 mod 연산은 나눈 나머지를 보는 방법이다. 예를 들어 17은 5로 나누면 나머지가 2이므로 $17 \equiv 2 \pmod 5$라고 쓴다. 뒤에서 수를 다섯 색으로 분류할 때 사용한다.
271칸 중 270칸을 채우는 육각형
육각형의 중심에서 한 겹 바깥으로 갈수록 칸 수는 6개씩 늘어난다. 한 변에 10칸인 이 도안은 중심과 아홉 개의 고리로 이루어진다.
\[1+(6+12+\cdots+54)=1+6(1+2+\cdots+9)=271\]중심 한 칸은 허일로 남겨 두므로 채울 칸은 정확히 270개다. 1부터 270까지의 합은 36,585다. 전통 수학에서 낙서의 수로 부르는 45의 여섯 배가 270이라는 점도 도안의 이름과 규모를 연결한다.
대척 관계에 있는 보수쌍 규칙을 적용하면 여러 합이 자동으로 따라온다.
| 구조 | 확인할 합 |
|---|---|
| 대척점 한 쌍 | 271 |
| $k$번째 고리 | $813k$ |
| 중심을 지나는 세 축 | 각각 2439 |
| 가장 바깥 여섯 변 | 각각 1355 |
예를 들어 $k$번째 고리에는 대척쌍이 $3k$개 있으므로 고리 합은 $271 \times 3k=813k$다. 중심축은 양쪽에 9칸씩 있어 총 9쌍, 곧 $271 \times 9=2439$가 된다. 긴 조건처럼 보여도 많은 부분이 한 가지 대칭 규칙에서 나온다.
흐린 주석의 내적법은 무엇을 계산했나
원본의 내적법(來積法) 주석은 스캔이 흐려 처음에는 판독이 어려웠다. 이미지 대비를 높이고 고자와 이체자를 대조해 읽은 결과, 이것은 값을 어느 칸에 놓을지 지시하는 배치 규칙이라기보다 도안의 크기를 확인하는 계산 절차에 가깝다는 해석이 나왔다.
핵심 계산은 다음처럼 이어진다.
외주 54 + 6 = 60
60 / 6 = 10 한 변의 칸 수
10 x 2 - 1 = 19 중심축의 칸 수
10부터 18까지의 합 x 9 = 252
252 + 19 = 271 중심을 포함한 전체 칸 수
271 - 1 = 270 허일 뒤 실제로 채울 칸 수
판독 과정에서 사라진 듯 보였던 152도 $(20-12) \times 19=152$라는 독립 계산으로 확인되며, $152+100=252$의 검산 경로에 합류한다. 자세한 판독과 계산 검증은 내적법 판독문, 평가 보고서, 검증 코드에서 볼 수 있다.
원문 대조: 원문이 말하는 것과 말하지 않는 것
판독 가능한 원문 구절을 현대 기하 모델에 대조하면, 숫자 배열의 규칙보다 격자의 크기와 칸 수를 확인하는 내용이 중심이라는 점이 드러난다.
| 원문 구절 | 이 글의 해석 | 확인 방법 | 판정 |
|---|---|---|---|
| 共積二百七十 | 실제로 채울 칸은 270개 | 중심을 비운 271칸 격자 | 확인 |
| 虛一則二百七十數 | 중심 한 칸을 비움 | $271-1=270$ | 확인 |
| 校計周五十四數 | 바깥 고리는 54칸 | 아홉 번째 고리의 칸 수 $6 \times 9$ | 확인 |
| 通加洛書數六倍 | $270=6 \times (1+\cdots+9)=6 \times 45$ | 고리별 칸 수의 합 | 확인 |
| 以算遠則係以六 | 6이 계산과 연결됨 | 고리마다 칸 수가 6개씩 증가 | 기하 계산으로는 정합 |
| 각 칸의 숫자와 배치 순서 | 원문에 지정 없음 | 빈 격자 자체 | 원문이 강제하지 않음 |
마지막 행이 특히 중요하다. 원문에는 “어느 좌표에 어느 수를 쓰라”는 칸별 규칙이 없으므로, 대척 관계에 있는 보수쌍이나 6-승수 생성 순서는 원문에서 직접 읽은 사실이 아니라 현대의 분석 가설이다. 따라서 아래의 탐색 결과는 원문 대조를 통과한 기하 조건을 만족하는 예시이며, 원문의 숨은 정답을 찾아냈다는 주장은 아니다.
원문과 담금질 해, 무엇을 비교할 수 있나
여기서 가장 중요한 구분이 있다. 원문은 숫자 배열이 흐려져 잃어버린 배치표가 아니다. 애초에 빈 육각 격자와 외주 54, 중심축 19, 270칸 같은 기하 계산을 제시하고, 각 칸에 어떤 수를 놓아야 하는지는 정하지 않았다. 따라서 원문 자체가 하나의 유일한 숫자 배열을 강제하지 않으며, 아래의 어느 재구성 그림도 “최석정이 실제로 배치한 유일한 해”라고 부를 수 없다.

원문 주석 스캔. 비교의 출발점은 특정 숫자 배열이 아니라 기하 수치다.
그래서 비교의 대상은 칸마다 같은 숫자인지가 아니라, 원문에서 확인되는 조건을 어떤 방식으로 만족하는가다.
| 구분 | 원문에서 직접 확인되는 것 | 담금질 탐색에서 만든 것 | 결론 |
|---|---|---|---|
| 기하 골격 | 270칸, 허일, 외주 54, 중고 19 | 같은 육각 좌표 격자 | 직접 비교 가능 |
| 수의 배치 | 빈 격자만 제시하며 각 칸의 수를 지정하지 않음 | 1부터 270까지의 한 순열 | 원문이 칸별 일치율의 기준을 제공하지 않음 |
| 대척 관계에 있는 보수쌍 | 다른 도안과의 유추로 세운 가설 | 모든 대척쌍의 합을 271로 강제 | 유력한 복원 가설이지만 원문 확정은 아님 |
| 변, 고리, 축의 합 | 기하 계산에서 도출되는 목표 | 최적화 목적함수로 검증 | 조건 충족 여부를 비교 가능 |
아래 왼쪽은 대척 관계에 있는 보수쌍 가설 아래에서 자유롭게 담금질 탐색해 얻은 최적해다. 원문 수치 조건을 모두 만족하며 최종 벌점은 6.0이다. 오른쪽은 여기에 $v(P_t) \equiv 6t \pmod {271}$이라는 6-승수 값 생성 순서까지 강제한 재구성해다. 이 해도 벌점 6.0에 도달한다. 즉 원문의 “6”을 값 생성의 단서로 읽는 해석은 가능한 해를 하나 만들지만, 그것만으로 역사적 원본임을 증명하지는 않는다.

자유 담금질 탐색 최적해. 원문 조건을 만족하는 한 표본이다.

6-승수 재구성 최적해. 값 생성 순서를 추가로 보존한 표본이다.
두 그림의 숫자 위치가 크게 다른 것은 실패나 정보 손실의 결과가 아니다. 원문이 특정 배열을 강제하지 않으므로, 같은 기하 조건을 만족하는 여러 해를 만들 수 있다. 실제로 서로 다른 시드로 얻은 최적해 두 개는 270칸 중 같은 위치의 값이 0개였다. 이 프로젝트의 목표는 최석정의 유일한 칸별 배치를 역산하는 것이 아니라, 원문이 제시한 기하 골격 아래에서 어떤 해가 가능한지와 어떤 조건이 서로 충돌하는지를 밝히는 데 있다.
컴퓨터는 어떻게 배치를 찾았나
가능한 배치는 처음에는 $270!$, 대략 $10^{540}$개나 된다. 대척점의 합을 271로 고정하면 각 쌍의 방향과 135개 쌍의 배치만 고르면 되므로 탐색 공간은 $2^{135} \times 135!$, 대략 $10^{246}$개로 줄어든다. 그래도 전수조사는 불가능하다.
그래서 simulated annealing, 한국어로 담금질 탐색을 사용했다. 좋은 배치에서 조금씩 값을 교환해 보고, 초반에는 나빠지는 변화도 때때로 받아들여 지역 최적점에 갇히지 않게 한다. 시간이 지날수록 그 허용 범위를 줄인다. 이 문제에서는 각 고리, 변, 축, 섹터의 목표 합에서 얼마나 벗어났는지를 벌점으로 삼는다.
탐색은 이론적으로 가장 낮은 최종 벌점 6.0에 도달했다. 0.0이 아닌 이유도 구조에서 나온다. 6개 섹터는 각 45칸, 6개 방사선은 각 9칸으로 홀수 개의 칸을 갖는다. 따라서 합을 정확히 반반으로 나눌 수 없고, 섹터는 6097과 6098, 방사선은 1219와 1220이 번갈아 나오는 것이 최선이다. 탐색 코드는 이 조건과 탐색 과정을 구현한다.
담금질 탐색은 복원 알고리즘이 아니다
담금질 탐색은 무작위 교환과 많은 반복을 통해 좋은 후보를 찾는 휴리스틱이다. 해가 존재한다는 예시를 빠르게 얻는 데는 유용하지만, 반복 횟수와 시드에 따라 결과가 달라지고 일반적으로 최적해를 보장하지 않는다. 이처럼 큰 순열 공간에서 많은 재시작과 반복에 의존하는 방식은 전산학적으로 효율적인 구성 알고리즘이라고 보기 어렵다.
더 중요한 점은 원저자의 출제 의도와의 관계다. 원문은 빈 격자의 기하 구조와 그 검산을 제시하고 개별 숫자 배열을 강제하지 않는다. 반면 담금질 탐색은 연구자가 뒤늦게 정한 대척 관계에 있는 보수쌍과 합 조건 아래에서 임의의 한 배열을 골라낸다. 따라서 이 결과는 원문 조건 아래 가능한 해의 존재를 보이는 계산 실험이지, 원저자가 의도한 풀이법이나 구성 절차의 복원이 아니다.
시간복잡도와 공간복잡도 비교
복잡도를 비교하려면 한 변의 길이를 $n$, 실제로 채우는 칸 수를 $N=3n(n-1)$이라 두는 편이 좋다. 낙서육고도에서는 $n=10$, $N=270$이다. 또 담금질의 반복 수를 $I$, 재시작 횟수를 $R$로 둔다. 고정된 270칸만 보면 모든 실행 시간이 상수처럼 보이므로, 아래 표는 크기를 일반화한 경우를 말한다.
| 방법 | 상태와 한 번의 처리 | 시간복잡도 | 공간복잡도 | 해석 |
|---|---|---|---|---|
| 원문의 기하 계산 | 외주, 고리, 중고의 수식을 계산 | 수식 계산은 $O(1)$, 격자를 실제로 열거하거나 그리면 $O(N)$ | 수식만 쓰면 $O(1)$, 격자를 저장하면 $O(N)$ | 숫자 배열을 찾는 탐색이 아니라 도안의 크기를 검산하는 절차 |
| 원문 해석에서 파생한 6-승수 구성 모형 | 길이 $N$의 배치 순서와 방향을 만들고, 후보마다 전체 값을 다시 구성해 채점 | 초기화 $O(N)$, 반복당 $O(N)$, 합계 $O(RIN)$ | $O(N)$ | 현대의 가설 모형이다. 원문의 직접 알고리즘은 아니다. |
| 자유 담금질 탐색 | 대척 관계에 있는 보수쌍의 슬롯과 구조별 합을 증분 갱신 | 초기화 $O(N)$, 한 이동의 갱신과 채점은 $O(1)$, 합계 $O(N+RI)$ | $O(N)$ | 빠르게 후보를 찾지만, 해의 구성 규칙을 설명하지 못한다. |
자유 담금질 탐색이 반복당 더 싼 이유는 합계를 매번 처음부터 다시 더하지 않기 때문이다. 두 보수쌍을 바꾸거나 방향을 뒤집을 때 영향을 받는 변, 섹터, 광선의 합만 갱신한다. 반면 6-승수 구성 모형은 후보마다 270개 값과 값 순서의 경로 거리를 다시 만들고 검사하므로 한 번의 이동도 $O(N)$이 든다. 이 차이는 비교 구현과 구성 모형 구현에서 직접 확인할 수 있다.
그러나 자유 담금질의 더 낮은 반복 비용은 원문과의 더 높은 관련성을 뜻하지 않는다. 원문의 내적법은 배열 탐색을 요구하지 않는 기하 계산이고, 두 현대 탐색은 모두 원문 바깥에서 추가한 가설을 실험하는 도구다. 따라서 복잡도 비교의 결론은 “담금질이 빠르다”가 아니라, 원문 계산과 해 탐색은 애초에 서로 다른 문제라는 데 있다.
mod 5로 보면 드러나는 대칭
찾은 배치의 수를 5로 나눈 나머지 0부터 4에 따라 다섯 색으로 칠해 보았다. 그러면 나머지 0과 1, 나머지 2와 4의 위치는 180도 회전했을 때 서로 겹친다. 나머지 3의 위치는 스스로 180도 회전 대칭이다.
이는 우연한 그림 효과가 아니다. 대척점의 값 $v$와 $v’$가 $v+v’=S$를 만족하면, 임의의 mod $m$에 대해 다음이 성립한다.
\[v' \equiv S-v \pmod m\]낙서육고도에서는 $S=271 \equiv 1 \pmod 5$이므로 나머지의 대응은 $r \mapsto 1-r \pmod 5$다. 따라서 $0 \leftrightarrow 1$, $2 \leftrightarrow 4$, $3 \leftrightarrow 3$이 된다. 이 관계는 다른 mod 값과 구수략의 다른 대칭 도안에도 적용할 수 있다. mod 5 분석 코드와 mod N 일반화 코드에서 확인할 수 있다.
남는 한계와 의미
원문이 특정 배열을 정하지 않으므로, 합 조건을 만족하는 해는 여럿일 수밖에 없다. 계산으로 되돌려야 할 최석정의 유일한 순서 자체가 주어지지 않은 셈이다. 따라서 담금질 해는 원문의 정답 후보가 아니라, 선택한 가설과 조건이 양립할 수 있음을 보여 주는 한 표본으로 읽어야 한다.
그럼에도 이 분석은 세 가지를 분명하게 한다. 흐린 주석의 수치가 서로 연결된 기하 검산 사슬이라는 점, 거대한 순열 문제를 제약 충족 문제로 바꾸어 가능한 해를 실험할 수 있다는 점, 그리고 대척 관계에 있는 보수쌍을 가정하면 잉여류의 대칭까지 따라온다는 점이다. 300년 전 도안을 오늘의 코드로 다시 읽는 일은, 전통 수학의 질문을 더 정확한 형태로 남기는 작업이기도 하다.
전체 실험과 결과물은 낙서육고도 복원 프로젝트와 출력 폴더에서 확인할 수 있다.