마방진이라는 것에 대하여 적어볼려고 한다.
마방진의 역사, 발생원인 등등 뭔가 대단한 것들이 검색하니까 쏟아져 나오던데,
그런 것들에 대하여 뭔가 사고해보고 싶은것은 아니다.
다만 퍼즐 같은 느낌의 마방진을 항상 풀 수 있는 어떤 해법은 없을까 생각해보고 싶었다.
약간의 시간을 두고 생각해보니 답은 있었고 답까지 진행했던 나의 생각들을 정리하고 싶어서 여기에 끄적여 본다.
검색을 통하여 엄청나게 많은 해법들을 볼수 있다.
내가 제시하는 방법도 그중에 한가지일 뿐이라 생각한다.
자료들을 보니 다들 홀수와 짝수로 나누어 해법을 하고 있고,
또한 그중 짝수를 4의 배수와 그외의 것으로 나누어 해법을 하고 있었다.
나또한 해법 그룹을 그렇게 나누어 생각하였고 오늘은 그중 4배수에 대한 해법을 알아보려 한다.
또한 이 방법을 php로 표현하여 웹상에서 마방진이 자동 생성되도록 프로그래밍도 해보았는데 뒤에 소스도 공개하도록 할 예정이다.
4배수 풀이방법
1. 전채를 비율로 패턴분할하여 계산하는 방법
아래 표는 4차 마방진의 완성모습이다.
1 |
15 |
14 |
4 |
12 |
6 |
7 |
9 |
8 |
10 |
11 |
5 |
13 |
3 |
2 |
16 |
완성모습으로 변화하는 과정을 보자.
다음 표를 보면 색갈을 통하여 두구역으로 나누어 놨다.
1 |
15 |
14 |
4 |
12 |
6 |
7 |
9 |
8 |
10 |
11 |
5 |
13 |
3 |
2 |
16 |
노란색칸에는 숫자가 순서대로 진행이 되고, 흰색칸에는 숫자가 거꾸로 진행됨을 알수 있다.
놀랍게도 이렇게 순서만 바꾸었을 뿐인데 가로,세로,대각선의 합이 일치한다.
첫번째 방법은 이런패턴으로 모든 4배수 마방진을 완성하는 것이다.
확인을 위하여 다음으로 8차 마방진을 보자.
<
1 | 2 | 62 | 61 | 60 | 59 | 7 | 8 |
9 | 10 | 54 | 53 | 52 | 51 | 15 | 16 |
48 | 47 | 19 | 20 | 21 | 22 | 42 | 41 |
40 | 39 | 27 | 28 | 29 | 30 | 34 | 33 |
32 | 31 | 35 | 36 | 37 | 38 | 26 | 25 |
24 | 23 | 43 | 44 | 45 | 46 | 18 | 17 |
49 | 50 | 14 | 13 | 12 | 11 | 55 | 56 |
57 | 58 | 6 | 5 | 4 | 3 | 63 | 64 |
표에서 보는것과 같이 같은 패턴으로 크기만 확장된 모습이다.
이정도 참조하면 12차나 16차도 어떤모습인지 예측이 될거라 생각한다.
2. 단위패턴으로 증가하여 계산하는 방법
4차 마방진은 위에서 알아보았던 방법과 동일하다.
다만 8차나 16차로 올라감에 따라 패턴의 크기가 증가하는 것이 아니라 기본패턴 자체가 증가되는 방식이다.
말로는 설명이 어려우니 바로 8차 마방진의 패턴을 보도록하자.
1 | 63 | 62 | 4 | 5 | 59 | 58 | 8 |
56 | 10 | 11 | 53 | 52 | 14 | 15 | 49 |
48 | 18 | 19 | 45 |
44 |
22 | 23 | 41 |
25 | 39 | 38 | 28 | 29 | 35 | 34 | 32 |
33 | 31 | 30 | 36 | 37 | 27 | 26 | 40 |
24 | 42 | 43 | 21 | 20 | 46 | 47 | 17 |
16 | 50 | 51 | 13 | 12 | 54 | 55 | 9 |
57 | 7 | 6 | 60 | 61 | 3 | 2 | 64 |
위 표와 같이 기본 4x4 패턴이 증가하여 전채로 형성된다.
정리해 보자면 두방법 모두 어떤 시작지점에서 진행함에 있어 패턴확장이든 패턴증가든 한패턴에서 진행함에 있어 다른패턴은 반대로 진행하면 된다.
다시 말해서 시작을 왼쪽위에서 하든, 왼쪽 밑에서 하든, 가로로 하든, 새로로 하든 패펀분리만 시킨후 다른패턴을 역으로 기록한다.
다음은 오른쪽위에서 가로로 진행하며 기본패턴증가방식으로 형성한 12차 마방진의 완성모습이다.
12 |
134 |
135 |
9 |
8 |
138 |
139 |
5 |
4 |
142 |
143 |
1 |
121 |
23 |
22 |
124 |
125 |
19 |
18 |
128 |
129 |
15 |
14 |
132 |
109 |
35 |
34 |
112 |
113 |
31 |
30 |
116 |
117 |
27 |
26 |
120 |
48 |
98 |
99 |
45 |
44 |
102 |
103 |
41 |
40 |
106 |
107 |
37 |
60 |
86 |
87 |
57 |
56 |
90 |
91 |
53 |
52 |
94 |
95 |
49 |
73 |
71 |
70 |
76 |
77 |
67 |
66 |
80 |
81 |
63 |
62 |
84 |
61 |
83 |
82 |
64 |
65 |
79 |
78 |
68 |
69 |
75 |
74 |
72 |
96 |
50 |
51 |
93 |
92 |
54 |
55 |
89 |
88 |
58 |
59 |
85 |
108 |
38 |
39 |
105 |
104 |
42 |
43 |
101 |
100 |
46 |
47 |
97 |
25 |
119 |
118 |
28 |
29 |
115 |
114 |
32 |
33 |
111 |
110 |
36 |
13 |
131 |
130 |
16 |
17 |
127 |
126 |
20 |
21 |
123 |
122 |
24 |
144 |
2 |
3 |
141 |
140 |
6 |
7 |
137 |
136 |
10 |
11 |
133 |
최종적으로 마지막에 했던 방식대로 php를 이용하여 구현해본 코드는 다음과 같다.
$k = 1 ; |
여기서 $square는 차수를 의미하며, $i와 $j는 행열을 의미한다.