幻方

✍ dations ◷ 2025-08-02 08:08:44 #幻方

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

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

《系辞》云:“河出图,洛出书,圣人则之。”在宋朝之前,洛书的记述只有文字。

九宫图实物最早发现于西汉,1977年中国考古学家在安徽阜阳县双古堆西汉古墓中发现汉文帝七年(前173年)的太乙九宫占盘,乃是中国汉代幻方的实物。东汉《数术记遗》也有记载。

后来陈抟以降认为河图洛书的洛书代表九宫图,为 1 , , 9 {\displaystyle 1,\dots ,9} 9 {\displaystyle 9} 个数,而 3 {\displaystyle 3} 行、 3 {\displaystyle 3} 列以及两对角线上各自的数之和均为15。

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

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

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

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

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

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

对于 4 M {\displaystyle 4M} 阶幻方一般都用对调法,制作起来很容易。将它分割成 M 2 {\displaystyle M^{2}} 4 × 4 {\displaystyle 4\times 4} 区块,再将其每一个区块的非主副对角线上的各个数关于中心对调即可。
如4阶幻方的排列法:
{\displaystyle {\begin{bmatrix}1&2&3&4\\5&6&7&8\\9&10&11&12\\13&14&15&16\end{bmatrix}}}
按如上图排列好,再将非主副对角线上的各个数关于中心对调,即成下图:
{\displaystyle {\begin{bmatrix}1&15&14&4\\12&6&7&9\\8&10&11&5\\13&3&2&16\end{bmatrix}}}
八阶幻方构造如下
{\displaystyle \left}
即:
{\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}}}

6 {\displaystyle 6} 阶为例子,先排出 4 {\displaystyle 4} 阶的幻方,如上图,再将图中每一个数都加上 8 m + 2 = 10 {\displaystyle 8m+2=10} ,有下图:
{\displaystyle {\begin{bmatrix}11&25&24&14\\22&16&17&19\\18&20&21&15\\23&13&12&26\end{bmatrix}}}

在外围加上一圈格子,把 1 , 2 , 3 , , 8 m + 2 {\displaystyle 1,2,3,\dots ,8m+2} 16 m 2 + 8 m + 3 , 16 m 2 + 8 m + 4 , , ( 4 m + 2 ) 2 {\displaystyle 16m^{2}+8m+3,16m^{2}+8m+4,\dots ,(4m+2)^{2}} 这些数安排在外圈格子内,但要使相对两数之和等于 16 m ( m + 1 ) + 5 {\displaystyle 16m(m+1)+5} 。对于 m = 1 {\displaystyle m=1} 这些数是: 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 {\displaystyle 1,2,3,4,5,6,7,8,9,10} 27 , 28 , 29 , 30 , 31 , 32 , 33 , 34 , 35 , 36 {\displaystyle 27,28,29,30,31,32,33,34,35,36}
结果如下:
{\displaystyle {\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}}}

在(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

4 {\displaystyle 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; 	  //將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)等很多这类需要满足特殊规律的填数问题,只要所需的数字规模不大,都可以考虑通过深度优先搜索算法暴力求解和枚举。

相关

  • 志贺氏菌属志贺氏菌属(学名:Shigella)通称志贺菌或者痢疾杆菌,为肠杆菌目肠杆菌科的一属,是一类革兰氏阴性、不活动、不产生孢子的杆状细菌,可引起人和其他哺乳类动物的细菌性痢疾。1897年,由
  • 东非大裂谷东非大裂谷(Great Rift Valley),位于非洲东部,是一个在3500万年前由非洲板块的地壳运动所形成的地理奇观,纵贯东非的大裂谷是世界上最大的断裂带,属于生长边界。其所形成的生态、
  • 奥斯坎语奥斯坎语是奥斯坎人所操的语言,它是属于印欧语系意大利语族萨贝利克语支的,同语支的还有拉丁-法利希语和翁布里亚语,奥斯坎人分布于萨莫奈、坎帕尼亚、卢卡尼亚、阿布鲁索。奥
  • 上维埃纳省上维埃纳省(法文:Haute-Vienne)是法国新阿基坦大区所辖的省份。该省编号为87。5个海外省及大区
  • 马尔代夫中华民国与马尔代夫关系是指中华民国与马尔代夫共和国之间的关系。两国于1966-1972年有官方外交关系,断交后,目前没有在对方首都互设具大使馆性质的代表机构。对马尔代夫的相关
  • 普热米斯尔·奥托卡二世普热米斯尔·奥托卡二世( Přemysl Otakar II.,1230年-1278年8月26日)波希米亚国王(1253年-1278年在位)。他在位时期是波希米亚最强大的时代。普热米斯尔·奥托卡二世为温塞斯拉斯
  • 弯齿鸟弯齿鸟属(属名:Camptodontornis)是一种生存于白垩纪早期的反鸟类,2010年发现于辽宁西部热河生物群晚期的九佛堂组。2011年,这一新属种由李莉等人命名,属名在拉丁语中意为“弯齿的
  • 夏季奥林匹克运动会体操比赛体操自现代奥运会诞生时就是夏季奥运会比赛项目之一。前三十年,只有男子竞技体操比赛。1928年夏季奥运会加入了女子竞技体操。1984年奥运会,艺术体操也成为比赛项目。2000年奥
  • 轨道离心率在天文动力学,架构在标准假说下的任何轨道都必须是圆锥切面的形状。圆锥切面的离心率,轨道离心率是定义轨道形状的重要参数,而且定义了绝对的形状。离心率可以解释为形状从圆形
  • PlayStation 3游戏列表“PlayStation 3”游戏以公开发售,或透过下载游戏至硬盘内游玩。部分游戏同时提供光盘版本及网络付费下载版本。“PlayStation 3”公开发售的游戏以“蓝光光盘”作为光盘格式