洛書（九数图），朱熹《周易本義》
**幻方**，有时又称**魔术方阵**（其简称"魔方"现一般指立方体的魔術方塊）或**纵横图**，由一组排放在正方形中的整数组成，其每行、每列以及每一条主对角线的和均相等。通常幻方由从1到N^{2}的连续整数组成，其中N为正方形的行或列的数目。因此N阶幻方有N行N列，并且所填充的数为从1到N^{2}。

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

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

幻方简史
----

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

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

後來陳摶以降認為河圖洛書的洛書代表九宫图，為1,\dots ,9这9个数，而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}} | {\displaystyle {\begin{bmatrix}47&58&69&80&1&12&23&34&45\\57&68&79&9&11&22&33&44&46\\67&78&8&10&21&32&43&54&56\\77&7&18&20&31&42&53&55&66\\6&17&19&30&41&52&63&65&76\\16&27&29&40&51&62&64&75&5\\26&28&39&50&61&72&74&4&15\\36&38&49&60&71&73&3&14&25\\37&48&59&70&81&2&13&24&35\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阶幻方一般都用对调法，制作起来很容易。将它分割成M^{2}个4\times 4区块，再将其每一个区块的非主副对角线上的各个数关于中心对调即可。  

如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}}  

八阶幻方构造如下  

{\displaystyle \left[{\begin{array}{cccc|cccc}\diagdown &\bigstar &\bigstar &\diagup &\diagdown &\bigstar &\bigstar &\diagup \\\bigstar &\diagdown &\diagup &\bigstar &\bigstar &\diagdown &\diagup &\bigstar \\\bigstar &\diagup &\diagdown &\bigstar &\bigstar &\diagup &\diagdown &\bigstar \\\diagup &\bigstar &\bigstar &\diagdown &\diagup &\bigstar &\bigstar &\diagdown \\\hline \diagdown &\bigstar &\bigstar &\diagup &\diagdown &\bigstar &\bigstar &\diagup \\\bigstar &\diagdown &\diagup &\bigstar &\bigstar &\diagdown &\diagup &\bigstar \\\bigstar &\diagup &\diagdown &\bigstar &\bigstar &\diagup &\diagdown &\bigstar \\\diagup &\bigstar &\bigstar &\diagdown &\diagup &\bigstar &\bigstar &\diagdown \\\end{array}}\right]}  

即：  

{\displaystyle {\begin{bmatrix}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\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+2和16m^{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,10；27,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 ]

```

### 編程語言參考實現

### 四階幻方全解搜索(C/C++)[需要較佳来源]

```
#include<stdio.h>
int a[17],b[17],m;
void s(int i)
{ /\*搜索全部四階幻方，C代碼,運行時間7秒\*/
 int n=0,j=0;
 while(++j<17)
 if(!a[j])
 {
 a[b[i]=j]=1;
 switch(i)
 {
 case 1:case 2:case 3:case 5:case 6:case 7:case 9:case 10:s(i+1);break;
 case 11:if(b[6]+b[7]+b[10]+b[11]==34)s(12);break;
 case 4:case 8:case 12:if(b[i-3]+b[i-2]+b[i-1]+b[i]==34)s(i+1);break;
 case 13:if(b[1]+b[5]+b[9]+b[13]==34&&b[4]+b[7]+b[10]+b[13]==34)s(14);break;
 case 14:case 15:if(b[i-12]+b[i-8]+b[i-4]+b[i]==34)s(i+1);break;
 case 16:for(printf("\n"),++m;++n<17;n%4?0:printf("\n"))printf("%2d ",b[n]);
 }
 a[j]=0;
 }
}
int main(void)
{
 s(1);
 printf("四階幻方總數量:%d(含旋轉反射相同)",m);
 return 0;
}

```

#### 奇數階幻方算法的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_
```

研究价值
----

知名华人数学家陈省身曾在数学演讲中说幻方只是一个奇迹，它在数学中没有引起更普遍深刻的影响，不属于"好的数学"。

对幻方的学习和研究一直局限于趣味数学本身，更接近数字游戏或文字游戏，缺乏与主流数学的联系(和璇玑图在中国诗歌中的地位有一些相似)。数学和物理中也有具有更多学术价值的特殊数字方阵，如推动了试验设计研究的拉丁方陣和已有应用的阿达玛矩阵，还有在量子力学中有重要价值的泡利矩阵及其推广版本盖尔曼矩阵。魔术方块则可以与群论建立联系(见魔方群)，可以作为抽象代数的入门教具，也是计算群论的研究案例之一，并非单纯的几何玩具。高性能的计算机诞生后，幻方、幻星、素数环(prime ring problem)等很多这类需要满足特殊规律的填数问题，只要所需的数字规模不大，都可以考虑通过深度优先搜索算法暴力求解和枚举。

艺术与流行文化
-------

* 德国画家与雕刻家阿尔布雷希特·丢勒曾在一幅名作《忧郁》(Melencolia I)的角落中画下一个幻方。这个著名的幻方图也被知名工程数学软件MATLAB加入自己的帮助文档中。[來源請求]

参见
--

* 九宫图
* 九宫算
* 洛书
* 幻圆

* 素数倒数幻方
* 數獨
* 未解决的数学问题
* 吠陀方形
* Frenicle 标准型式
* 数字推盘游戏
* 泛對角幻方

參考資料
----

### 引用

1. ↑ .  [2017-01-11]. （原始内容存档于2017-01-13） （中文（中国大陆））.
2. ↑  黄且圆.. 2015年3月2日  [2019年9月29日]. （原始内容存档于2019年9月29日） （中文（中国大陆））. 可惜幻方只是一个奇迹，它在数学中没有引起其他更普遍深刻的影响。相反地，另外一个奇迹，所有的圆、圆的周长和它的直径之比都是一个不变的数，数学上称之为圆周率，记作。这个结果可重要了，因为这个数渗透了整个数学！...幻方只是一个偶然现象，虽很巧妙，但不属于好的数学。  `|journal=`被忽略 (帮助)

### 延伸阅读

* 高治源.. 香港天马图书有限公司. 2004 （中文（香港））.
* 张道鑫.. 香港天马图书有限公司. 2003 （中文（香港））.
* 李杭强.. 香港天马图书有限公司. 2002 （中文（香港））.
* 林正禄.. 香港天马图书有限公司. 2001 （中文（香港））.

外部链接
----

* 中國數學史主题

* 幻方介绍及其建造方法（英语）
* 一個小學老師對幻方的研究

|  |  |  |
| --- | --- | --- |
| 

|  |  |
| --- | --- |
| 规范控制 編輯維基數據鏈接 | 
* AAT: 300222283
* BNF: cb11944380z (data)
* GND: 4168511-8
* J9U: 987007543406305171
* LCCN: sh85079628
* NDL: 01081048
* NKC: ph214645
* SUDOC: 027391345

 |

 |