幻方

幻方，有時又稱魔術方陣或縱橫圖，由一組排放在正方形中的整陣列成，其每行、每列以及每一條主對角線的和均相等。通常幻方由從formula_1到formula_2的連續整陣列成，其中formula_3為正方形的行或列的數目。因此formula_3階幻方有formula_3行formula_3列，並且所填充的數為從formula_1到formula_2。幻方可以使用formula_3階方陣來表示，方陣的每行、每列以及兩條對角線的和都等於常數formula_10，如果填充數為formula_11，那麼有formula_12幻方簡史.《繫辭》雲：「河出圖，洛出書，聖人則之。」在宋朝之前，洛書的記述只有文字。九宮圖實物最早發現於西漢，1977年中國考古學家在安徽阜陽縣雙古堆西漢古墓中發現漢文帝七年的太乙九宮佔盤，乃是中國漢代幻方的實物。東漢《數術記遺》也有記載。後來陳摶以降認為河圖洛書的洛書代表九宮圖，為formula_13這formula_14個數，而formula_15行、formula_15列以及兩對角線上各自的數之和均為15。楊輝縱橫圖.南宋數學家楊輝著《續古摘奇演算法》把類似於九宮圖的圖形命名為縱橫圖，書中列舉3、4、5、6、7、8、9、10階幻方。其中所述三階幻方構造法：“九子斜排，上下對易，左右相更，四維挺出，戴九履一，左三右七，二四為肩，六八為足”，比法國數學家Claude Gaspar Bachet提出的方法早三百餘年。構造法.根據構造方法的不同，幻方可以分成三類：奇數階幻方、formula_17階幻方和formula_18階幻方，其中formula_19為自然數，formula_20階幻方不存在。幻方構造法主要有：連續擺數法、階梯法、鑲邊法、相乘法、幻方模式等。奇數階幻方構造法.Siamese方法是構造奇數階幻方的一種方法，說明如下：以下圖formula_24階幻方為例，formula_1填寫在formula_26的位置上；formula_20應當填寫在其右上方格即formula_28中，由於formula_28超出頂邊界，所以從最底行進入，即formula_30；formula_15填寫在formula_30的右上方格formula_33中；formula_34填寫在formula_33的右上方格formula_36中，由於formula_36超出右邊界，所以從最左列進入，即formula_38；formula_24填寫在formula_38的右上方格formula_41中；formula_42應該填寫的方格formula_26已經被formula_1所佔據，因此填寫在formula_41的正下方格formula_46中；按照上面的步驟直到所有數填入。魔方陣不是唯一的，比如5階魔方陣還可以是：偶數階幻方構造法.formula_17階幻方構造法.對於formula_17階幻方一般都用對調法，製作起來很容易。將它分割成formula_49個formula_50區塊，再將其每一個區塊的非主副對角線上的各個數關於中心對調即可。如4階幻方的排列法：formula_51按如上圖排列好，再將非主副對角線上的各個數關於中心對調，即成下圖：formula_52八階幻方構造如下formula_53即：formula_54formula_55階幻方構造法.加邊法.以formula_42階為例子，先排出formula_34階的幻方，如上圖，再將圖中每一個數都加上formula_58，有下圖：formula_59在外圍加上一圈格子，把formula_60和formula_61這些數安排在外圈格子內，但要使相對兩數之和等於formula_62。對於formula_63這些數是：formula_64；formula_65。結果如下：formula_66LUX法.在(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 4L U X2 3 2 3 3 2例子：四階幻方全解搜尋(C/C++)#重定向.int a[17],b[17],m;void s(int i)int n=0,j=0;while(++j=n)y -= n;continue;//迴圈判斷是否該位置已經有資料，直到找到一個空位//如果有資料，則移到x = x + 2;y = y - 1; continueif(matrix[x][y] != 0 )x += 2;y -= 1;continue;break;//將當前的count值賦給選出的空位matrix[x][y]= count;break;public static void print()for(int i = 0; i &lt; n; i++)for(int j = 0; j &lt; 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 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 54formula_34階幻方演算法的Java語言實現.* @author: contribute to wikipedia according GNU* @description:用於建立4階的幻方*/public class magic_square_4m {* @param argsstatic int matrix[][];static int n;static void magic_squre_4m_generate()//初始化matrixmatrix = new int[n][n];//將matrix裡的位置用數順序排列int ini = 0;for(int i = 0; i &lt; n; i++)for(int j = 0; j &lt; n; j++)matrix[i][j] = ++ini;//輸出對調前的樣子System.out.println("對調之前的樣子：");print();//然後對調for(int i = 0; i &lt; n; i++)for(int j = i + 1; j &lt; n; j++)if(( i != j) &amp;&amp; (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 &lt; n; i++)for(int j = 0; j &lt; 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)等很多這類需要滿足特殊規律的填數問題，只要所需的數字規模不大，都可以考慮透過深度優先搜尋演算法暴力求解和列舉。