幻方又称为魔方,方阵或厅平方。在一个由若干个排列整齐的数组成的正方形中,图中任意一横行、一纵行及对角线的几个数之和都相等,具有这种性质的图表,称为“幻方”。中国古代称为“河图”、“洛书”,又叫“纵横图”,《系辞》云:“河出图,洛出书,圣人则之。”在宋朝之前,洛书的记述只有文字。通常幻方由从1到N^2的连续整数组成,其中N为正方形的行或列的数目。因此N阶幻方有N行N列,并且所填充的数为从1到N^2。根据构造方法的不同,幻方可以分成三类:奇数阶幻方、4M阶幻方和4M+ 2阶幻方。
幻方_幻方 -定义
幻方
在一个由若干个排列整齐的数组成的正方形中,图中任意一横行、一纵行及对角线的几个数之和都相等,具有这种性质的图表,称为“幻方”。我国古代称为“河图”、“洛书”,又叫“纵横图”。n阶幻方是由前n2个自然数组成的一个n阶方阵,其各行、各列及两条对角线所含的n个数的和相等。
幻方_幻方 -历史
幻方
宋代数学家杨辉称之为纵横图。
所谓纵横图,它是由1到n 2,这n 2个自然数按照一珲的规律排列成N行、N列的一个方阵。它具有一种厅妙的性质,在各种几何形状的表上排列适当的数字,如果对这些数字进行简单的逻辑运算时,不论采取哪一条路线,最后得到的和或积都是完全相同的。
大约两千多年前西汉时代,流传夏禹治水时,黄河中跃出一匹神马,马背上驮著一幅图,人称“河图”;又洛水河中浮出一只神龟,龟背上有一张象徵吉祥的图案称为“洛书”。
他们发现,这个图案每一列,每一行及对角线,加起来的数字和都是一样的,这就是我们现在所称的幻方.也有人认为“洛书”是外星人遗物;而"河图"则是描述了宇宙生物(包括外星人)的基因排序规则,幻方是外星人向地球人的自我介绍。另外前几年在上海浦东陆家嘴地区挖出了一块元朝时代伊斯兰教信徒所挂的玉挂,玉挂的正面写著:“万物非主,惟有真宰,默罕默德,为其使者”,而玉挂的另一面就是一个四阶幻方。
关于幻方的起源,中国有“河图”和“洛书”之说。相传在远古时期,伏羲氏取得天下,把国家治理得井井有条,感动了上花于是黄河中跃出一匹龙马,背上驮着一张图,反作为礼物献给他,这就是“河图”,了是最早的幻方伏羲氏赁借着“河图”而演绎出了八卦,后来大禹治洪水时,咯水中浮出一只大乌龟,它的背上有图有字,人们称之为“洛书”。“洛书”所画的衅中共有黑、白圆圈45个。把这些连在一起的小圆和数目表示出来,得到九个。这九个数就可以组成一个纵横图,人们把由九个数3行3列的幻方称为3阶幻方,除此之外,还有4阶、5阶...
后来,人们经过研究,得出计算任意阶数幻方的各行、各列、各条对角线上所有数的和的公式为:
Nn=1/2n(n 2+1)
其中n为幻方的阶数,所求的数为Nn.
幻方最早记载于我国公元前500年的春秋时期《大戴礼》中,这说明我国人民早在2500年前就已经知道了幻方的排列规律。而在国外,公元130年,希腊人塞翁才第一次提起幻方。
我国不仅拥用幻方的发明权,而且是对幻方进行深入研究的国家。公元13世纪的数学家杨辉已经编制出3-10阶幻方,记载在他1275年写的《续古摘厅算法》一书中。在欧洲,直到574年,德国著名画家丢功才绘制出了完整的4阶幻方。
而在国外,十二世纪的阿拉伯文献也有六阶幻方的记载,我国的考古学家们曾经在西安发现了阿拉伯文献上的五块六阶幻方,除了这些以外,历史上最早的四阶幻方是在印度发现的,那是一个完全幻方(後面会提到),而且比中国的杨辉还要早了两百多年,印度人认为那是天神的手笔。
1956年西安出土一铁片板上所刻的六阶幻方(古阿拉伯数字)
十三世纪,东罗马帝国才对幻方产生兴趣,但却没有什么成果.
直到十五世纪,住在君士坦丁堡的魔索普拉才把我国的纵横图传给了欧洲人,欧洲人认为幻方可以镇压妖魔,所以把它作为护身符,也把它叫作“Magic Square”。
欧洲最早的幻方是在德国一位名画家Albrecht Dure的画里的,上面有一个四阶幻方,而这个幻方的下面两个数字正好是这幅画的制作年代(1514).这是欧洲最古老的幻方。
幻方_幻方 -规律
三阶幻方(1-9):各行、各列、各条对角线上所有数的和都为15
四阶幻方(1-16):各行、各列、各条对角线上所有数的和都为36
1+2+...+16=16*17/2=136
136/4=34
各行、各列、各条对角线上所有数的和都为34(非36)
十阶幻方(1-100):各行、各列、各条对角线上所有数的和都为505
幻方_幻方 -n阶幻方与高阶幻方
n阶幻方是由前n^2(n的2次方)个自然数组成的一个n阶方阵,其各行、各列及两条对角线所含的n个数的和相等。例子:(三阶幻方,幻和为15,)
4 9 2
3 5 7
8 1 6
三阶幻方中间必填5
高次幻方是指,当组成幻方各数替换为其2,3,...,k次幂时,仍满足幻方条件者,称此幻方为k次幻方。
幻方_幻方 -世界纪录
目前中国取得不少幻方世界纪录:幻方专家李文第一位构造成功10阶标准幻立方,第一位构造出最低阶729阶五次幻方,和多项平方幻方世界纪录,幻方专家苏茂挺第一位构成功32阶完美平方幻方等。
任意阶幻方构造法,任意维幻方构造法,任意次幻方构造法,都早已找到。
不存在最大阶幻方的世界纪录之类。
对于各种媒体报导的幻方世界之最,很多是不实报导,不存在未解最大阶数幻方。
幻方_幻方 -种类
现在的幻方种类很多,如:
一般幻方、对称幻方、同心幻方、完美幻方;
平面幻方(二维)、幻立方(三维)、多维幻方;
平方幻方、立方幻方、高次幻方、高次多维幻方;
魔鬼幻方、马步幻方、多重幻方、六角幻方、双料幻方、幻环、幻圆等等。
幻方_幻方 -编制程序
幻方
利用计算机编程序,可求解出任意阶幻方。(但数字位数受电脑限制,实际上只能是有限范围内的任意阶)
对于某些平方幻方,高次幻方,利用计算机辅助计算,也可快速求得。
一次幻方,一次幻立方,一次多维幻方,甚至可用简单公式全部求得。
某些类型的平方幻方,甚至高次高维幻方,也可用公式求得。
在幻方公式求解方法,中国处于世界领先水平,中国李文的高维高次幻方公式,是幻方理论中的精品。吴硕辛的高次幻方理论,也可用公式求解。
幻方_幻方 -构造
在《射雕》中郭黄二人被裘千仞追到黑龙潭,躲进瑛姑的小屋。瑛姑出了一道题:数字1――9填到三行三列的表格中,要求每行、每列、及两条对角线上的和都相等。这道题难倒了瑛姑十几年,被黄蓉一下子就答出来了。492
357
816
这就是一个最简单的3阶平面幻方。因为幻方的智力性和趣味性,很游戏和玩具都与幻方有关,如捉放曹、我们平时玩的六面体,也成为学习编程时的常见问题。
南宋数学家杨辉,在他著的《续古摘奇算法》里介绍了这种方法:只要将九个自然数按照从小到大的递增次序斜排,然后把上、下两数对调,左、右两数也对调;最后再把中部四数各向外面挺出,幻方就出现了。(摘自《趣味数学辞典》)
最简单的幻方就是平面幻方,还有立体幻方、高次幻方等。对于立体幻方、高次幻方目前世界上很多数学家仍在研究,现在只讨论平面幻方。
对平面幻方的构造,分为三种情况:N为奇数、N为4的倍数、N为其它偶数(4n+2的形式)
⑴N为奇数时,最简单
(1)将1放在第一行中间一列;
(2)从2开始直到n×n止各数依次按下列规则存放:
按45°方向行走,如向右上
每一个数存放的行比前一个数的行数减1,列数加1
(3)如果行列范围超出矩阵范围,则回绕。
例如1在第1行,则2应放在最下一行,列数同样加1;
(4)如果按上面规则确定的位置上已有数,或上一个数是第1行第n列时,则把下一个数放在上一个数的下面。
⑵N为4的倍数时
采用对称元素交换法。
首先把数1到n×n按从上至下,从左到右顺序填入矩阵,然后将方阵的所有4×4子方阵中的两对角线上位置的数关于方阵中心作对称交换,即a(i,j)与a(n-1-i,n-1-j)交换,所有其它位置上的数不变。
(或者将对角线不变,其它位置对称交换也可)
⑶N为其它偶数时
当n为非4倍数的偶数(即4n+2形)时:首先把大方阵分解为4个奇数(2m+1阶)子方阵。
按上述奇数阶幻方给分解的4个子方阵对应赋值
上左子阵最小(i),下右子阵次小(i+v),下左子阵最大(i+3v),上右子阵次大(i+2v)
即4个子方阵对应元素相差v,其中v=n*n/4
四个子矩阵由小到大排列方式为①③④②
然后作相应的元素交换:a(i,j)与a(i+u,j)在同一列做对应交换(j<t或j>n-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语言实现
#include"stdio.h"
#include"math.h"
inta[256][256];
intsum;
intcheck();
voidins(intn);
main()
{
inti,j,n,k,t,p,x;
scanf("%d",&n);
sum=(n*n+1)*n/2;
if(n%2==1)//奇数幻方
{
ins(n);
k=n;
}
if(n%4==2)//单偶数幻方
{
k=n/2;
ins(k);
for(i=0;i<k;i++)
for(j=0;j<k;j++)
{
a[j+k]=a[j]+2*k*k;
a[i+k][j]=a[j]+3*k*k;
a[i+k][j+k]=a[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[j];a[j]=a[i+k][j];a[i+k][j]=p;
}
if((j<t)&&(i>k-t-1))
{
p=a[j];a[j]=a[i+k][j];a[i+k][j]=p;
}
if((i>=t&&i<=k-t-1)&&(j>=t&&j<t*2))
{
p=a[j];a[j]=a[i+k][j];a[i+k][j]=p;
}
if(j>1&&j<=t)
{
p=a[j+k];a[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[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;
elseif(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[j]);
printf("n");
}
return;
}
}
intcheck(intn)//检验是否是幻方
{
inti,j,sum1=0,sum2;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
sum1+=a[j];
if(sum1!=sum)return0;
sum1=0;;
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
sum1+=a[j];
if(sum1!=sum)return0;
sum1=0;
}
for(sum1=0,sum2=0,i=0,j=0;i<n;i++,j++)
{
sum1+=a[j];
sum2+=a[n-j-1];
}
if(sum1!=sum)return0;
if(sum2!=sum)return0;
elsereturn1;
}
voidins(intn)//单偶数幻方的输入
{intx,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;
}
}
}
奇阶幻方
当n为奇数时,我们称幻方为奇阶幻方。可以用Merzirac法与loubere法实现,根据我的研究,发现用国际象棋之马步也可构造出更为神奇的奇幻方,故命名为horse法。
偶阶幻方
当n为偶数时,我们称幻方为偶阶幻方。当n可以被4整除时,我们称该偶阶幻方为双偶幻方;当n不可被4整除时,我们称该偶阶幻方为单偶幻方。可用了Hire法、Strachey以及YinMagic将其实现,Strachey为单偶模型,我对双偶(4m阶)进行了重新修改,制作了另一个可行的数学模型,称之为Spring。YinMagic是2002年设计的模型,他可以生成任意的偶阶幻方。
在填幻方前我们做如下约定:如填定数字超出幻方格范围,则把幻方看成是可以无限伸展的图形,如下图:
Merzirac法生成奇阶幻方
在第一行居中的方格内放1,依次向右上方填入2、3、4…,如果右上方已有数字,则向下移一格继续填写。如下图用Merziral法生成的5阶幻方:
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
1118 25 2 9
loubere法生成奇阶幻方
在居中的方格向上一格内放1,依次向右上方填入2、3、4…,如果右上方已有数字,则向上移二格继续填写。如下图用Louberel法生成的7阶幻方:
3039481101928
384779182729
466817263537
5141625343645
1315243342444
2123324143312
2231404921120
horse法生成奇阶幻方
先在任意一格内放入1。向左走1步,并下走2步放入2(称为马步),向左走1步,并下走2步放入3,依次类推放到n。在n的下方放入n+1(称为跳步),再按上述方法放置到2n,在2n的下边放入2n+1。如下图用Horse法生成的5阶幻方:
77583920172533415
66849301173634425
16785940212645435
26769503112745545
36177960412236546
37278705132137556
47281880614223466
57381997152331476
67482910816243245
一般的,令矩阵[1,1]为向右走一步,向上走一步,[-1,0]为向左走一步。则马步可以表示为2X+Y,{X∈{[1,0],[-1,0]},Y∈{[0,1],[0,-1]}}∪{Y∈{[1,0],[-1,0]},X∈{[0,1],[0,-1]}}。对于2X+Y相应的跳步可以为2Y,-Y,X,-Y,X,3X,3X+3Y。上面的的是X型跳步。Horse法生成的幻方为魔鬼幻方。
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阶填写方法:
154326
623451
123456
653421
624351
154326
如下所示为8阶填写方法(转置以后):
18118881
72227727
63336366
54444555
45555444
36663633
27772272
81881118
将A上所有数字分别按如下算法计算,得到B,其中b(i,j)=n×(a(i,j)――1)。则AT+B为目标幻方
(AT为A的转置矩阵)。如下图用Hire法生成的8阶幻方:
163656059588
5610111253541549
4118192045224748
3326272829383940
3239383637272625
2447434520461817
165054531211559
577626143264
Strachey法生成单偶幻方
将n阶单偶幻方表示为4m+2阶幻方。将其等分为四分,成为如下图所示A、B、C、D四个2m+1阶奇数幻方。
AC
DB
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阶幻方:
3516261924
3327212325
3192222720
82833171015
30534121416
43629131811
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阶幻方:
162313
511108
97612
414151
YinMagic构造偶阶幻方
先构造n-2幻方,之后将其中的数字全部加上2n-2,放于n阶幻方中间,再用本方法将边缘数字填写完毕。本方法适用于n>4的所有幻方,我于2002年12月31日构造的数学模型。YinMagic法可生成6阶以上的偶幻方。如下图用YinMagic法生成的6阶幻方:
1013433528
29232211188
30121724217
22619141535
31131625206
936343227
魔鬼幻方
如将幻方看成是无限伸展的图形,则任何一个相邻的n*n方格内的数字都可以组成一个幻方。则称该幻方为魔鬼幻方。
用我研究的Horse法构造的幻方是魔鬼幻方。如下的幻方更是魔鬼幻方,因为对于任意四个在两行两列上的数字,他们的和都是34。此幻方可用YinMagic方法生成。
151036
45169
141127
181312
罗伯法:
1居上行正中央,仿次斜填莫相忘,上出框时往下填,
右出框时左边放,排重便在下格填,右上排重一个样。