幻方

幻方，有时又称魔术方阵（其简称“魔方”现一般指立方体的魔術方塊）或纵横图，由一组排放在正方形中的整数组成，其每行、每列以及每一条主对角线的和均相等。通常幻方由从 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}} ，那么有 M 2 ( N ) = N ( N 2 + 1 ) 2 {\displaystyle M_{2}(N)={\frac {N(N^{2}+1)}{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 k {\displaystyle 4k} 阶幻方和 4 k + 2 {\displaystyle 4k+2} 阶幻方，其中 M {\displaystyle M} 为自然数， 2 {\displaystyle 2} 阶幻方不存在。幻方构造法主要有：连续摆数法、阶梯法（楼梯法）、奇偶数分开的菱形法、对称法、对角线法、比例放大法、斯特雷奇法、LUX法、拉伊尔法（基方、根方合成法）、镶边法、相乘法、幻方模式等。 假設要建構n階幻方，n為奇數。 先在第一橫列中央的方格填入1。 向右上方的格子推進，依次填入2、3、4、…、n2，若超過方陣框外，則將數字填入到該橫列或該直行的相對位置。 若右上方的格子已有數字，則將數字填入下面的格子中。 以下图 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阶魔方阵还可以是： 假設要建構n階幻方，n為奇數。 先在第一橫列中央的方格填入1。 向「右(n-1)/2格、上(n-1)/2格」的格子推進，依次填入2、3、4、…、n2，若超過方陣框外，則將數字填入到該橫列或該直行的相對位置。 若右上方的格子已有數字，則將數字填入下面的格子中。 假設要建構n階幻方，n為奇數。 先在中央格的正上方一格的方格填入1。 向右上方的格子推進，依次填入2、3、4、…、n2，若超過方陣框外，則將數字填入到該橫列或該直行的相對位置。 若右上方的格子已有數字，則將數字填入上面兩格的格子中。 假設要建構n階幻方，n為奇數。 先以對角線為兩邊，做一個包含n階方陣的菱形方陣，此方陣總共有2n2-2n+1（第n個中心正方形數）個格子。 從這個菱形方陣中的最上方的尖端格子，由左上往右下，再由右上往左下，依次填入1、2、3、4、…、n2。 將原先方陣上側外的格子向下平行移動n格，填入原方陣的空格處，相同的步驟，若格子是在下側，往上移，若格子是在左側，往右移，若格子是在右側，往左移。 將1、2、3、4、…、n2由上到下、再由左到右，依次填入。 將方陣以四階方陣為單位分割（可分割成n2個四階方陣），然後在每個四階方陣中，對角線上的數字擦掉。 把擦掉的數字由大的數開始，由上到下、再由左到右，依次填入。 假設要建構n階幻方，n為4的倍數。 將1、2、3、4、…、n2由上到下、再由左到右，依次填入。 將方陣以四階方陣為單位分割（可分割成n2個四階方陣），然後在每個四階方陣中，不在對角線上的數字擦掉。 把擦掉的數字由大的數開始，由上到下、再由左到右，依次填入。 如4阶幻方的排列法： [ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ] {\displaystyle {\begin{bmatrix}1&2&3&4\\5&6&7&8\\9&10&11&12\\13&14&15&16\end{bmatrix}}} 按如上图排列好，再将非主副对角线上的各个数关于中心对调，即成下图： [ 1 15 14 4 12 6 7 9 8 10 11 5 13 3 2 16 ] {\displaystyle {\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]} 即： [ 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 ] {\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)×(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、…、(n-1)*n各n次，儘管奇數階幻方與偶數階幻方的填入方式有所不同。 對於奇數階幻方： 第一個方陣：在第一橫列中央的方格填入1，並且往左下角不斷填入1，若超出方陣外，則向右平移n格，直到每一橫列都有一個方格填入1為止，再把所有填入1的方格右邊的格子填入2（若超出方陣外，則向左平移n格），再把所有填入2的方格右邊的格子填入3，一直到填入n為止。 第二個方陣：在第一直行中央的方格填入0，並且往右下角不斷填入1，若超出方陣外，則向上平移n格，直到每一直行都有一個方格填入0為止，再把所有填入0的方格右邊的格子填入n（若超出方陣外，則向上平移n格）。再把所有填入n的方格右邊的格子填入2n，一直到填入(n-1)*n為止。 再把兩個方陣中的數相加。 事實上，你可以將這兩個方陣中的每一個相同數字都替換為另一個數字，只要這兩個方陣中原本有出現的n個數字都仍然各出現n次即可，唯一的條件是第一個方陣中(n+1)/2這個數字，以及第二個方陣中(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 {\displaystyle 6} 阶为例子，先排出 4 {\displaystyle 4} 阶的幻方，如上图，再将图中每一个数都加上 8 m + 2 = 10 {\displaystyle 8m+2=10} ，有下图： [ 11 25 24 14 22 16 17 19 18 20 21 15 23 13 12 26 ] {\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} 。 结果如下： [ 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 ] {\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}}} 當n可以分解成兩個大於等於3的正整數a與b的乘積時，此方法可由a階幻方與b階幻方來構造n階幻方。 以a(k)表示a階幻方中的每一個數字加上k*a2的結果，則所有的a(k)都是幻方，且a(0)=原本的a階幻方。 將b階幻方中的數字k都用幻方a(k-1)取代。 #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; } /** * @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 /** * @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 标准型式 数字推盘游戏 泛對角幻方 "所有四阶幻方". [2017-01-11]. （原始内容存档于2017-01-13） （中文（中国大陆））.  黄且圆. 陈省身：如何做“好的数学”. 2015年3月2日 [2019年9月29日]. （原始内容存档于2019年9月29日） （中文（中国大陆））. 可惜幻方只是一个奇迹，它在数学中没有引起其他更普遍深刻的影响。相反地，另外一个奇迹，所有的圆、圆的周长和它的直径之比都是一个不变的数，数学上称之为圆周率，记作。这个结果可重要了，因为这个数渗透了整个数学！...幻方只是一个偶然现象，虽很巧妙，但不属于好的数学。  |journal=被忽略 (帮助) 高治源. 九宫图探秘. 香港天马图书有限公司. 2004 （中文（香港））.  张道鑫. 素数幻方. 香港天马图书有限公司. 2003 （中文（香港））.  李杭强. 趣味数学幻方. 香港天马图书有限公司. 2002 （中文（香港））.  林正禄. 开拓智力的奇方——幻方. 香港天马图书有限公司. 2001 （中文（香港））.  中國數學史主题 幻方介绍及其建造方法（英语） 一個小學老師對幻方的研究