幻方，有時又稱魔術方陣（其簡稱 魔方 現一般指立方體的魔術方塊）或縱橫圖，由一組排放在正方形中的整陣列成，其每行、每列以及每一條主對角線的和均相等。通常幻方由從 1 到 N2 的連續整陣列成，其中 N 為正方形的行或列的數目。因此 N 階幻方有 N 行 N 列，並且所填充的數為從 1 到 N2。 幻方可以使用 N 階方陣來表示，方陣的每行、每列以及兩條對角線的和都等於常數 M_2 N，如果填充數為 12dotsN2，那麼有 M_2 N frac N N212 幻方簡史 《繫辭》雲：「河出圖，洛出書，聖人則之。」在宋朝之前，洛書的記述只有文字。 九宮圖實物最早發現於西漢，1977 年中國考古學家在安徽阜陽縣雙古堆西漢古墓中發現漢文帝七年（前 173 年）的太乙九宮佔盤，乃是中國漢代幻方的實物。東漢《數術記遺》也有記載。 後來陳摶以降認為河圖洛書的洛書代表九宮圖，為 1dots9 這 9 個數，而 3 行、3 列以及兩對角線上各自的數之和均為 15。 楊輝縱橫圖 thumbright200px 楊輝縱橫圖 南宋數學家楊輝著《續古摘奇演算法》把類似於九宮圖的圖形命名為縱橫圖，書中列舉 3、4、5、6、7、8、9、10 階幻方。其中所述三階幻方構造法：九子斜排，上下對易，左右相更，四維挺出，戴九履一，左三右七，二四為肩，六八為足，比法國數學家 Claude Gaspar Bachet 提出的方法早三百餘年。 構造法 根據構造方法的不同，幻方可以分成三類：奇數階幻方、4k 階幻方和 4k2 階幻方，其中 M 為自然數，2 階幻方不存在。幻方構造法主要有：連續擺數法、階梯法（樓梯法）、奇偶數分開的菱形法、對稱法、對角線法、比例放大法、斯特雷奇法、LUX 法、拉伊爾法（基方、根方合成法）、鑲邊法、相乘法、幻方模式等。 奇數階幻方構造法 右斜角降位法 1 假設要建構 n 階幻方，n 為奇數。 先在第一橫列中央的方格填入 1。 向右上方的格子推進，依次填入 2、3、4、、n2，若超過方陣框外，則將數字填入到該橫列或該直行的相對位置。 若右上方的格子已有數字，則將數字填入下面的格子中。 以下圖 5 階幻方為例，1 填寫在 13（第一行第三列）的位置上；2 應當填寫在其右上方格即 04 中，由於 04 超出頂邊界，所以從最底行進入，即 54；3 填寫在 54 的右上方格 45 中；4 填寫在 45 的右上方格 36 中，由於 36 超出右邊界，所以從最左列進入，即 31；5 填寫在 31 的右上方格 22 中；6 應該填寫的方格 13 已經被 1 所佔據，因此填寫在 22 的正下方格 32 中；按照上面的步驟直到所有數填入。 begin bmatrix 8 1 6 3 5 7 4 9 2 end bmatrix begin bmatrix 17 24 1 8 15 23 5 7 14 16 4 6 13 20 22 10 12 19 21 3 11 18 25 2 9 end bmatrix begin bmatrix 47 58 69 80 1 12 23 34 45 57 68 79 9 11 22 33 44 46 67 78 8 10 21 32 43 54 56 77 7 18 20 31 42 53 55 66 6 17 19 30 41 52 63 65 76 16 27 29 40 51 62 64 75 5 26 28 39 50 61 72 74 4 15 36 38 49 60 71 73 3 14 25 37 48 59 70 81 2 13 24 35 end bmatrix 3 階 5 階 9 階 魔方陣不是唯一的，比如 5 階魔方陣還可以是： begin bmatrix 15 6 19 2 23 16 12 25 8 4 9 5 13 21 17 22 18 1 14 10 3 24 7 20 11 end bmatrix 5 階 右斜角降位法 2 假設要建構 n 階幻方，n 為奇數。 先在第一橫列中央的方格填入 1。 向「右 n12 格、上 n12 格」的格子推進，依次填入 2、3、4、、n2，若超過方陣框外，則將數字填入到該橫列或該直行的相對位置。 若右上方的格子已有數字，則將數字填入下面的格子中。 右斜角升位法 假設要建構 n 階幻方，n 為奇數。 先在中央格的正上方一格的方格填入 1。 向右上方的格子推進，依次填入 2、3、4、、n2，若超過方陣框外，則將數字填入到該橫列或該直行的相對位置。 若右上方的格子已有數字，則將數字填入上面兩格的格子中。 菱形法 假設要建構 n 階幻方，n 為奇數。 先以對角線為兩邊，做一個包含 n 階方陣的菱形方陣，此方陣總共有 2n22n1（第 n 個中心正方形數）個格子。 從這個菱形方陣中的最上方的尖端格子，由左上往右下，再由右上往左下，依次填入 1、2、3、4、、n2。 將原先方陣上側外的格子向下平行移動 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 arraycccccccc 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 4k2 階幻方構造法 LUX 法 在 4M24M2）個方格的適當格點上，先排出 2M1 階的幻方。在前 M1 行的格點，全部標上「L」；在第 M1 行的中間格點標上「U」，其餘格點標上「L」；在第 M2 行的中間格點標上「L」，其餘格點標上「U」；在餘下的 M1 行的格點全部標上「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、、n1n 各 n 次，儘管奇數階幻方與偶數階幻方的填入方式有所不同。 對於奇數階幻方： 第一個方陣：在第一橫列中央的方格填入 1，並且往左下角不斷填入 1，若超出方陣外，則向右平移 n 格，直到每一橫列都有一個方格填入 1 為止，再把所有填入 1 的方格右邊的格子填入 2（若超出方陣外，則向左平移 n 格），再把所有填入 2 的方格右邊的格子填入 3，一直到填入 n 為止。 第二個方陣：在第一直行中央的方格填入 0，並且往右下角不斷填入 1，若超出方陣外，則向上平移 n 格，直到每一直行都有一個方格填入 0 為止，再把所有填入 0 的方格右邊的格子填入 n（若超出方陣外，則向上平移 n 格）。再把所有填入 n 的方格右邊的格子填入 2n，一直到填入 n1n 為止。 再把兩個方陣中的數相加。 事實上，你可以將這兩個方陣中的每一個相同數字都替換為另一個數字，只要這兩個方陣中原本有出現的 n 個數字都仍然各出現 n 次即可，唯一的條件是第一個方陣中 n12 這個數字，以及第二個方陣中 n1n2 這個數字，不能被替換。 對於偶數階幻方： 第一個方陣：第一直行由上到下依次填入 1 到 n，第二直行由下到上依次填入 1 到 n，第三直行與第二直行相同，第四直行與第一直行相同，若超過四直行，則重複第一到第四直行的步驟。 第二個方陣：第一橫列由上到下依次填入 0 到 nn1，第二橫列由下到上依次填入 0 到 nn1，第三橫列與第二橫列相同，第四橫列與第一橫列相同，若超過四橫列，則重複第一到第四橫列的步驟。 此方法暫時只適用於 4k 階的幻方。 事實上，你可以將這兩個方陣中的每一個相同數字都替換為另一個數字，只要這兩個方陣中原本有出現的 n 個數字都仍然各出現 n 次即可，唯一的條件是第一個方陣中每個直行相對的兩個數字之和必須是 n1，以及第二個方陣中每個橫列相對的兩個數字之和必須是 nn1。 如果是 4k2 階的幻方，就必須在第二個方陣中，檢查每個直行相對的兩個數字之和為 nn1 的格子，對於這些格子，第一個方陣的對應格子。 加邊法 當 n 為大於等於 5 的正整數時，此方法可由 n2 階幻方外圍加上一圈來構造 n 階幻方。 以 6 階為例子，先排出 4 階的幻方，如上圖，再將圖中每一個數都加上 8m210，有下圖： begin bmatrix 11 25 24 14 22 16 17 19 18 20 21 15 23 13 12 26 end bmatrix 在外圍加上一圈格子，把 123dots8m2 和 16m28m316m28m4dots4m22 這些數安排在外圈格子內，但要使相對兩數之和等於 16m m15。對於 m1 這些數是：12345678910；27282930313233343536。結果如下： 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 階幻方中的每一個數字加上 ka2 的結果，則所有的 a k 都是幻方，且 a 0 原本的 a 階幻方。 將 b 階幻方中的數字 k 都用幻方 a k1 取代。 程式語言參考實現 includestdioh int a 17b 17m void s int i 搜尋全部四階幻方，C 程式碼，執行時間 7 秒 int n0j0 while j17 if a j a b ij1 switch i case 1case 2case 3case 5case 6case 7case 9case 10s i1break case 11if b 6b 7b 10b 1134 s 12break case 4case 8case 12if b i3b i2b i1b i34 s i1break case 13if b 1b 5b 9b 1334b 4b 7b 10b 1334 s 14break case 14case 15if b i12b i8b i4b i34 s i1break case 16for printf nmn17n40printf n printf 2db n a j0 int main void s 1 printf 四階幻方總數量 d 含旋轉反射相同m return 0 四階幻方全解搜尋 CC includestdioh int a 17b 17m void s int i 搜尋全部四階幻方，C 程式碼，執行時間 7 秒 int n0j0 while j17 if a j a b ij1 switch i case 1case 2case 3case 5case 6case 7case 9case 10s i1break case 11if b 6b 7b 10b 1134 s 12break case 4case 8case 12if b i3b i2b i1b i34 s i1break case 13if b 1b 5b 9b 1334b 4b 7b 10b 1334 s 14break case 14case 15if b i12b i8b i4b i34 s i1break case 16for printf nmn17n40printf n printf 2db n a j0 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 nn 所有的數初始化為 0 matrix 0n12 1 int x 0y n12 count 記住已經插入過的數 for int count 2 countnncount while true 先 x1 y1 x y 判斷是否可以插入 while true 迴圈判斷是否越界，直到一個地方不越界為止 判斷是否越界： 越上界 x0，則移到最下方 xxn，y 不變；continue if x0 x n continue 越右界 yn，則 yyn，x 不變；continue if yn y n continue 迴圈判斷是否該位置已經有資料，直到找到一個空位 如果有資料，則移到 x x 2y y 1 continue if y0yncontinue if matrix xy 0 x 2y 1 if xnxncontinue if y0yncontinue continue break 將當前的 count 值賦給選出的空位 matrix xy count break public static void print for int i 0 i n i for int j 0 j n j Systemoutprintln matrix ij Systemoutprint matrix ij Systemoutprint _ Systemoutprintln 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 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 nn 將 matrix 裡的位置用數順序排列 int ini 0 for int i 0 i n i for int j 0 j n j matrix ij ini 輸出對調前的樣子 Systemoutprintln 對調之前的樣子： 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 ij matrix ij matrix n 1 in 1 j matrix n 1 in 1 j temp public static void print for int i 0 i n i for int j 0 j n j Systemoutprint matrix ij Systemoutprint _ Systemoutprint n public static void main String args 這裡手動設定 n 的數值為 4，這裡只能設定為 4，因為只求 4 階幻方 n 4 magic_squre_4m_generate Systemoutprintln 對調之後的樣子： 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 標準型式 數字推盤遊戲 泛對角幻方 參考資料 引用 延伸閱讀 外部連結 幻方介紹及其建造方法（英語） 一個小學老師對幻方的研究 Category 矩陣 Category 中國數學發現 Category 數學中未解決的問題