幻方,有时又称魔术方阵(其简称“魔方”呼现一般指立方体的魔术方块)或纵横图,由一组排放在正方形中的整数组成,其每行、每列以及两条对角线上的数之和均相等。通常幻方由从到的连续整数组成,其中为正方形的行或列的数目。因此阶幻方有行列,并且所填充的数为从到。
幻方可以使用阶方阵来表示,方阵的每行、每列以及两条对角线的和都等于常数,如果填充数为,那么有
《系辞》云:“河出图,洛出书,圣人则之。”在宋朝之前,洛书的记述只有文字。
九宫图实物最早发现于西汉,1977年中国考古学家在安徽阜阳县双古堆西汉古墓中发现汉文帝七年(前173年)的太乙九宫占盘,乃是中国汉代幻方的实物。东汉《数术记遗》也有记载。
后来陈抟以降认为河图洛书的洛书代表九宫图,为这个数,而行、列以及两对角线上各自的数之和均为15。
南宋数学家杨辉著《续古摘奇算法》把类似于九宫图的图形命名为纵横图,书中列举3、4、5、6、7、8、9、10阶幻方。其中所述三阶幻方构造法:“九子斜排,上下对易,左右相更,四维挺出,戴九履一,左三右七,二四为肩,六八为足”,比法国数学家Claude Gaspar Bachet提出的方法早三百余年。
根据构造方法的不同,幻方可以分成三类:奇数阶幻方、阶幻方和阶幻方,其中为自然数,阶幻方不存在。幻方构造法主要有:连续摆数法、阶梯法(楼梯法)、奇偶数分开的菱形法、对称法、对角线法、比例放大法、斯特雷奇法、LUX法、拉伊尔法(基方、根方合成法)、镶边法、相乘法、幻方模式等。
Siamese方法(Kraitchik 1942年,pp. 148-149)是构造奇数阶幻方的一种方法,说明如下:
(由于幻方的对称性,也可以把右上改为右下、左上以及左下等方位)
以下图阶幻方为例,填写在(第一行第三列)的位置上;应当填写在其右上方格即中,由于超出顶边界,所以从最底行进入,即;填写在的右上方格中;填写在的右上方格中,由于超出右边界,所以从最左列进入,即;填写在的右上方格中;应该填写的方格已经被所占据,因此填写在的正下方格中;按照上面的步骤直到所有数填入。
魔方阵不是唯一的,比如5阶魔方阵还可以是:
对于阶幻方一般都用对调法,制作起来很容易。将它分割成个区块,再将其每一个区块的非主副对角线上的各个数关于中心对调即可。
如4阶幻方的排列法:
按如上图排列好,再将非主副对角线上的各个数关于中心对调,即成下图:
八阶幻方构造如下
即:
以阶为例子,先排出阶的幻方,如上图,再将图中每一个数都加上,有下图:
在外围加上一圈格子,把和这些数安排在外圈格子内,但要使相对两数之和等于。对于这些数是:;。
结果如下:
在(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
例子:
17L 24L 1L 8L 15L 23L 5L 7L 14L 16L 4L 6L 13U 20L 22L 10U 12U 19L 21U 3U 11X 18X 25X 2X 9X
编程语言参考实现
四阶幻方全解搜索(C/C++)">编辑]
#include<stdio.h>int a,b,m;void s(int i){ /*搜索全部四階幻方,C代碼,運行時間7秒*/ int n=0,j=0; while(++j<17) if(!a) { a=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+b+b+b==34)s(12);break; case 4:case 8:case 12:if(b+b+b+b==34)s(i+1);break; case 13:if(b+b+b+b==34&&b+b+b+b==34)s(14);break; case 14:case 15:if(b+b+b+b==34)s(i+1);break; case 16:for(printf("\n"),++m;++n<17;n%4?0:printf("\n"))printf("%2d ",b); } a=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; //所有的數初始化為0 matrix = 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 != 0 ) { x += 2;y -= 1; if (x>=n){x-=n;continue;} if (y<0){y+=n;continue;} continue; } break; } //將當前的count值賦給選出的空位 matrix= count; break; } } public static void print() { for(int i = 0; i < n; i++) { for(int j = 0; j < n; j++) { //System.out.println(matrix); System.out.print(matrix); 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 6680 93 106 119 11 13 26 39 52 65 6792 105 118 10 12 25 38 51 64 77 79104 117 9 22 24 37 50 63 76 78 91116 8 21 23 36 49 62 75 88 90 1037 20 33 35 48 61 74 87 89 102 11519 32 34 47 60 73 86 99 101 114 631 44 46 59 72 85 98 100 113 5 1843 45 58 71 84 97 110 112 4 17 3055 57 70 83 96 109 111 3 16 29 4256 69 82 95 108 121 2 15 28 41 54
阶幻方算法的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; //將matrix裡的位置用數順序排列 int ini = 0; for(int i = 0; i < n; i++) for(int j = 0; j < n; j++) matrix = ++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; matrix = matrix; matrix = temp; } } } public static void print() { for(int i = 0; i < n; i++) { for(int j = 0; j < n; j++) { System.out.print(matrix); 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_
研究价值
知名华人数学家陈省身曾在数学演讲中说幻方只是一个奇迹,它在数学中没有引起更普遍深刻的影响,不属于“好的数学”。
对幻方的学习和研究一直局限于趣味数学本身,更接近数字游戏或文字游戏,缺乏与主流数学的联系(和璇玑图在中国诗歌中的地位有一些相似)。数学和物理中也有具有更多学术价值的特殊数字方阵,如推动了试验设计研究的拉丁方阵和已有应用的阿达玛矩阵,还有在量子力学中有重要价值的泡利矩阵及其推广版本盖尔曼矩阵。魔术方块则可以与群论建立联系(见魔方群),可以作为抽象代数的入门教具,也是计算群论(英语:Computational group theory)的研究案例之一,并非单纯的几何玩具。高性能的计算机诞生后,幻方、幻星、素数环(prime ring problem)等很多这类需要满足特殊规律的填数问题,只要所需的数字规模不大,都可以考虑通过深度优先搜索算法暴力求解和枚举。