< 홀수에 대한 마방진 건설법 >

la Loubere의 알고리즘은 다음과 같이 분석할 수 있습니다.

  1. n은 홀수여야 합니다. (n이 홀수가 아닌경우 error)
  2. 0th 열의 가운데 행에 1을 넣고 출발합니다.
  3. 그후, 다음 그림과 같은 방식으로 진행합니다.
    오른쪽 윗쪽 대각선 방향으로 이동하면서, 윗쪽 경계에 이르면 다시 아래쪽으로 돌아오고, 이미 숫자가 채워져있는 칸을 만나면, 한칸 아래로 이동한 후, 다시 같은 방법으로 진행하면서 지나치는 칸에 숫자를 채우는 것입니다.

이것을 표현할 수 있는 Java Applet은 다음과 같으며 n = 3 부터 n = 11 까지 작동합니다.

이 프로그램의 소스코드는 MagicSquare.java 입니다.

< 짝수에 대한 마방진 건설법 >

(1) 4의 배수 ( 4*4 , 8*8 , 12*12 , etc ) 마방진 만들기

   예를 들어 4*4칸의 작성방법을 봅시다.  (n=4, sum=34)

  a. 아래 그림처럼 영역을 9개의 구역으로 나눕니다.

     그림에서 보는 것처럼 4의 배수 칸들은 1 : 2 : 1의 비율로 정확히 나눌 수 있습니다.

              

k

2k

k

 

A

B

C

k

D

E

F

2k

G

H

I

k

 

 b. 암회색으로 표시된 A, C, E, G 와 I 영역은 글을 써 내려가듯이 정방향으로 숫자를 차례로 써 넣습니다

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

c. 회색의 나머지 영역은 끝에서부터 역방향으로 숫자를 차례로 써 올라옵니다.

1

15

16

4

12

6

7

9

8

10

11

52  

13

3

2

16

d. 이해를 돕기 위한 8*8의 예  ( n=8 , sum= 260 )

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

 

(2) 4k+2 ( 6*6 , 10*10 , etc ) 마방진 만들기 (n=6, sum=111)

   a. 이 칸들은 4로 약분되지 않고 두 칸이 남으므로, 영역을 아래 그림처럼 나눈다. 우선 분홍색의 경계블록 영역을 경계선처럼 보면 이해가 쉽습니다.

 

k

 

2k

 

k

 

up

block

 

 

 

 

 

down

block

A

 

B

 

C

k

 

X

 

X

 

 

D

 

E

 

F

2k

 

X

 

X

 

 

G

 

H

 

I

k

  b. A 에서 I 까지의 영역은 4의 배수칸들의 작성법을 적용하여 숫자를 채워 넣습니다.

   테두리의 수치(37)는 그 방향의 행 또는 열의 빈 칸에 들어갈 숫자들의 합이 만족시켜야 할 값입니다.

   여기서 보면 경계블록의 숫자들에 문제 해결의 열쇄가 있음을 알 수 있습니다.

    그러면 실제로 경계블록 숫자들을 적절히 조작하여 마방진을 완성시켜 봅시다.  

1

 

34

33

 

6

 

X

 

 

X

 

24

 

15

16

 

19

18

 

21

22

 

13

 

X

 

 

X

 

31

 

4

3

 

36

c. 우선은 4개의 경계블록 칸에 숫자를 정방향으로 써 내려갑시다.

   여기서 알고 있어야할 두가지 사실은:

    경계블록의 수치들은 곧 조작을 통하여 자리바꿈을 하게 될 것이며,

    교차된 지점의 'X' 표시가 된 칸의 숫자들은 자리바꿈에서 제외됩니다. 왜냐하면 그 숫자들은 대각선의 합과도 관계되기 때문입니다.

 

 

2

 

 

5

 

7

X

9

10

X

12

 

14

 

 

17

 

 

20

 

 

23

 

25

X

27

28

X

30

 

32

 

 

35

 

d. 우선 좌-우 경계블록의 조작을 먼저 하겠습니다.

2    5

X   X

14  17

20  23

X   X

32  35

7

 

31

43

 

67

2   35

X   X

14  23

20  17

X   X

32   5

OK

 

OK

OK

 

OK

2   35

X   X

23  14

17  20

X   X

32   5

2    35

8    11

23   14

17   20

26   29

32    5

2    35

8    11

23   14

20   17

26   29

32    5

 

 

 

    80

 

 

74  74

 

108 114

 

111  111

OK  OK

우측경계블록의 숫자 배열을 상하로 뒤집습니다.  ==> 가로방향 해결 !!

 경계블록의 중앙부분에 있는 숫자들을 좌우로 교환시킵니다. ==> 세로방향 블록 1차 정리.

 'X' 표시한 칸의 숫자들을 포함한 블록의 세로 합을 보정하기 위해 중앙선의 바로 아래칸(행)에 해당하는 두 숫자를 다시 좌우 교환시킵니다. ==> 세로방향 블록 해결 !!

 e. 상-하 경계블록을 위와 같은 절차대로 하다보면 마지막 단계에서 전체 보정을 위한 교환 쌍을 찾을 수 없게 됩니다. 이 문제를 해결하기 위하여 부득이 아래 그림처럼 다른 영역의 숫자열을 택해서 좌우 순서열을 바꾸어주어야 합니다.

  'B' 또는 'H' 영역 중의 한 행을 택해서 좌우 순서열을 바꾸어 줍니다. (cf. 34 <= => 33)

  'D' 영역과 'F' 영역 중의 같은 한 행을 택해서 좌우 순서열을 바꾸어줍니다. (cf. 24 <= => 19)

 각 열의 합이 만족시켜야 할 값이 변경되었습니다(42-38-36-32). 그러나 위의 5번 단계의 조작을 해줌으로써 나중에 마지막 보정을 성공적으로 할 수 있게 됩니다. 또한 단계 6-a 처럼 해줌으로써 변경된 세로합의 요구치들(42-38-36-32)을 쉽게 일치시킬 수 있게 됩니다.

1

2

34

33

35

6

OK

 

8

 

 

11

 

 

19

23

15

16

14

24

OK

18

20

21

22

17

13

OK

 

26

 

 

29

 

 

31

32

4

3

5

36

OK

42

OK

38

36

OK

32

 

f. 5번 단계와 연계하여 상-하 경계블록의 조작을 다음과 같이 합니다.

7  X  9 10 X 12

25 X 27 28 X 30  

38

110 ⇒(A)

12 X 10  9 X  7

30 X 28 27 X 25

38

110 ⇒(D)

12 8 28 27 11 7

30 26 10 9 29 25

93

129 ⇒(C)

30 8 28 27 11 7

12 26 10 9 29 25

111

111

32   36 38    42

 

42   38  36   32

 

 

 

 

 

상,하경계블록의 숫자 배열을 둘 다 좌우로 뒤집습니다. ==> 세로방향 해결 !!

 경계블록의 중앙부분에 있는 숫자들을 상하로 교환시킵니다. ==> 가로방향 블록 1차 정리.

 'X' 표시한 칸의 숫자들을 포함한 블록의 가로 합을 보정하기 위해 첫번째칸(열)에 해당하는 두 숫자를 상하 교환시킵니다. ==> 가로방향 블록 해결 !!

( 마지막 칸에 해당하는 두 숫자를 선택해도 상관 없습니다. )

1

2

34

33

35

6

30

8

28

27

11

7

19

23

15

16

14

24

18

20

21

22

17

13

12

26

10

9

29

25

31

32

4

3

5

36

g. 이해와 확인을 돕기 위한 10x10 칸의 예 (n=10, sum=505)  

1

2

3

94

95

96

97

98

9

10

11

12

13

87

86

85

84

88

19

20

80

29

23

77

76

75

74

28

22

21

70

69

68

34

35

36

37

33

62

61

60

59

58

44

45

46

47

43

52

51

41

42

53

54

55

56

57

48

49

50

40

39

38

64

65

66

67

63

32

31

30

79

73

27

26

25

24

78

72

71

81

82

83

17

16

15

14

18

89

90

91

92

93

7

6

5

4

8

99

100