幻方

✍ dations ◷ 2024-12-23 02:04:27 #幻方

幻方,有时又称魔术方阵(其简称“魔方”呼现一般指立方体的魔术方块)或纵横图,由一组排放在正方形中的整数组成,其每行、每列以及两条对角线上的数之和均相等。通常幻方由从 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)等很多这类需要满足特殊规律的填数问题,只要所需的数字规模不大,都可以考虑通过深度优先搜索算法暴力求解和枚举。

相关

  • 灰姑娘《灰姑娘》(意大利语:Cenerontola ; 法语:Cendrillon;英语:Cinderella;德语:Aschenputtel),又音译作《仙杜丽拉》或《仙杜瑞拉》亦称作《辛蒂瑞拉》,是一本著名的童话。灰姑娘也是这
  • Natural History Museum of Los Angeles Countyhttp://www.nhm.org/洛杉矶县自然历史博物馆(Natural History Museum of Los Angeles County)是美国西部最大的自然历史博物馆,位于洛杉矶县洛杉矶,馆藏包括3500万份标本和手工
  • 两会两会,通常指:也可以指:
  • 神舟七号神舟七号飞船(以下简称神七)是中国第三个载人航天器,是中国“神舟”号系列飞船之一,在北京时间2008年9月25日21时10分4秒988毫秒由长征2F火箭发射升空。神七上载有三名宇航员分
  • 禹贡《禹贡》是《尚书》的一篇,中国第一篇区域地理著作,也是中国现存最古的经学文献之一。称《尚书·禹贡》,简称《禹贡》。作者不详。内容叙述中国古代地理方物兼均税的作品。全书
  • 西佛兰德省西佛兰德省(荷兰语:Provincie West-Vlaanderen)是位于比利时(弗拉芒大区,弗拉芒社群)西部的一个省,首府布鲁日,人口1,197,690(2019年),面积3,144.3平方公里。 安特卫普省 · 东佛兰德
  • 尾崎秀实尾崎秀实(日语:尾崎 秀実/おざき ほつみ ,1901年4月29日-1944年11月7日),日本评论家、记者、共产主义者、中国问题专家、苏联间谍。主张“东亚协同体”。1901年4月29日,尾崎秀实出
  • 查利·帕克查利·帕克(英语:Charlie Parker,1920年8月29日-1955年3月12日),美国黑人爵士乐手,外号“大鸟”(Yardbird), 因不断奔波演奏,毒瘾与酗酒,再加上家庭生活的沉重压力引发精神崩溃于1955年3
  • 岐阜县第2区岐阜县第2区是日本众议院的选区,设立于1994年。北海道 13 | 山形县 4 | 静冈县 9 | 岛根县 3 | 大分县 4福井县 3 | 山梨县 3 | 德岛县 3 | 高知县 3 | 佐贺县 3青森县 4 |
  • 萨莫吉希亚起义萨莫吉希亚起义是指在1401–1404以及1409两次萨摩吉西亚人(英语:Samogitians)对抗条顿骑士团的起义。为了获得条顿骑士团的军事支援,萨莫吉希亚被立陶宛大公国维陶塔斯割让给骑