任意奇数阶幻方最简单公式做法
(完整版)任意奇数阶幻方的杨辉斜排法

任意奇数阶幻方的杨辉斜排法——对杨辉口诀的讨论范贤荣2016.3.8关于三阶幻方的排法,我国古代数学家杨辉给出了一个巧妙的排法:“九子斜排,上下对易,左右相更,四维挺出”。
按照这个口诀,画出“上下对易,左右相更”之后,形成图1d的图面。
因此,必定有一个“四维挺出”的步骤。
最后得到“戴九履一,左三右七,二四為肩,六八為足”的三阶幻方。
见图1。
图1 杨辉口诀的画法可见,杨辉口诀是在利用5×5的方格,斜排9个数后,按照他的步骤,仍然是画出5×5方格的3阶的幻方,如图1e。
图2 菱中取方的画法现在,我们很多人用的是“取方框”画法。
即在5×5的方阵中,取出3×3方框来,如图2b的红框。
红框外的1,是走到框内的绿方块中,红框外的9,是走到框内的蓝方块中。
因此1、9没有“对易”。
同样,3、7也没有“相更”。
因此,就没有“上下对易,左右相更”了。
所以,就不需要“四维挺出”了。
因此,现在的画法,与原来的口诀不一致了。
所以,我根据作图的次序,将杨辉的口诀,演绎成:各子斜排为菱形,中间取方当作城,城外有子城内空,四围都往城中进。
挺进多少方可止,几阶就挺几步深。
注1:“四围”就是上下左右四边。
“都往城中进”,因此是相向而行,都到城中。
注2:“几阶就挺几步深”。
如3阶进3步,5阶进5步,7阶进7步……后续亦如此类推。
见图2。
下面,我将2~13各奇数阶,由菱方阵演变成幻方的情况,列于后。
图3 5阶菱方阵与幻方图4 7阶菱方阵与幻方图5 9阶菱方阵与幻方图6 11阶菱方阵与幻方图7 11阶幻方图8 13阶菱方阵图9 13阶幻方。
初一幻方的规律和方法

初一幻方的规律和方法
以下是一种适用于奇数阶幻方的规律和方法:
1. 把“1”放在中间一列最上边的方格中。
2. 从这个“1”开始,按对角线方向顺次把由小到大的各数放入各方格中,如果碰到顶则折向底,如果到达右侧则转向左侧,如果进行中轮到的方格中已有数或到达右上角,则退至前一格的下方。
例如,如果构建一个5阶幻方,那么根据以上方法可以得到:
以上步骤只是一个简单的记忆口诀,并不代表全部的方法。
如果你有任何关于如何构造幻方的具体问题,请告诉我,我会尽力帮助你。
奇数阶幻方构造原理

奇数阶幻方构造原理
奇数阶幻方是指由1到n^2 的连续整数构成的方阵,其每行、每列及两条对角线上的数字之和都相等。
以下是奇数阶幻方构造的一些原理和方法:
- 九子排列法:宋代数学家杨辉总结的“洛书”幻方的编排方法。
具体步骤为:九子排列、上下对易、左右相更、四维挺出。
- 巴舍法:以构造三阶幻方为例,假设有一个三行三列的格子,然后制造阳台、天台、地下室,再爬梯填数,最后把阳台、天台、地下室及里边的数去掉,就得到了一个三阶幻方。
- 罗伯法:可以构造出所有的奇数阶幻方。
口诀为:1居上行正中央,依次斜填切莫忘;上出框界往下写,右出框界左边放;排重便在下格填,右上出格一个样。
这些方法可以帮助构造各种奇数阶幻方,有兴趣的读者可以尝试用这些方法构造五阶幻方和七阶幻方。
【免费下载】奇数阶幻方的杨辉方法

奇数阶幻方的杨辉方法从三阶幻方谈起。
三阶幻方是指将1,2,3,…,8,9这九个数排列成一个3×3方阵,使三横行、三竖列和两条对角线上的三个数之和都相等。
这个相等的和数就叫做三阶幻方的幻和。
我们很容易求得这个幻和:。
1289451533++++== 要排出一个三阶幻方,中心这个数是一个关键。
这个数有四条线通过它,为此,我们把三数之和为的算式全部列出来:15,,,,1+5915+=16815++=A A 2+A 5815+=A 2+A 6A 715+=,,,。
34815++=A A 3+5715+=24915++=A A 4+A 5615+=A (一共八个式子,幻方的三行、三列和两条对角线也正好是八个,所以上列八个式子正好表示行、列和对角线上的组成情形。
)这个数在上列八个式子中出现了四次,这表明中心5数就是。
中心这个数定好之后,再确定四个角上的数,每个角上的数有三条线通过它,5这四个数在上列八个式子中各出现了三次,由此我们可以确定四个角上的数就是2,4,6,8这四个数。
首先可以任意指定某一个角是,那么与构成对角2,4,6,822线的另一端只能是;余下的两个角就是。
中心和四角这五个数确定84,6之后,余下的四个数不难计算求得。
图1给出了三阶幻方的一个示例。
关于三阶幻方的排法,我国古代数学家杨辉给出了一个巧妙的排法:九子斜排,上下对易,左右相更,四维挺进。
参见图2。
如图2所示,它形象的表达了杨辉的方法。
这个方法可以变通一下:“上下对易,左右相更”改为上、下、左、右的各个元素各向对方移动三格,这样不仅可以省去“四维挺进”,而且最后得到的方阵是一个标准的方阵。
33⨯参见图3。
杨辉的方法不仅可以构造三阶幻方,而且还可以构造图 1987654321176852349图2428637915图 3任意奇数阶幻方。
杨辉的方法:设为奇数。
n 1.将排成一个斜的方阵;221,2,3,,1,n n - n n ⨯2.以为中心作一个方阵(格);212n +n n ⨯3.将位于这个方阵外的所有元素都向方阵内平移格,即得。
幻方的算法-Merzirac法生成奇阶幻方

幻方的算法—Merzirac法生成奇阶幻方奇阶幻方当n为奇数时,我们称幻方为奇阶幻方。
可以用Merzirac法与loubere法实现,Merzirac法与loubere 法称为斜步法,即向斜方向走一步;也可用国际象棋之马步也可构造出更为神奇的奇幻方,故命名为horse法,即马步法。
下面我详细介绍Merzirac法Merzirac法生成奇阶幻方Merzirac法最简单的方法为:1、在第一行居中的方格内放1 ;2、以后按顺序,向右斜上方填写数字(称为斜步);3、若出到方阵上方,把该数字填到本该所在列的最下格;4、若出到方阵右方,把该数字填到本该所在行的最左格;5、若右上已有数字,或出到方阵右上(即对角线方向),则把数字填入上一个数字的下一格,即在n 的下方放入n+1(称为跳步),再按上述方法放置到2n,在2n的下方放入2n+1,在3n的下方放入3n+1,……依次填完所有数字即可完成任何一个奇阶幻方。
下面是用此方法构成的5阶幻方,每一行、每一列、对角线的和都为65,我们将此和值称为幻和值,用f(n)表示,f(5)=65。
65656565656565 65 65 65 65 65斜步法可以向4个方向依次填写数字,即右上、右下、左上、左下4个方向,每种斜步都可有2种跳步,即左(右)跳步、上(下)跳步。
下面我总结所有的Merzirac法(斜步法):我们用坐标轴的方法,将左右方向设为X轴,向右为X,向左为-X;将上下方向设为Y轴,向上为Y,向下为-Y。
一般的,令矩阵[1,1]为向右走一步,向上走一步,用X+Y表示,,[-1,0]为向左走一步,用-X表示,[0,-1]为向下走一步,用-Y表示。
则斜步可以表示为X+Y,{X∈{[1,0], [-1,0]},Y∈{[0,1], [0,-1]}}∪{Y∈{[1,0], [-1,0]},X∈{[0,1], [0,-1]}}。
对于X+Y相应的跳步可以为-X,-Y。
那么上面的5阶幻方就是用X+Y斜步(即右上一步),-Y跳步(即向下一步)构成。
幻方问题公式

幻方问题公式
幻方是一个由数字组成的正方形阵列,其中每行、每列和每个对角线的数字之和都是相同的。
以下是幻方的计算公式:
对于任意n阶幻方,每行、每列和每个对角线的数字之和可以用以下公式表示:
S = n(n^2 + 1) / 2
其中,n是幻方的阶数。
当n为奇数时,称为奇阶幻方。
当n为偶数时,幻方分为双偶幻方和单偶幻方。
对于奇阶幻方,可以使用Merzirac法生成。
具体步骤如下:
1. 在第一行居中的方格内放1,依次向右上方填入2、3、4…。
2. 如果右上方已有数字,则向下移一格继续填写。
3. 如果出到方阵下方,把该数字填到本该填数所在列上方相应的格。
4. 如果出到方阵右方,把该数字填到本该填数所在行的左方相应的格。
5. 如果落步格已有数字,则向上移一格继续填写。
对于偶阶幻方,可以使用以下公式计算每行、每列和每个对角线的数字之和:S = n(n/2)^2 + (n/2)^2
其中,n是幻方的阶数。
幻方算法

幻方算法首先,奇数的幻方,第一行中间放1,然后依次2、3、4一直往右上填,越界则反向,如果该位置有了数字,则排在前一个数的下面。
原则:非右上则下其次,4的倍数的的幻方。
设N%4等于0,则以每个4*4画对角,不在对角线上的数字与相对应数字对换。
比如8*8的,(0,1)与(7,6)对换,类推。
原则:横竖下标对N比余,相等或相加等于3则忽略,不做对换最后,最复杂的最后一种情况,单偶数的幻方。
我找了资料,但是没有完全好用的,总有缺陷概念:N=4m+2方法1:ACDB按上图将其分为4个部分,分别填入1-N*N/4组成的奇数幻方,N*N/4+1-N*N/2组成的奇数幻方,N*N/2+1-N*N/4*3组成的奇数幻方,N*N/4*3-N*N组成的奇数幻方将AD中m列互换。
不是镜面互换,而是平移。
将BC中m-1列互换,同上。
方法2:LUX法L U X41 14 1423 23 32先做一个N/2的奇数幻方,然后把这个幻方的每个数x替换成一个田字的四个数(x-1)*4+1——x*4这四个数的排列顺序有3种,前m+1行的按L排列,后m-1行的按X排列,中间一行中间一列按L排列,其余的按U排列。
下面是我写的JAVA实现类,2种单偶数我都实现了(第一种方法的实现被我注释掉了),还有一个监测的方法,仅供参考。
public class HuanClass {private int N;private int SUM;private int MAX;private int[][] RE;public HuanClass(int val) throws Exception{N=val;MAX=N*N;if(MAX%2==1)SUM=(MAX+1)/2*N;else SUM=(MAX+1)*N/2;RE=new int[N][N];if(N<3)throw new Exception("shit");else if(N%2==1)RE=CountOdd(N);else if(N%4==0)CountFour();elseCountEven();}private int[][] CountOdd(int n){int[][] IRE=new int[n][n];int i=0;int j=n/2;int tmp=1;while(true){if(j>=n)j=0;if(i<0)i=n-1;if(IRE[i][j]==0){IRE[i--][j++]=tmp++;}else{i+=2;j--;if(j<0)j=n-1;if(i>=n)i=i%n;if(IRE[i][j]==0)IRE[i--][j++]=tmp++;else break;}}return IRE;}private void CountFour(){int fillCount=1;for(int i=0;i<N;i++){for(int j=0;j<N;j++){RE[i][j]=fillCount;fillCount++;}}int tmp;for(int i=0;i<N;i++){for(int j=0;j<N/2;j++){if(i%4!=j%4&&(j%4+i%4)!=3){tmp=RE[i][j];RE[i][j]=RE[N-i-1][N-j-1];RE[N-i-1][N-j-1]=tmp;}}}}/*private void CountEven(){int halfN=N/2;int[][] tmpIArr=CountOdd(halfN);for(int i=0;i<halfN;i++){for(int j=0;j<halfN;j++){RE[i][j]=tmpIArr[i][j];RE[i+halfN][j]=tmpIArr[i][j]+halfN*halfN*3;RE[i][j+halfN]=tmpIArr[i][j]+halfN*halfN*2;RE[i+halfN][j+halfN]=tmpIArr[i][j]+halfN*halfN; }}int m=(halfN-1)/2;int tmp;for(int j=0;j<m;j++){for(int i=0;i<halfN;i++){tmp=RE[i][j];RE[i][j]=RE[i+halfN][j];RE[i+halfN][j]=tmp;if(j<m-1){tmp=RE[i][j+halfN];RE[i][j+halfN]=RE[i+halfN][j+halfN];RE[i+halfN][j+halfN]=tmp;}}}}*/private void CountEven(){int halfN=N/2;int m=(halfN-1)/2;int[][] Seq=CountOdd(halfN);char[][] SeqSign=new char[halfN][halfN]; for(int i=0;i<SeqSign.length;i++){for(int j=0;j<SeqSign[i].length;j++){ SeqSign[i][j]='L';}}int i=halfN-1;for(int l=1;l<m;l++,i--){for(int j=0;j<halfN;j++){SeqSign[i][j]='X';}}for(int j=0;j<halfN;j++){if(j==halfN/2)SeqSign[i][j]='L';elseSeqSign[i][j]='U';}for(i=0;i<halfN;i++){for(int j=0;j<halfN;j++){int beginNum=(Seq[i][j]-1)*4;switch (SeqSign[i][j]){case 'L':RE[i*2][j*2]=beginNum+4;RE[i*2+1][j*2]=beginNum+2;RE[i*2][j*2+1]=beginNum+1;RE[i*2+1][j*2+1]=beginNum+3;break;case 'U':RE[i*2][j*2]=beginNum+1;RE[i*2+1][j*2]=beginNum+2;RE[i*2][j*2+1]=beginNum+4;RE[i*2+1][j*2+1]=beginNum+3;break;case 'X':RE[i*2][j*2]=beginNum+1;RE[i*2+1][j*2]=beginNum+3;RE[i*2][j*2+1]=beginNum+4;RE[i*2+1][j*2+1]=beginNum+2;break;}}}}public int[][] getHuan(){return RE;}public boolean check(){for(int i=0;i<N;i++){int tmpSum1=0;int tmpSum2=0;for(int j=0;j<N;j++){tmpSum1+=RE[i][j];tmpSum2+=RE[j][i];}if(tmpSum1!=SUM||tmpSum2!=SUM)return false;}int sum1=0,sum2=0;for(int i=0;i<N;i++){sum1+=RE[i][i];sum2+=RE[i][N-1-i];}if(sum1!=SUM||sum2!=SUM)return false;return true;}}幻方维基百科,自由的百科全书跳转到: 导航, 搜索幻方,有时又称魔方(该称呼现一般指立方体的魔術方塊)或纵横图,由一组排放在正方形中的整数组成,其每行、每列以及两条对角线上的数之和均相等。
幻方算法(转)

幻⽅算法(转)幻⽅的算法(C++版)⼀、幻⽅按照阶数可分成了三类,即奇数阶幻⽅、双偶阶幻⽅、单偶阶幻⽅。
⼆、奇数阶幻⽅(劳伯法)奇数阶幻⽅最经典的填法是罗伯法。
填写的⽅法是:把1(或最⼩的数)放在第⼀⾏正中;按以下规律排列剩下的(n×n-1)个数:(1)每⼀个数放在前⼀个数的右上⼀格;(2)如果这个数所要放的格已经超出了顶⾏那么就把它放在底⾏,仍然要放在右⼀列;(3)如果这个数所要放的格已经超出了最右列那么就把它放在最左列,仍然要放在上⼀⾏;(4)如果这个数所要放的格已经超出了顶⾏且超出了最右列,那么就把它放在底⾏且最左列;(5)如果这个数所要放的格已经有数填⼊,那么就把它放在前⼀个数的下⼀⾏同⼀列的格内。
例,⽤该填法获得的5阶幻⽅:17241815235714164613202210121921311182529⼆、双偶数阶幻⽅(海尔法)所谓双偶阶幻⽅就是当n可以被4整除时的偶阶幻⽅,即4K阶幻⽅。
在说解法之前我们先说明⼀个“互补数”定义:就是在n阶幻⽅中,如果两个数的和等于幻⽅中最⼤的数与1的和(即n×n+1),我们称它们为⼀对互补数。
如在三阶幻⽅中,每⼀对和为10的数,是⼀对互补数;在四阶幻⽅中,每⼀对和为17的数,是⼀对互补数。
双偶数阶幻⽅最经典的填法是海尔法。
填写的⽅法是:以8阶幻⽅为例:(1)先把数字按顺序填。
然后,按4×4把它分割成4块(如图)12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364(2)每个⼩⽅阵对⾓线上的数字(如左上⾓⼩⽅阵部分),换成和它互补的数。
64236160675795554121351501617474620214342244026273736303133323435292838392541232244451918484915145253111056858595462631三、单偶数阶幻⽅(斯特拉兹法)所谓单偶阶幻⽅就是当n不可以被4整除时的偶阶幻⽅,即4K+2阶幻⽅。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
任意奇数阶幻方最简单公式做法
任意奇数阶幻方最简单公式做法
奇数阶幻方的填法我有最简易公式,任意奇数阶直接填成(3阶——任意奇数阶通用),先填中心九宫图,然后延伸填成米字形。
在米字划分的八个区内,对称填(1——最大数),(2——最大数减1),(3——最大数减2),(4——最大数减3)。
这八个数为首数,然后按照走向每格依次递加4,或者递减4,依次填完即成!公式简单而且完美对称,绝对最简单!不用位移法,一次填成!任意奇数阶通用。
公式中带入n(即幻方阶数)即可,内九宫格内每格一个公式,正中心数填上(n 平方+1)除以2,.然后以(中心数)(注:以下简称(中))为坐标和原始数;得出周围八个格内数,如下:
中上左为(中)减1. 中下右为(中)加1.
中上为(中)减(n-1). 中下为(中)加(n-1).
中上右为(中)加(2n-3). 中下左为(中)减(2n-3).
中左为(中)加(n+1). 中右为(中)减(n+1).
然后以这八个数为首数,向外延伸成米字形,填法如下:
中上左方向每格递减2. 中下右方向每格递加2.
中上方向每格递加2. 中下方向每格递减2.
中上右方向每格递减2. 中下左方向每格递加2.
中左方向每格递加2. 中右方向每格递减2.
下面填米字隔开的八个区域:
将(1 )填入右上顶角的下一格,(以它为首数每格递加4)从上往左下依次填完一行,再折回从上往左下依次填完第二行,以此类
推,填完本区。
将(n的平方)填入右下顶角的上一格,(以它为首数每格递减4)从下往左上依次填完一行,再折回从下往左上依次填完第二行,以此类推,填完本区。
将(2 )填入右下顶角的左一格,(以它为首数每格递加4)从下往左上依次填完一行,再折回从下往左上依次填完第二行,以此类推,填完本区。
将(n的平方-1)填入左下顶角的右一格,(以它为首数每格递减4)从下往右上依次填完一行,再折回从下往右上依次填完第二行,以此类推,填完本区。
将(3 )填入左下顶角的上一格,(以它为首数每格递加4)从下往右上依次填完一行,再折回从下往右上依次填完第二行,以此类推,填完本区。
将(n的平方-2)填入左上顶角的下一格,(以它为首数每格递减4)从上往右下依次填完一行,再折回从上往右下依次填完第二行,以此类推,填完本区。
将(4 )填入左上顶角的右一格,(以它为首数每格递加4)从上往右下依次填完一行,再折回从上往右下依次填完第二行,以此类推,填完本区。
将(n的平方-3)填入右上顶角的左一格,(以它为首数每格递减4)从上往左下依次填完一行,再折回从上往左下依次填完第二行,以此类推,填完本区。
至此,幻方填写成功,每行每列还有两条对角线的幻和完全相等,幻和等于(n的平方+1)除以2然后乘以n 注:n=幻方阶数
我在数学北大论坛和幻方北大论坛公布后并无引起异议,故向贵吧投稿,望审核评论,冒昧的说一句这个公式应为国内外幻方领域内迄今为止,乃至今后幻方界最简单最完美的填图法,因为它无法再简化了!我绘制的此方法原理图充分体现了数学的朴素之美!同时此方
法的得出阐明了一个道理,即数学的规律可以有小及大,我们不必研究很大的数字,数论在不太大的数字范围内已经能够显现它的规律了。
古代数学家杨辉给出的幻方位移法很复杂,而且领导了后来幻方做法的方向,他本人也只做到了十阶。
现在的计算机编程做法可以做得很大,但无规律可循。
我认为在数学的基础研究方面,人类的联想和逻辑分析能力,是计算机永远无法企及的!
宇宙=数学奥秘。