幻方

维基百科,自由的百科全书
跳转至: 导航搜索
洛書(九数图),朱熹《周易本義》

幻方,有时又称魔方(该称呼现一般指立方体的魔術方塊)或纵横图,由一组排放在正方形中的整数组成,其每行、每列以及两条对角线上的数之和均相等。通常幻方由从1N^2的连续整数组成,其中N为正方形的行或列的数目。因此N阶幻方有NN列,并且所填充的数为从1N^2

幻方可以使用N阶方阵来表示,方阵的每行、每列以及两条对角线的和都等于常数M_2(N),如果填充数为1,2,\dots,N^2,那么有

M_2(N) = \frac{N(N^2+1)}{2}

幻方简史[编辑]

《繫辭》云:「河出圖,洛出書,聖人則之。」在宋朝之前,洛書的記述只有文字。

九宮圖實物最早發現於西漢,1977年中國考古學家在安徽阜陽縣雙古堆西漢古墓中發現漢文帝七年(前173年)的太乙九宮占盤,乃是中國漢代幻方的實物。東漢《數術記遺》也有記載。

後來陳摶以降認為河圖洛書的洛書代表九宫图,為1,\dots,99个数,而3行、3列以及两对角线上各自的数之和均为15。

杨辉纵横图[编辑]

杨辉纵横图

南宋数学家杨辉著《续古摘奇算法》把类似于九宫图图形命名为纵横图,书中列举3、4、5、6、7、8、9、10阶幻方。其中所述三阶幻方构造法:“九子斜排,上下对易,左右相更,四维挺出,戴九履一,左三右七,二四为肩,六八为足”,比法国数学家Claude Gaspar Bachet提出的方法早三百余年。

构造法[编辑]

根据构造方法的不同,幻方可以分成三类:奇数阶幻方4M阶幻方和4M+ 2阶幻方,其中M自然数2阶幻方不存在。幻方构造法主要有:连续摆数法阶梯法(楼梯法)、奇偶数分开的菱形法对称法对角线法比例放大法斯特雷奇法LUX法拉伊尔法(基方、根方合成法)、镶边法相乘法幻方模式等。

奇数阶幻方构造法[编辑]

Siamese方法(Kraitchik 1942年,pp. 148-149)是构造奇数阶幻方的一种方法,说明如下:

  • 1放置在第一行的中间。
  • 顺序将2,3,\dots等数放在右上方格中。
  • 当右上方格出界的时候,则由另一边进入。
  • 当右上方格中已经填有数,则把数填入正下方的方格中。
  • 按照以上步骤直到填写完所有N^2个方格。

(由于幻方的对称性,也可以把右上改为右下、左上以及左下等方位)

以下图5阶幻方为例,1填写在(1,3)(第一行第三列)的位置上;2应当填写在其右上方格即(0,4)中,由于(0,4)超出顶边界,所以从最底行进入,即(5,4)3填写在(5,4)的右上方格(4,5)中;4填写在(4,5)的右上方格(3,6)中,由于(3,6)超出右边界,所以从最左列进入,即(3,1)5填写在(3,1)的右上方格(2,2)中;6应该填写的方格(1,3)已经被1所占据,因此填写在(2,2)的正下方格(3,2)中;按照上面的步骤直到所有数填入。

\begin{bmatrix}
8 & 1 & 6 \\
3 & 5 & 7 \\
4 & 9 & 2 \\
\end{bmatrix} \begin{bmatrix}
17 & 24 & 1 & 8 & 15 \\
23 & 5 & 7 & 14 & 16 \\
4 & 6 & 13 & 20 & 22 \\
10 & 12 & 19 & 21 & 3 \\
11 & 18 & 25 & 2 & 9
\end{bmatrix} \begin{bmatrix}
37 & 48 & 59 & 70 & 81 & 2 & 13 & 24 & 35 \\
36 & 38 & 49 & 60 & 71 & 73 & 3 & 14 & 25 \\
26 & 28 & 39 & 50 & 61 & 72 & 74 & 4 & 15 \\
16 & 27 & 29 & 40 & 51 & 62 & 64 & 75 & 5 \\
6 & 17 & 19 & 30 & 41 & 52 & 63 & 65 & 76 \\
77 & 7 & 18 & 20 & 31 & 42 & 53 & 55 & 66 \\
67 & 78 & 8 & 10 & 21 & 32 & 43 & 54 & 56 \\
57 & 68 & 79 & 9 & 11 & 22 & 33 & 44 & 46 \\
47 & 58 & 69 & 80 & 1 & 12 & 23 & 34 & 45
\end{bmatrix}
3 5 9

魔方阵不是唯一的,比如5阶魔方阵还可以是:

\begin{bmatrix}
15 & 6 & 19 & 2 & 23 \\
16 & 12 & 25 & 8 & 4 \\
9 & 5 & 13 & 21 & 17 \\
22 & 18 & 1 & 14 & 10 \\
3 & 24 & 7 & 20 & 11
\end{bmatrix}
5

偶数阶幻方构造法[编辑]

4M阶幻方构造法[编辑]

对于4M阶幻方一般都用对调法,制作起来很容易。如4阶幻方的排列法:
\begin{bmatrix}
1 & 2 & 3 & 4 \\
5 & 6 & 7 & 8 \\
9 & 10 & 11 & 12 \\
13 & 14 & 15 & 16
\end{bmatrix}
按如上图排列好,再将非主副对角线上的各个数关于中心对调,即成下图:
\begin{bmatrix}
1 & 15 & 14 & 4 \\
12 & 6 & 7 & 9 \\
8 & 10 & 11 & 5 \\
13 & 3 & 2 & 16
\end{bmatrix}

4M+2阶幻方构造法[编辑]

加边法[编辑]

6阶为例子,先排出4阶的幻方,如上图,再将图中每一个数都加上8m+2=10,有下图:
\begin{bmatrix}
11 & 25 & 24 & 14 \\
22 & 16 & 17 & 19 \\
18 & 20 & 21 & 15 \\
23 & 13 & 12 & 26
\end{bmatrix}
在外围加上一圈格子,把1,2,3,\dots,8m+216m^2+8m+3,16m^2+8m+4,\dots,(4m+2)^2这些数安排在外圈格子内,但要使相对两数之和等于16m(m+1)+5。对于m=1这些数是:1,2,3,4,5,6,7,8,9,1027,28,29,30,31,32,33,34,35,36
结果如下:
\begin{bmatrix}
1 & 9 & 34 & 33 & 32 & 2 \\
6 & 11 & 25 & 24 & 14 & 31 \\
10 & 22 & 16 & 17 & 19 & 27 \\
30 & 18 & 20 & 21 & 15 & 7 \\
29 & 23 & 13 & 12 & 26 & 8 \\
35 & 28 & 3 & 4 & 5 & 36
\end{bmatrix}

LUX法[编辑]

在(4M+2)×(4M+2)個方格的適當格點上,先排出2M+1階的幻方。在前M+1行的格點,全部標上「L」;在第M+1行的中間格點標上「U」,其余格點標上「L」;在第M+2行的中间格點標上「L」,其余格點標上「U」;在餘下的M-1行的格點全部標上「X」。將格點上的數乘以4再減4,再按下面的規則加上1至4其中一個數,填入對應的格上:

 4 1    1 4    1 4
  L      U      X
 2 3    2 3    3 2

例子:

[ 68  65  96  93   4   1  32  29  60  57 ]
   17L     24L      1L      8L     15L
[ 66  67  94  95   2   3  30  31  58  59 ]

[ 92  89  20  17  28  25  56  53  64  61 ]
   23L      5L      7L     14L     16L
[ 90  91  18  19  26  27  54  55  62  63 ]

[ 16  13  24  21  49  52  80  77  88  85 ]
    4L      6L     13U     20L     22L
[ 14  15  22  23  50  51  78  79  86  87 ]

[ 37  40  45  48  76  73  81  84  9   12 ]
   10U     12U     19L     21U      3U
[ 38  39  46  47  74  75  82  83  10  11 ]

[ 41  44  69  72  97  100  5  8   33  36 ]
   11X     18X     25X      2X      9X
[ 43  42  71  70  99  98   7  6   35  34 ]

編程語言參考實現[编辑]

奇數階幻方算法的Java語言實現[编辑]

/**
* @author: contribute to wikipedia according GNU
* @description:用於創建奇數階的幻方
*/
 
public class magic_squre_odd {
       static int[][]  matrix;
       static int   n;
       public static void magic_squre_odd_generate()
       { matrix = new int[n][n];
         //所有的數初始化為0
 
         matrix[0][(n-1)/2] = 1;
         int x = 0,y = (n-1)/2;
 
         //count:記住已經插入過的數
          for(int count = 2; count<=n*n;count++)
          while(true)
          {
          //先x-1 y+1
        	  x--;
        	  y++;
 
        	  //判斷是否可以插入
          	  while(true)
                 {//循環判斷是否越界,直到一個地方不越界為止
                    //判斷是否越界:
                    //越上界x<0,則移到最下方x=x+n,y不變; continue
                   if(x<0)
                   {
                   	x += n;
                   	continue;
                   }
 
                   //越右界y>=n,則y=y-n,x不變;continue
                   if(y>=n)
                   {
                   	y -= n;
                   	continue;
                   }
 
        	    //循環判斷是否該位置已經有數據,直到找到一個空位
                      //如果有數據,則移到x = x + 2;y = y - 1; continue
                   if (y<0){y+=n;continue;}
                   if(matrix[x][y] != 0 )
                   {
                   	x += 2;y -= 1;
                   	if (x>=n){x-=n;continue;}
                   	if (y<0){y+=n;continue;}
                   	continue;
                   }
                   break;
                 }
 
                 //將當前的count值賦給選出的空位
                      matrix[x][y]= count;
                      break;
         }
       }
 
       public static void print()
       {
        	for(int i = 0; i < n; i++)
        	{
        		for(int j = 0; j < n; j++)
        	    {
        			//System.out.println(matrix[i][j]);
        			System.out.print(matrix[i][j]);
        			System.out.print("_");
        	    }
        		System.out.println();
        	}
       }
 
       public  static void main(String[] args)
       {   //手工輸入n的值,並確保為奇數
             n = 11;
           magic_squre_odd_generate();
           print();
       }
}
以下是本算法將n設置為11時得出的11階幻方的構造結果:
68 81 94 107 120 1 14 27 40 53 66
80 93 106 119 11 13 26 39 52 65 67
92 105 118 10 12 25 38 51 64 77 79
104 117 9 22 24 37 50 63 76 78 91
116 8 21 23 36 49 62 75 88 90 103
7 20 33 35 48 61 74 87 89 102 115
19 32 34 47 60 73 86 99 101 114 6
31 44 46 59 72 85 98 100 113 5 18
43 45 58 71 84 97 110 112 4 17 30
55 57 70 83 96 109 111 3 16 29 42
56 69 82 95 108 121 2 15 28 41 54

4阶幻方算法的Java语言实现[编辑]

 /**
 * @author: contribute to wikipedia according GNU
 * @description:用于创建4阶的幻方
 *
 */
 
 public class magic_square_4m {
 
 	/**
 	 * @param args
 	 */
 	static int  matrix[][];
 	static int   n;
 
 	static void magic_squre_4m_generate()
 	{
 	  //初始化matrix
 		matrix = new int[n][n];
 
 	  //将matrix裡的位置用数顺序排列
 	  int ini = 0;
 	  for(int i = 0; i < n; i++)
 		  for(int j = 0; j < n; j++)
 			  matrix[i][j] = ++ini;
 
 	  //打印对调前的样子
 	  System.out.println("对调之前的样子:");
 	  print();
 
 	  //然后对调(仅对右上方的数进行遍历)
 	  for(int i = 0; i < n; i++)
 	      for(int j = i + 1; j < n; j++)
 	      {
 	    	  if(( i != j) && (i + j) != (n -1) )
 	    	  {   //对不在主付对角线上的数关于中心对调
 	    		  int temp;
 	    		  temp = matrix[i][j];
 	    		  matrix[i][j] = matrix[n -1 - i][n - 1 - j];
 	    		  matrix[n -1 - i][n - 1 - j] = temp;
 	    	  }
 		  }
 	}
 
 	public static void print()
 	{
 		for(int i = 0; i < n; i++)
 		{
 			for(int j = 0; j < n; j++)
 		    {
 				System.out.print(matrix[i][j]);
 				System.out.print("_");
 		    }
 			System.out.print("\n");
 		}
 	}
 
 	public static void main(String[] args) {
         //这里手动设置n的数值为4,这里只能设置为4,因为只求4阶幻方	
 		n = 4;
 		magic_squre_4m_generate();
 		System.out.println("对调之后的样子:");
 		print();
 	}
 }
以下是本算法输出的结果:
对调之前的样子:
1_2_3_4_
5_6_7_8_
9_10_11_12_
13_14_15_16_
对调之后的样子:
1_15_14_4_
12_6_7_9_
8_10_11_5_
13_3_2_16_

参见[编辑]

有用的参考书[编辑]

  • 高治源,九宫图探秘,2004,香港天马图书有限公司
  • 张道鑫,素数幻方,2003,香港天马图书有限公司
  • 李杭强,趣味数学幻方,2002,香港天马图书有限公司
  • 林正禄,开拓智力的奇方——幻方,2001,香港天马图书有限公司

外部链接[编辑]