複製鏈接
請複製以下鏈接發送給好友

幻方

(中國傳統遊戲)

鎖定
幻方(Magic Square)是一種將數字安排在正方形格子中,使每行、列和對角線上的數字和都相等的方法。
幻方也是一種中國傳統遊戲。舊時在官府、學堂多見。它是將從一到若干個數的自然數排成縱橫各為若干個數的正方形,使在同一行、同一列和同一對角線上的幾個數的和都相等。
幻方(OEIS中的數列A006052)的數目還沒有得到解決。
中文名
幻方
外文名
Magic Square
別    名
河圖
洛書
別    名
縱橫圖
學    科
數學
種    類
完全幻方、乘幻方等
起    源
易經
類    型
中國傳統遊戲

幻方種類

幻方完全幻方

完全幻方指一個幻方行、列、主對角線及泛對角線各數之和均相等 [1] 

幻方乘幻方

乘幻方指一個幻方行列、對角線各數乘積相等。

幻方高次幻方

n階幻方是由前n^2(n的2次方)個自然數組成的一個n階方陣,其各行、各列及兩條對角線所含的
n個數的和相等。例子:(三階幻方,幻和為15,)
4
9
2
3
5
7
8
1
6
高次幻方是指,當組成幻方各數替換為其2,3,...,k次冪時,仍滿足幻方條件者,稱此幻方為k次幻方。

幻方反幻方

反幻方的定義:在一個由若干個排列整齊的數組成的正方形中,其中任意一橫行、一縱行及對角線的幾個數之和不相等,具有這種性質的圖表,稱為“反幻方”。
反幻方與正幻方最大的不同點是幻和不同,正幻方所有幻和都相同,而反幻方所有幻和都不同。所謂幻和就是幻方的任意行、列及對角線幾個數之和。如圖1中3階反幻方的比較。
圖1 反幻方 圖1 反幻方
圖1中邊框外圍的數字之和就是幻和。紅色為偶數,黑色為奇數。
圖2 多種反幻方 圖2 多種反幻方
可以説反幻方是一種特殊的幻方。反幻方的幻和可以全部不同,也可以部分相同。如圖2多種3階反幻方。

幻方三階幻方

表1
8
1
6
3
5
7
4
9
2
如表1,1和7相加除以2=4
1和3相加除以2=2
……

幻方起源記載

《周易本義》中的《洛書》,一個三階幻方 《周易本義》中的《洛書》,一個三階幻方
在一個由若干個排列整齊的數組成的正方形中,正方形中任意一橫行、一縱行及對角線的幾個數之和都相等,具有這種性質的圖表,稱為“幻方”。中國古代稱為“河圖”、“洛書”,又叫“縱橫圖”。
九宮洛書藴含奇門遁甲的佈陣之道。九宮之數源於《易經》。幻方也稱縱橫圖魔方魔陣,它是科學的結晶與吉祥的象徵,發源於中國古代的洛書——九宮圖。公元前一世紀,西漢宣帝時的博士戴德在他的政治禮儀著作《大戴禮·明堂篇》中就有“二、九、四、七、五、三、六、一、八”的洛書九宮數記載。洛書被世界公認為組合數學的鼻祖,它是中華民族對人類的偉大貢獻之一。同時,洛書以其高度抽象的內涵,對中國古代政治倫理、數學、天文氣象、哲學、醫學、宗教等都產生了重要影響。在遠古傳説中,於治國安邦上也具有積極的寓意!包括洛書在內的幻方自古以來在亞、歐、美洲不少國家都被作為驅邪避兇的吉祥物,這種古代地域廣泛的圖騰應該説是極其少見的。1975年上海人民出版社出版的自然辯證法叢書《自然科學大事年表》,對於幻方作了特別的述説:“公元前一世紀,《大戴禮》記載,中國古代有象徵吉祥的河圖洛書縱橫圖,即為九宮算,被認為是現代‘組合數學’最古老的發現。”還附了全書唯一的插圖!
杜勒的《憂鬱》,內含四階幻方 杜勒的《憂鬱》,內含四階幻方
2500年前,孔子在他研究《易經》的著作《系詞上傳》中記載了:“河出圖,洛出書,聖人則之。”最早將數字與洛書相連的記載是2300年前的《莊子·天運》,它認為:“天有六極五常,帝王順之則治,逆之則兇。九洛之事,治成德備,監照下土,天下戴之,此謂上皇。”明代數學家程大位《算法統宗》中也曾發出“數何肇?其肇自圖、書乎?伏羲得之以畫卦,大禹得之以序疇,列聖得之以開物”的感嘆,大意是説,數起源於遠古時代黃河出現的河圖與洛水出現的洛書,伏羲依靠河圖畫出八卦,大禹按照洛書劃分九州,並制定治理天下的九類大法,聖人們根據它們演繹出各種治國安邦的良策,對人類社會與自然界的認識也得到步步深化。大禹從洛書中數的相互制約,均衡統一得到啓發而制定國家的法律體系,使得天下一統,歸於大治,這是借鑑思維的開端。這種活化思維的方式已成為科學靈感的來源之一。從洛書發端的幻方在數千年後更加生機盎然,被稱為具有永恆魅力的數學問題。
十三世紀,中國南宋數學家楊輝在世界上首先開展了對幻方的系統研究,歐洲十四世紀也開始了這方面的工作。著名數學家費爾瑪、歐拉都進行過幻方研究,如今,幻方仍然是組合數學的研究課題之一,經過一代代數學家與數學愛好者的共同努力,幻方與它的變體所藴含的各種神奇的科學性質正逐步得到揭示。它已在組合分析、實驗設計、圖論數論、羣、對策論、紡織、工藝美術、程序設計、人工智能等領域得到廣泛應用。1977年,4階幻方還作為人類的特殊語言被美國旅行者1號、2號飛船攜入太空,向廣袤的宇宙中可能存在的外星人傳達人類的文明信息與美好祝願。

幻方歷史發展

幻方又稱為魔方,方陣或廳平方,最早起源於中國。宋代數學家楊輝稱之為縱橫圖
幻方的幻在於無論取哪一條路線,最後得到的和或積都是完全相同的。
大約兩千多年前西漢時代,流傳夏禹治水時,黃河中躍出一匹神馬,馬背上馱着一幅圖,人稱「河圖」;又洛水河中浮出一隻神龜,龜背上有一張象徵吉祥的圖案稱為「洛書」.他們發現,這個圖案每一列,每一行及對角線,加起來的數字和都是一樣的,這就是我們所稱的幻方.也有人認為"洛書"是外星人遺物;而"河圖"則是描述了宇宙生物(包括外星人)的基因排序規則,幻方是外星人向地球人的自我介紹.另外在上海浦東陸家嘴地區挖出了一塊元朝時代伊斯蘭教信徒所掛的玉掛,玉掛的正面寫着:「萬物非主,惟有真宰,默罕默德,為其使者」,而玉掛的另一面就是一個四階幻方.
關於幻方的起源,中國有“河圖”和“洛書”之説。相傳在遠古時期,伏羲氏取得天下,把國家治理得井井有條,感動了上天,於是黃河中躍出一匹龍馬,背上馱着一張圖,作為禮物獻給他,這就是“河圖”,也是最早的幻方。伏羲氏憑藉着“河圖”而演繹出了八卦,後來大禹治洪水時,洛水中浮出一隻大烏龜,它的背上有圖有字,人們稱之為“洛書”。“洛書”所畫的圖中共有黑、白圓圈45個。把這些連在一起的小圓和數目表示出來,得到九個。這九個數就可以組成一個縱橫圖,人們把由九個數3行3列的幻方稱為3階幻方,除此之外,還有4階、5階...
後來,人們經過研究,得出計算任意階數幻方的各行、各列、各條對角線上所有數的和的公式為:
S=n(n^2+1) /2
其中n為幻方的階數,所求的數為S.
幻方最早記載於中國公元前500年的春秋時期《大戴禮》中,這説明中國人民早在2500年前就已經知道了幻方的排列規律。而在國外,公元130年,希臘人塞翁才第一次提起幻方。
中國不僅擁有幻方的發明權,而且是對幻方進行深入研究的國家。公元13世紀的數學家楊輝已經編制出3-10階幻方,記載在他1275年寫的《續古摘奇算法》一書中。在歐洲,直到1514年,德國著名畫家丟勒才繪製出了完整的四階幻方。
而在國外,十二世紀的阿拉伯文獻也有六階幻方的記載,中國的考古學家們曾經在西安發現了阿拉伯文獻上的五塊六階幻方,除了這些以外,歷史上最早的四階幻方是在印度發現的,那是一個完全幻方(後面會提到),而且比中國的楊輝還要早了兩百多年,印度人認為那是天神的手筆.1956年西安出土一鐵片板上所刻的六階幻方(古阿拉伯數字)十三世紀,東羅馬帝國才對幻方產生興趣,但卻沒有什麼成果.
直到十五世紀,住在君士坦丁堡的魔索普拉才把中國的縱橫圖傳給了歐洲人,歐洲人認為幻方可以鎮壓妖魔,所以把它作為護身符,也把它叫作「Magic Square」.
歐洲最早的幻方是在德國一位名畫家Albrecht Dure的畫裏的,
上面有一個四階幻方,而這個幻方的下面兩個數字正好是這幅畫的製作年代(1514年).這是歐洲最古老的幻方.
清末民初數學家壽孝天自攥:
清末民初數學家壽孝天自攥的幻方 清末民初數學家壽孝天自攥的幻方
1956年冬,陝西省西安市郊元朝安西王府出土的金屬鐵板:
幻方 幻方

幻方紀錄

中國幻方協會前十位大師級人物:李文,郭先強,潘鳳雛,蘇茂挺,鍾明,吳碩辛,曹陵,牛國良,彭保旺,曾學涵,他們全是中國的草根幻方達人,在幻方的學術研究上取得了一系列重大成果,很多研究成果領先於世界幻方研究同行。許仲義,李抗強,王忠漢,郭大焱,林正錄等幻方前輩,他們也為中國幻方的研究與發展作出了無私的奉獻,還有很多我們可能已經忘記了他們的名字,或許他們過去的研究成果在今天看來已經平淡無奇,但他們的歷史階段為我們後來者的研究提供了積極的養分。本協會一系列的幻方研究者,為中國乃至世界幻方學術研究、推廣普及事業一直不懈奮鬥着並將繼續努力奉獻。
中國取得不少幻方世界紀錄:幻方專家李文第一位構造成功10階標準幻立方,第一位構造出最低階729階五次幻方,第一位構造出最牛的36階廣義五次幻方,第一位理論上證明了存在最難的完美平方幻方,和多項平方幻方世界紀錄,幻方專家蘇茂挺第一位構成功32階完美平方幻方.等。
提醒大家注意,任意階幻方構造法,任意維幻方構造法,任意次幻方構造法,都早已找到。
不存在最大階幻方的世界紀錄之類.
對於各種媒體報導的幻方世界之最,很多是不實報導,不存在未解最大階數幻方。

幻方幻方欣賞

中國幻方網站
在線二維任意階幻方生成;
法國高次幻方網站;
日本多維幻方網站;
富蘭克林的幻方;
12階幻方 12階幻方
九階平方幻方;
十二階完美幻方(每個2×2子矩陣和為286)

幻方構造原理

《射鵰英雄傳》中郭黃二人被裘千仞追到黑龍潭,躲進瑛姑的小屋。瑛姑出了一道題:數字1~9填到三行三列的表格中,要求每行、每列、及兩條對角線上的和都相等。這道題難倒了瑛姑十幾年,被黃蓉一下子就答出來了。
4
9
2
3
5
7
8
1
6
這就是一個最簡單的3階平面幻方。因為幻方的智力性和趣味性,很多遊戲和玩具都與幻方有關,如捉放曹、我們平時玩的六面體,也成為學習編程時的常見問題。
幻方又稱縱橫圖九宮圖,最早記錄於中國古代的洛書。夏禹治水時,河南洛陽附近的大河裏浮出了一隻烏龜,背上有一個很奇怪的圖形,古人認為是一種祥瑞,預示着洪水將被夏禹王徹底制服。後人稱之為"洛書"或"河圖",又叫河洛圖。
南宋數學家楊輝,在他著的《續古摘奇算法》裏介紹了這種方法:只要將九個自然數按照從小到大的遞增次序斜排,然後把上、下兩數對調,左、右兩數也對調;最後再把中部四數各向外面挺出,幻方就出現了 [2] 
最簡單的幻方就是平面幻方,還有立體幻方、高次幻方等。對於立體幻方、高次幻方世界上很多數學家仍在研究,只討論平面幻方。
對平面幻方的構造,分為三種情況:N為奇數、N為4的倍數、N為其它偶數(4n+2的形式)
1、 N 為奇數時,最簡單:
⑴ 將1放在第一行中間一列;
⑵ 從2開始直到n×n止各數依次按下列規則存放:
按 45°方向行走,如向右下
每一個數存放的行比前一個數的行數減1,列數加1
⑶ 如果行列範圍超出矩陣範圍,則迴繞。
例如1在第1行,則2應放在最上一行,列數同樣加1;
⑷ 如果按上面規則確定的位置上已有數,或上一個數是第1行第n列時,
則把下一個數放在上一個數的上面。
按上述規則的3×3幻方如表2。
表2
4
9
2
3
5
7
8
1
6
2、 N為4的倍數時
採用對稱元素交換法。
首先把數1到n×n按從上至下,從左到右順序填入矩陣
然後將方陣的所有4×4子方陣中的兩對角線上位置的數關於方陣中心作對
稱交換,即a(i,j)與a(n+1-i,n+1-j)交換,所有其它位置上的數不變。
(或者將對角線不變,其它位置對稱交換也可)
**以上方法只適合於n=4時**
3、 N 為其它偶數
當n為非4倍數的偶數(即4n+2形)時:首先把大方陣分解為4個奇數(2m+1階)子方陣。
按上述奇數階幻方給分解的4個子方陣對應賦值
由小到大依次為上左子陣(i),下右子(i+v),上右子陣(i+2v),下左子陣(i+3v),
即4個子方陣對應元素相差v,其中v=n*n/4
四個子矩陣由小到大排列方式為 ① ③
④ ②
然後作相應的元素交換:a(i,j)與a(i+u,j)在同一列做對應交換(jn-t+2),
a(t-1,0)與a(t+u-1,0);a(t-1,t-1)與a(t+u-1,t-1)兩對元素交換
其中u=n/2,t=(n+2)/4 上述交換使行列及對角線上元素之和相等。
C語言實現 [3] 
#include"stdio.h"
#include"math.h"
int a[256][256];
int sum;
int check();
void ins(int n);
void main(){  
    int i,j,n,k,t,p,x;  
    scanf("%d",&n);  
    sum=(n*n+1)*n/2;  
    if(n%2==1) //奇數幻方    
        ins(n);  
    if(n%4==2) { //單偶數幻方    
        k=n/2;    
        ins(k);    
        for(i=0; i<k; i++)      
            for(j=0; j<k; j++){       
                a[i][j+k]=a[i][j]+2*k*k;        
                a[i+k][j]=a[i][j]+3*k*k;        
                a[i+k][j+k]=a[i][j]+k*k;      
            }    
            t=(n-2)/4;    
            for(i=0; i<k; i++)      
                for(j=0; j<k; j++){        
                    if((j<t)&&(i<t)){          
                    p=a[i][j];          
                    a[i][j]=a[i+k][j];         
                    a[i+k][j]=p;        
                }
                if((j<t)&&(i>k-t-1)){          
                    p=a[i][j];          
                    a[i][j]=a[i+k][j];          
                    a[i+k][j]=p;        
                }
                if((i>=t&&i<=k-t-1)&&(j>=t&&j<t*2)){          
                    p=a[i][j];          
                    a[i][j]=a[i+k][j];          
                    a[i+k][j]=p;        
                }
                if(j>1&&j<=t){       
                    p=a[i][j+k];      
                    a[i][j+k]=a[i+k][j+k];          
                    a[i+k][j+k]=p;        
                }      
            }  
        }  
        if(n%4==0) { //雙偶數幻方    
            x=1;    
            for(i=0; i<n; i++)      
                for(j=0; j<n; j++)        
                    a[i][j]=x++;    
                for(i=0; i<n; i++)      
                    for(j=0; j<n; j++){        
                        if(i%4==0&&abs(i-j)%4==0)          
                            for(k=0; k<4; k++)            
                                a[i+k][j+k]=n*n-a[i+k][j+k]+1;        
                        else if(i%4==3&&(i+j)%4==3)          
                            for(k=0; k<4; k++)            
                                a[i-k][j+k]=n*n-a[i-k][j+k]+1;      
                    
                }  
        }  
        if(check(n)==1){    
            for(i=0; i<n; i++){      
                for(j=0; j<n; j++)        
                    printf("%5d",a[i][j]);      
                printf("\n");    
            }  
        }
    }
    int check(int n) { //檢驗是否是幻方  
    int i,j,sum1=0,sum2;  
    for(i=0; i<n; i++){    
        for(j=0; j<n; j++)      
            sum1+=a[i][j];    
        if(sum1!=sum)      
            return 0;    
        sum1=0;  
    }  
    for(i=0; i<n; i++){    
        for(j=0; j<n; j++)      
            sum1+=a[i][j];    
        if(sum1!=sum)      
            return 0;    
        sum1=0;  
    }  
    for(sum1=0,sum2=0,i=0,j=0; i<n; i++,j++){    
        sum1+=a[i][j];    
        sum2+=a[i][n-j-1];  
    }  
    if(sum1!=sum)    
        return 0;  
    if(sum2!=sum)    
        return 0;  
    else    
        return 1;
}
void ins(int n) { //單偶數幻方的輸入  
    int x,y,m;  
    x=0;  
    y=n/2;  
    for(m=1; m<=n*n; m++){   
        a[x][y]=m;   
        if(m%n!=0){    
            x--;     
            y++;     
            if(x<0)
                x=x+n;    
            if(y==n)
                y=n-y;    
        }
        else{      
            x++;      
            if(x==n)
                x=x-n;   
        }  
    }
}

c++語言實現
(1)求奇數幻方
#include"stdio.h"
#include"math.h"
int a[256][256];
int sum;
int check();
void ins(int n);
void main(){  
    int i,j,n,k,t,p,x;  
    scanf("%d",&n);  
    sum=(n*n+1)*n/2;  
    if(n%2==1) //奇數幻方    
        ins(n);  
    if(n%4==2) { //單偶數幻方    
        k=n/2;    
        ins(k);    
        for(i=0; i<k; i++)      
            for(j=0; j<k; j++){       
                a[i][j+k]=a[i][j]+2*k*k;        
                a[i+k][j]=a[i][j]+3*k*k;        
                a[i+k][j+k]=a[i][j]+k*k;      
            }    
            t=(n-2)/4;    
            for(i=0; i<k; i++)      
                for(j=0; j<k; j++){        
                    if((j<t)&&(i<t)){          
                    p=a[i][j];          
                    a[i][j]=a[i+k][j];         
                    a[i+k][j]=p;        
                }
                if((j<t)&&(i>k-t-1)){          
                    p=a[i][j];          
                    a[i][j]=a[i+k][j];          
                    a[i+k][j]=p;        
                }
                if((i>=t&&i<=k-t-1)&&(j>=t&&j<t*2)){          
                    p=a[i][j];          
                    a[i][j]=a[i+k][j];          
                    a[i+k][j]=p;        
                }
                if(j>1&&j<=t){       
                    p=a[i][j+k];      
                    a[i][j+k]=a[i+k][j+k];          
                    a[i+k][j+k]=p;        
                }      
            }  
        }  
        if(n%4==0) { //雙偶數幻方    
            x=1;    
            for(i=0; i<n; i++)      
                for(j=0; j<n; j++)        
                    a[i][j]=x++;    
                for(i=0; i<n; i++)      
                    for(j=0; j<n; j++){        
                        if(i%4==0&&abs(i-j)%4==0)          
                            for(k=0; k<4; k++)            
                                a[i+k][j+k]=n*n-a[i+k][j+k]+1;        
                        else if(i%4==3&&(i+j)%4==3)          
                            for(k=0; k<4; k++)            
                                a[i-k][j+k]=n*n-a[i-k][j+k]+1;      
                    
                }  
        }  
        if(check(n)==1){    
            for(i=0; i<n; i++){      
                for(j=0; j<n; j++)        
                    printf("%5d",a[i][j]);      
                printf("\n");    
            }  
        }
    }
    int check(int n) { //檢驗是否是幻方  
    int i,j,sum1=0,sum2;  
    for(i=0; i<n; i++){    
        for(j=0; j<n; j++)      
            sum1+=a[i][j];    
        if(sum1!=sum)      
            return 0;    
        sum1=0;  
    }  
    for(i=0; i<n; i++){    
        for(j=0; j<n; j++)      
            sum1+=a[i][j];    
        if(sum1!=sum)      
            return 0;    
        sum1=0;  
    }  
    for(sum1=0,sum2=0,i=0,j=0; i<n; i++,j++){    
        sum1+=a[i][j];    
        sum2+=a[i][n-j-1];  
    }  
    if(sum1!=sum)    
        return 0;  
    if(sum2!=sum)    
        return 0;  
    else    
        return 1;
}
void ins(int n) { //單偶數幻方的輸入  
    int x,y,m;  
    x=0;  
    y=n/2;  
    for(m=1; m<=n*n; m++){   
        a[x][y]=m;   
        if(m%n!=0){    
            x--;     
            y++;     
            if(x<0)
                x=x+n;    
            if(y==n)
                y=n-y;    
        }
        else{      
            x++;      
            if(x==n)
                x=x-n;   
        }  
    }
}

(2)求單偶幻方
#include<iostream.h>
#include<iomanip.h>
int main(){  
    int n,i=0,j=0,a[100][100],tot=0;
    cout<<"請輸入4的倍數"<<endl;
    cin>>n;
    for(i=0;i<n;i++)    
        for(j=0; j<n; j++){      
            a[i][j]=++tot;
        }  
        for(i=0; i<n; i++){    
            for(j=0; j<n; j++){     
                if(i%4==j%4||i%4+j%4==3)       
                    a[i][j]=n*n+1-a[i][j];
                }  
            }  
            for(i=0; i<n; i++){    
                for(j=0; j<n; j++){      
                    cout<<setw(4)<<a[i][j];
                }        cout<<endl;
        }  
        return 0;
}

奇階幻方
當n為奇數時,我們稱幻方為奇階幻方。可以用Merzirac法與loubere法實現,根據我的研究,發現用國際象棋之馬步也可構造出更為神奇的奇幻方,故命名為horse法。
偶階幻方
當n為偶數時,我們稱幻方為偶階幻方。當n可以被4整除時,我們稱該偶階幻方為雙偶幻方;當n不可被4整除時,我們稱該偶階幻方為單偶幻方。可用了Hire法、Strachey以及YinMagic將其實現,Strachey為單偶模型,我對雙偶(4m階)進行了重新修改,製作了另一個可行的數學模型,稱之為Spring。YinMagic是我於2002年設計的模型,他可以生成任意的偶階幻方。
在填幻方前我們做如下約定:如填定數字超出幻方格範圍,則把幻方看成是可以無限伸展的圖形:
Merzirac法生成奇階幻方
在第一行居中的方格內放1,依次向右上方填入2、3、4…,如果右上方已有數字,則向下移一格繼續填寫。如表3用Merziral法生成的5階幻方:
表3
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
loubere法生成奇階幻方
在居中的方格向上一格內放1,依次向右上方填入2、3、4…,如果右上方已有數字,則向上移二格繼續填寫。如表4用Louberel法生成的5階幻方:
表4
23
6
19
2
15
10
18
1
14
22
17
5
13
21
9
4
12
25
8
16
11
24
7
20
3
Hire法生成偶階幻方
將n階幻方看作一個矩陣,記為A,其中的第i行j列的數字記為a(i,j)。在A內兩對角線上填寫1、2、3、……、n,各行再填寫1、2、3、……、n,使各行各列數字之和為n*(n+1)/2。填寫方法為:第1行從n到1填寫,從第2行到第n/2行按從1到進行填寫(第2行第1列填n,第2行第n列填1),從第n/2+1到第n行按n到1進行填寫,對角線的方格內數字不變。如下所示為6階填寫方法:
1 5 4 3 2 6
6 2 3 4 5 1
1 2 3 4 5 6
6 5 3 4 2 1
6 2 4 3 5 1
1 5 4 3 2 6
如下所示為8階填寫方法(轉置以後):
1 8 1 1 8 8 8 1
7 2 2 2 7 7 2 7
6 3 3 3 6 3 6 6
5 4 4 4 4 5 5 5
4 5 5 5 5 4 4 4
3 6 6 6 3 6 3 3
2 7 7 7 2 2 7 2
8 1 8 8 1 1 1 8
將A上所有數字分別按如下算法計算,得到B,其中b(i,j)=n×(a(i,j)-1)。則AT+B為目標幻方
(AT為A的轉置矩陣)。用Hire法生成的8階幻方如下:
1 63 6 5 60 59 58 8
56 10 11 12 53 54 15 49
41 18 19 20 45 22 47 48
33 26 27 28 29 38 39 40
32 39 38 36 37 27 26 25
24 47 43 45 20 46 18 17
16 50 54 53 12 11 55 9
57 7 62 61 4 3 2 64
⑴.Strachey法生成單偶幻方
將n階單偶幻方表示為4m+2階幻方。將其等分為四分,成為如下所示A、B、C、D四個2m+1階奇數幻方。
A C
D B
A用1至2m+1填寫成(2m+1)2階幻方;B用(2m+1)2+1至2*(2m+1)2填寫成2m+1階幻方;C用2*(2m+1)2+1至3*(2m+1)2填寫成2m+1階幻方;D用3*(2m+1)2+1至4*(2m+1)2填寫成2m+1階幻方;在A中間一行取m個小格,其中1格為該行居中1小格,另外m-1個小格任意,其他行左側邊緣取m列,將其與D相應方格內交換;B與C接近右側m-1列相互交換。用Strachey法生成的6階幻方如下:
35 1 6 26 19 24
3 32 7 21 23 25
31 9 2 22 27 20
8 28 33 17 10 15
30 5 34 12 14 16
4 36 29 13 18 11
⑵Spring法生成以偶幻方
將n階雙偶幻方表示為4m階幻方。將n階幻方看作一個矩陣,記為A,其中的第i行j列方格內的數字記為a(i,j)。
先令a(i,j)=(i-1)*n+j,即第一行從左到可分別填寫1、2、3、……、n;即第二行從左到可分別填寫n+1、n+2、n+3、……、2n;…………之後進行對角交換。對角交換有兩種方法:
方法一;將左上區域i+j為偶數的與幻方內以中心點為對稱點的右下角對角數字進行交換;將右上區域i+j為奇數的與幻方內以中心點為對稱點的左下角對角數字進行交換。(保證不同時為奇或偶即可。)
方法二;將幻方等分成m*m個4階幻方,將各4階幻方中對角線上的方格內數字與n階幻方內以中心點為對稱點的對角數字進行交換。
用Spring法生成的4階幻方如下:
16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1
YinMagic構造偶階幻方
先構造n-2幻方,之後將其中的數字全部加上2n-2,放於n階幻方中間,再用該方法將邊緣數字填寫完畢。該方法適用於n>4的所有幻方,我於2002年12月31日構造的數學模型。YinMagic法可生成6階以上的偶幻方。用YinMagic法生成的6階幻方如下:
10 1 34 33 5 28
29 23 22 11 18 8
30 12 17 24 21 7
2 26 19 14 15 35
31 13 16 25 20 6
9 36 3 4 32 27
魔鬼幻方
如將幻方看成是無限伸展的圖形,則任何一個相鄰的n*n方格內的數字都可以組成一個幻方。則稱該幻方為魔鬼幻方。
用我研究的Horse法構造的幻方是魔鬼幻方。如下的幻方更是魔鬼幻方,因為對於任意四個在兩行兩列上的數字,他們的和都是34。此幻方可用YinMagic方法生成。
15 10 3 6
4 5 16 9
14 11 2 7
1 8 13 12
1居上行正中央,依次斜填右上方,上出框往下填,
右出框左邊放,排重便在下格填,右上排重一個樣。

幻方程序編寫

利用計算機編程序,可求解出任意階幻方.(但數字位數受電腦限制,實際上只能是有限範圍內的任意階),如利用Matlab進行計算n階幻方,其命令為:A=magic(n)。
對於某些平方幻方,高次幻方,利用計算機輔助計算,也可快速求得。
一次幻方,一次幻立方,一次多維幻方,甚至可用簡單公式全部求得。
某些類型的平方幻方,甚至高次高維幻方,也可用公式求得。
在幻方公式求解方法,中國處於世界領先水平.中國李文的高維高次幻方公式,是幻方理論中的精品.吳碩辛的高次幻方理論,也可用公式求解。

幻方錯位補角

1.對於所有的奇階幻方,1-n*n從小到大填入n*n的方格中。以n=5時,1-25為例。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
2.橫錯位,將方格橫向錯位,每行錯位數為 n-行數,即第一行橫向移動n-1位,第二行橫向移動n-2位...直到形成一個左低右高的樓梯。




1
2
3
4
5



6
7
8
9
10



11
12
13
14
15



16
17
18
19
20



21
22
23
24
25




3.橫補角,以中間行為基準,將突出的數字補回本行所缺的方格內,4,5補到1的前,10補到6前,16補到20後,21,22補到25後。從而重新得到一個n*n方格。
4
5
1
2
3
10
6
7
8
9
11
12
13
14
15
17
18
19
20
16
23
24
25
21
22
4.豎錯位,將方格縱向錯位,每列錯位數為 n-列數,即第一列橫向移動n-1位,第二列橫向移動n-2位...直到形成一個左低右高的樓梯。




3



2
9


1
8
15

5
7
14
16
4
6
13
20
22
10
12
19
21

11
18
25


17
24



23




5.豎補角,以中間列為基準,將突出的數字補回本列所缺的方格內,17,23補到4上,24補到5上,2補到21下,3,9補到22下。從而重新得到一個n*n方格,及得到結果。
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
結語:錯位補角可以先橫後豎,也可以先豎後橫。樓梯可以左低右高,也可以左高右低。只要保證橫豎做出的樓梯方向相同,就能得到正確結果。一共可以求出4個答案。
參考資料