幻方,有时又称魔术方阵(其简称“魔方”现一般指立方体的魔術方塊)或纵横图,由一组排放在正方形中的整数组成,其每行、每列以及每一条主对角线的和均相等。通常幻方由从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提出的方法早三百余年。
构造法
根据构造方法的不同,幻方可以分成三类:奇数阶幻方、4k阶幻方和4k+2阶幻方,其中M为自然数,2阶幻方不存在。幻方构造法主要有:连续摆数法、阶梯法(楼梯法)、奇偶数分开的菱形法、对称法、对角线法、比例放大法、斯特雷奇法、LUX法、拉伊尔法(基方、根方合成法)、镶边法、相乘法、幻方模式等。
奇数阶幻方构造法
右斜角降位法1
假設要建構n階幻方,n為奇數。
先在第一橫列中央的方格填入1。
向右上方的格子推進,依次填入2、3、4、…、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)中;按照上面的步骤直到所有数填入。
魔方阵不是唯一的,比如5阶魔方阵还可以是:
右斜角降位法2
假設要建構n階幻方,n為奇數。
先在第一橫列中央的方格填入1。
向「右\frac{n-1}{2}格、上\frac{n-1}{2}格」的格子推進,依次填入2,3,4,\dots,n^2,若超過方陣框外,則將數字填入到該橫列或該直行的相對位置。
若右上方的格子已有數字,則將數字填入下面的格子中。
右斜角升位法
假設要建構n階幻方,n為奇數。
先在中央格的正上方一格的方格填入1。
向右上方的格子推進,依次填入2,3,4,\dots,n^2,若超過方陣框外,則將數字填入到該橫列或該直行的相對位置。
若右上方的格子已有數字,則將數字填入上面兩格的格子中。
菱形法
假設要建構n階幻方,n為奇數。
先以對角線為兩邊,做一個包含n階方陣的菱形方陣,此方陣總共有2n^2-2n+1(第n個中心正方形數)個格子。
從這個菱形方陣中的最上方的尖端格子,由左上往右下,再由右上往左下,依次填入1,2,3,4,\dots,n^2。
將原先方陣上側外的格子向下平行移動n格,填入原方陣的空格處,相同的步驟,若格子是在下側,往上移,若格子是在左側,往右移,若格子是在右側,往左移。
偶数阶幻方构造法
4k阶幻方构造法
消去對角線法
將1、2、3、4、…、n2由上到下、再由左到右,依次填入。
將方陣以四階方陣為單位分割(可分割成n2個四階方陣),然後在每個四階方陣中,對角線上的數字擦掉。
把擦掉的數字由大的數開始,由上到下、再由左到右,依次填入。
保留對角線法
假設要建構n階幻方,n為4的倍數。
將1、2、3、4、…、n2由上到下、再由左到右,依次填入。
將方陣以四階方陣為單位分割(可分割成n2個四階方陣),然後在每個四階方陣中,不在對角線上的數字擦掉。
把擦掉的數字由大的數開始,由上到下、再由左到右,依次填入。
如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}
八阶幻方构造如下
\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]
即:
\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}
4k+2阶幻方构造法
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 ]
斯特拉奇法
任何階數的幻方都適用的構造法
艾歆緹雅法
此方法可用來建構任何階數的幻方,當要建構n階幻方時,使用兩個方陣,一個填入正整數1到n各n次,另一個則填入0,n,2n,3n,\dots,(n-1)n各n次,儘管奇數階幻方與偶數階幻方的填入方式有所不同。
對於奇數階幻方:
第一個方陣:在第一橫列中央的方格填入1,並且往左下角不斷填入1,若超出方陣外,則向右平移n格,直到每一橫列都有一個方格填入1為止,再把所有填入1的方格右邊的格子填入2(若超出方陣外,則向左平移n格),再把所有填入2的方格右邊的格子填入3,一直到填入n為止。
第二個方陣:在第一直行中央的方格填入0,並且往右下角不斷填入0,若超出方陣外,則向上平移n格,直到每一直行都有一個方格填入0為止,再把所有填入0的方格右邊的格子填入n(若超出方陣外,則向上平移n格),再把所有填入n的方格右邊的格子填入2n,一直到填入(n-1)n為止。
再把兩個方陣中的數相加。
事實上,你可以將這兩個方陣中的每一個相同數字都替換為另一個數字,只要這兩個方陣中原本有出現的n個數字都仍然各出現n次即可,唯一的條件是第一個方陣中\frac{n+1}{2}這個數字,以及第二個方陣中\frac{(n-1)n}{2}這個數字,不能被替換。
對於偶數階幻方:
第一個方陣:第一直行由上到下依次填入1到n,第二直行由下到上依次填入1到n,第三直行與第二直行相同,第四直行與第一直行相同,若超過四直行,則重複第一到第四直行的步驟。
第二個方陣:第一橫列由上到下依次填入0到n(n-1),第二橫列由下到上依次填入0到n(n-1),第三橫列與第二橫列相同,第四橫列與第一橫列相同,若超過四橫列,則重複第一到第四橫列的步驟。
此方法暫時只適用於4k階的幻方。
事實上,你可以將這兩個方陣中的每一個相同數字都替換為另一個數字,只要這兩個方陣中原本有出現的n個數字都仍然各出現n次即可,唯一的條件是第一個方陣中每個直行相對的兩個數字之和必須是n+1,以及第二個方陣中每個橫列相對的兩個數字之和必須是n(n-1)。
如果是4k+2階的幻方,就必須在第二個方陣中,檢查每個直行相對的兩個數字之和為n(n-1)的格子,對於這些格子,第一個方陣的對應格子。
加邊法
當n為大於等於5的正整數時,此方法可由n-2階幻方外圍加上一圈來構造n階幻方。
以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}
方陣合成法
當n可以分解成兩個大於等於3的正整數a與b的乘積時,此方法可由a階幻方與b階幻方來構造n階幻方。
以a(k)表示a階幻方中的每一個數字加上k*a2的結果,則所有的a(k)都是幻方,且a(0)=原本的a階幻方。
將b階幻方中的數字k都用幻方a(k-1)取代。
編程語言參考實現
四阶幻方全解搜索(C/C++)
#include
int a[17],b[17],m;
void s(int i)
{ /搜索全部四阶幻方,C代码,运行时间7秒/
int n=0,j=0;
while(++j
奇数阶幻方算法的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,则y=y-n,x不变;continue
if(y>=n)
{
y -= n;
continue;
}
//循环判断是否该位置已经有数据,直到找到一个空位
//如果有数据,则移到x = x + 2;y = y - 1; continue
if (y=n){x-=n;continue;}
if (y
以下是本算法将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
以下是本算法输出的结果:
对调之前的样子:
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标准型式
- 数字推盘游戏
- 泛對角幻方
參考資料
引用
延伸阅读
*
*
*
*
外部链接
评论 (0)