主题:浅谈幻方的构造
注:本文最先发表在pascal论坛:
http://www.cqyzedu.com/cpascal/bbs/index.asp
对每种幻方都举出了两种解法。
程序最先发表在本论坛.
幻方,亦称纵横图。台湾称为魔术方阵。将自然数1,2,3,……n*n排列成一个n*n方阵,使得每行、每列以及两对角线上的各个数之各都等于n/2*(n*n+1),这样的方阵称为幻方。n是它的阶数,n/2*(n*n+1)为幻方的变幻常数。已经证明,对于n>2,n阶幻方都存在。
例如:把1,2,3,4,5,6,7,8,9填入下面的格子(格子用*来代替),使得:每行、每列、两条对角线的和是15。
* * *
* * *
* * *
一个答案是:
4 9 2
3 5 7
8 1 6
这个3阶幻方,是最古老的幻方。相传大禹治水时期(约公元前22世纪),洛水中浮出一只大龟,龟背上有图有字,人们称之为“洛书”。洛书中共有黑白圆圈、点45个。这些点的排列,用数字来表示就是上面的幻方。
幻方有很多性质,在这里我仅举两个:
(1) 任意阶幻方,把数字按顺序写,则两对条线上的数的和,即为变幻常数。
1 2 3
4 5 6
7 8 9
(1+5+9) 或(3+5+7) = 15
很容易用等差数列求和公式推导出:
变幻常数 = n/2*(n*n+1)
(2) 幻方的每一个数同时加上或乘以一个确定的数,所得的依然是幻方。
已经有不少奇数阶幻方的构造方法,但是偶数阶幻方的构造,一度成为了难题。不过事实上,偶阶幻方的构造,已经被人们想出来了。
幻方的阶数,要么是奇数阶,要么是偶数阶。偶数阶中,要么阶数可以被4整除,要么不能被4整除。可以用三种不同的方法,来构造这三种不同的幻方。
一、奇数阶纪方的构造方法(楼梯法)。
把1(或最小的数)放在第一行正中;
按以下规律排列剩下的n*n-1个数:
1)每一个数放在前一个数的右上一格;
2)如果这个数所要放的格已经超出了顶行那么就把它放在底行,仍然要放在右一列;
3)如果这个数所要放的格已经超出了最右列那么就把它放在最左列,仍然要放在上一行;
4)如果这个数所要放的格已经超出了顶行且超出了最右列那么就把它放在前一个数的下一行同一列的格内;
5)如果这个数所要放的格已经有数填入,处理方法同4)。
图示:
* 1 * * 1 *
* * * * * *
* * * * * 2
===============
* 1 * * 1 *
3 * * 3 * *
* * 2 4 * 2
===============
* 1 * * 1 6
3 5 * 3 5 *
4 * 2 4 * 2
===============
* 1 6 8 1 6
3 5 7 3 5 7
4 * 2 4 * 2
===============
8 1 6
3 5 7
4 9 2
奇数阶幻方的一种用公式表达的构造方法:
设x是要填入的数,(xx,yy)是坐标。坐标如何确定呢?
k= (x-1) div n +(n+3) div 2 + (x-1)
yy=k- (k-1) div n *n
p= (n+1) div 2 + (x-1)- (x-1) div n
xx=n+1-p+(p-1) div n * n
二、双偶阶(4k)阶幻方的构造方法。
就是说,阶数可以被4整除。
看看4阶幻方的制作方法:
先把数字,按顺序写(从左到右,从上到下):
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
然后把对角线,换成互补的数字。
定义:
互补:如果两个数字的和,等于幻方最大数和最小数的和,即 n*n+1,称为互补。
16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1
人们从4阶幻方的制作方法,找到了构造双偶阶幻方的方法:
对于n=4k阶幻方,我们先把数字按顺序填写。写好后,按4*4把它划分成k*k个方阵。把每个小方阵的对角线,象制作4阶幻方的方法一样,换成互补的数字,就构成幻方。
事实上,有些小方阵的对角线是连着的。但是因为没有办法画图,我只能这样子描述。
双偶阶幻方另一种用PASCAL程序语句表达的构造的方法如下:
for i:=1 to n do
for j:=1 to n do
begin
if j mod 4>1 then m:=1
else m:=0;
k:=n-i-(n-2*i+1)*m;
if i mod 4>1 then m:=1
else m:=0;
L:=n-j+1-(n-2*j+1)*m;
a[i, j]:=k*N+L;
end;
三、单偶阶(4k+2)幻方的构造
阶数是偶数,但是,又不能被4整除。这是最难的一种幻方。
一种构造n=4k+2幻方的方法:
(1) 先排出4k的双偶阶幻方
(2) 根据幻方的性质,每个数都同时加上 8k+2
(3) 把它扩展成为4k+2的方阵。这样,四周包围着一圈。我们只要把
1,2,3……,8k+2, (4k+2)^2, (4k+2)^2-1, ……,(4k)^2+1+8k+2
这些数字,填入最外一圈,使得:对角线两端,每行、每列两端数字互补。
当然,最后圈的两横,两列各数之和要等于变幻常数。
以制作6阶幻方为例:
先制作出4阶幻方。
方阵的每个数字,加上8k+2=10
再把它扩大成6阶,如下图:
* * * * * *
* 26 12 13 23 *
* 15 21 20 18 *
* 19 17 16 22 *
* 14 24 25 11 *
* * * * * *
我们只要把
1,2,3,……,9,10,
36,35,34,……27
填入外圈。
不过,当n较大时,外圈的填法也不太容易。有一种公式来填外圈。坐标(j,i) 为j行i列的。先固定填下这10个数:
a[1,1]=1 a[n,1]=4 a[n-1,1]=10 a[2,n]=3 a[3,n]=5 a[4,n]=7
a[n,n-2]=2 a[n,n-1]=9 a[1,2]=6 a[1,3]=8
当n=4k+2时,
a[j,i]=
11,12,…,k+9 (j=1, i=4..k+2)
k+10,k+11,…,2k+8 (j=5..k+3, i=n )
2k+9,2k+10,…,3k+7 (j=n ,i=2k+2..3k)
3k+8,3k+9,…,5k+5 (j=2k+3..4k, i=1)
5k+6,5k+7,…,6k+4 (j=n, i=3k+1..4k-1)
6k+5,6k+6,…,7k+3 (j=k+4…2k+2, i=n)
7k+4,7k+5,…,8k+2 (j=1, i=k+3..2k+1)
按公式算出来后,实际上外圈已经填好了一半了。剩下来的工作,只要把剩下的相对应元素,填下去。(同行两端的数相对应、同列两端的数相对应、两条对角线两端的数相对应,每对之和为n*n+1)。
介绍另外一种构造单偶阶幻方的方法:
<1> 基本图(是个6阶方阵)
4 2 4 2 1 2
1 3 1 3 4 3
4 2 1 2 4 2
1 3 4 3 1 3
4 2 4 2 1 2
1 3 1 3 4 3
这个方阵要把它按2*2把大方阵分割成3*3个格,每个格子里4个数都是1,2,3,4,只是方向上不同。
<2> 如果要作的幻方不是6阶,是更大的阶数:
每次同时在最上面、最下面加入下面方阵:
4 2 4 2 1 2
1 3 1 3 4 3
每加一次,多出4行来,直至想要的阶数。这样加后是个长方形方阵,左边、右边怎么办?
左边都用
4 3
1 2
同时,右边都用
1 2
4 3
填充,每次多出4列来,直至想要的阶数。
下面是加成10*10方阵的例子:
4 3 4 2 4 2 1 2 1 2
1 2 1 3 1 3 4 3 4 3
4 3 4 2 4 2 1 2 1 2
1 2 1 3 1 3 4 3 4 3
4 3 4 2 1 2 4 2 1 2
1 2 1 3 4 3 1 3 4 3
4 3 4 2 4 2 1 2 1 2
1 2 1 3 1 3 4 3 4 3
4 3 4 2 4 2 1 2 1 2
1 2 1 3 1 3 4 3 4 3
如果把每2*2的小格子四个数,看成一个格子,这是一个2k+1奇数阶方阵。
画个(2k+1)*(2k+1)的格子吧,格子画大一点,我们要按奇数阶幻方的填法,填写这些格子,只不过每次要填写的是四个数。方向跟着制作出来的参考图方向一样。
例:我们要做一个6阶的幻方。参考图当然是用<1> 基本图,不需要迭加了。然后,列成3*3个大格子,大格子的顺序我们按奇数幻方的顺序填写,小格子里的顺序按1,2,3,4这四个数字的方向填写,按顺序每次填入4个数:
* * 4 2 * * * * 4 2 * *
* * 1 3 * * * * 1 3 * *
* * * * * * * * * * * *
* * * * * * * * * * * *
* * * * * * * * * * 5 6
* * * * * * * * * * 8 7
=============================================
* * 4 2 * * * * 4 2 * *
* * 1 3 * * * * 1 3 * *
12 10 * * * * 12 10 * * * *
9 11 * * * * 9 11 * * * *
* * * * 5 6 16 14 * * 5 6
* * * * 8 7 13 15 * * 8 7
=============================================
…………
继续直至填完。
http://www.cqyzedu.com/cpascal/bbs/index.asp
对每种幻方都举出了两种解法。
程序最先发表在本论坛.
幻方,亦称纵横图。台湾称为魔术方阵。将自然数1,2,3,……n*n排列成一个n*n方阵,使得每行、每列以及两对角线上的各个数之各都等于n/2*(n*n+1),这样的方阵称为幻方。n是它的阶数,n/2*(n*n+1)为幻方的变幻常数。已经证明,对于n>2,n阶幻方都存在。
例如:把1,2,3,4,5,6,7,8,9填入下面的格子(格子用*来代替),使得:每行、每列、两条对角线的和是15。
* * *
* * *
* * *
一个答案是:
4 9 2
3 5 7
8 1 6
这个3阶幻方,是最古老的幻方。相传大禹治水时期(约公元前22世纪),洛水中浮出一只大龟,龟背上有图有字,人们称之为“洛书”。洛书中共有黑白圆圈、点45个。这些点的排列,用数字来表示就是上面的幻方。
幻方有很多性质,在这里我仅举两个:
(1) 任意阶幻方,把数字按顺序写,则两对条线上的数的和,即为变幻常数。
1 2 3
4 5 6
7 8 9
(1+5+9) 或(3+5+7) = 15
很容易用等差数列求和公式推导出:
变幻常数 = n/2*(n*n+1)
(2) 幻方的每一个数同时加上或乘以一个确定的数,所得的依然是幻方。
已经有不少奇数阶幻方的构造方法,但是偶数阶幻方的构造,一度成为了难题。不过事实上,偶阶幻方的构造,已经被人们想出来了。
幻方的阶数,要么是奇数阶,要么是偶数阶。偶数阶中,要么阶数可以被4整除,要么不能被4整除。可以用三种不同的方法,来构造这三种不同的幻方。
一、奇数阶纪方的构造方法(楼梯法)。
把1(或最小的数)放在第一行正中;
按以下规律排列剩下的n*n-1个数:
1)每一个数放在前一个数的右上一格;
2)如果这个数所要放的格已经超出了顶行那么就把它放在底行,仍然要放在右一列;
3)如果这个数所要放的格已经超出了最右列那么就把它放在最左列,仍然要放在上一行;
4)如果这个数所要放的格已经超出了顶行且超出了最右列那么就把它放在前一个数的下一行同一列的格内;
5)如果这个数所要放的格已经有数填入,处理方法同4)。
图示:
* 1 * * 1 *
* * * * * *
* * * * * 2
===============
* 1 * * 1 *
3 * * 3 * *
* * 2 4 * 2
===============
* 1 * * 1 6
3 5 * 3 5 *
4 * 2 4 * 2
===============
* 1 6 8 1 6
3 5 7 3 5 7
4 * 2 4 * 2
===============
8 1 6
3 5 7
4 9 2
奇数阶幻方的一种用公式表达的构造方法:
设x是要填入的数,(xx,yy)是坐标。坐标如何确定呢?
k= (x-1) div n +(n+3) div 2 + (x-1)
yy=k- (k-1) div n *n
p= (n+1) div 2 + (x-1)- (x-1) div n
xx=n+1-p+(p-1) div n * n
二、双偶阶(4k)阶幻方的构造方法。
就是说,阶数可以被4整除。
看看4阶幻方的制作方法:
先把数字,按顺序写(从左到右,从上到下):
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
然后把对角线,换成互补的数字。
定义:
互补:如果两个数字的和,等于幻方最大数和最小数的和,即 n*n+1,称为互补。
16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1
人们从4阶幻方的制作方法,找到了构造双偶阶幻方的方法:
对于n=4k阶幻方,我们先把数字按顺序填写。写好后,按4*4把它划分成k*k个方阵。把每个小方阵的对角线,象制作4阶幻方的方法一样,换成互补的数字,就构成幻方。
事实上,有些小方阵的对角线是连着的。但是因为没有办法画图,我只能这样子描述。
双偶阶幻方另一种用PASCAL程序语句表达的构造的方法如下:
for i:=1 to n do
for j:=1 to n do
begin
if j mod 4>1 then m:=1
else m:=0;
k:=n-i-(n-2*i+1)*m;
if i mod 4>1 then m:=1
else m:=0;
L:=n-j+1-(n-2*j+1)*m;
a[i, j]:=k*N+L;
end;
三、单偶阶(4k+2)幻方的构造
阶数是偶数,但是,又不能被4整除。这是最难的一种幻方。
一种构造n=4k+2幻方的方法:
(1) 先排出4k的双偶阶幻方
(2) 根据幻方的性质,每个数都同时加上 8k+2
(3) 把它扩展成为4k+2的方阵。这样,四周包围着一圈。我们只要把
1,2,3……,8k+2, (4k+2)^2, (4k+2)^2-1, ……,(4k)^2+1+8k+2
这些数字,填入最外一圈,使得:对角线两端,每行、每列两端数字互补。
当然,最后圈的两横,两列各数之和要等于变幻常数。
以制作6阶幻方为例:
先制作出4阶幻方。
方阵的每个数字,加上8k+2=10
再把它扩大成6阶,如下图:
* * * * * *
* 26 12 13 23 *
* 15 21 20 18 *
* 19 17 16 22 *
* 14 24 25 11 *
* * * * * *
我们只要把
1,2,3,……,9,10,
36,35,34,……27
填入外圈。
不过,当n较大时,外圈的填法也不太容易。有一种公式来填外圈。坐标(j,i) 为j行i列的。先固定填下这10个数:
a[1,1]=1 a[n,1]=4 a[n-1,1]=10 a[2,n]=3 a[3,n]=5 a[4,n]=7
a[n,n-2]=2 a[n,n-1]=9 a[1,2]=6 a[1,3]=8
当n=4k+2时,
a[j,i]=
11,12,…,k+9 (j=1, i=4..k+2)
k+10,k+11,…,2k+8 (j=5..k+3, i=n )
2k+9,2k+10,…,3k+7 (j=n ,i=2k+2..3k)
3k+8,3k+9,…,5k+5 (j=2k+3..4k, i=1)
5k+6,5k+7,…,6k+4 (j=n, i=3k+1..4k-1)
6k+5,6k+6,…,7k+3 (j=k+4…2k+2, i=n)
7k+4,7k+5,…,8k+2 (j=1, i=k+3..2k+1)
按公式算出来后,实际上外圈已经填好了一半了。剩下来的工作,只要把剩下的相对应元素,填下去。(同行两端的数相对应、同列两端的数相对应、两条对角线两端的数相对应,每对之和为n*n+1)。
介绍另外一种构造单偶阶幻方的方法:
<1> 基本图(是个6阶方阵)
4 2 4 2 1 2
1 3 1 3 4 3
4 2 1 2 4 2
1 3 4 3 1 3
4 2 4 2 1 2
1 3 1 3 4 3
这个方阵要把它按2*2把大方阵分割成3*3个格,每个格子里4个数都是1,2,3,4,只是方向上不同。
<2> 如果要作的幻方不是6阶,是更大的阶数:
每次同时在最上面、最下面加入下面方阵:
4 2 4 2 1 2
1 3 1 3 4 3
每加一次,多出4行来,直至想要的阶数。这样加后是个长方形方阵,左边、右边怎么办?
左边都用
4 3
1 2
同时,右边都用
1 2
4 3
填充,每次多出4列来,直至想要的阶数。
下面是加成10*10方阵的例子:
4 3 4 2 4 2 1 2 1 2
1 2 1 3 1 3 4 3 4 3
4 3 4 2 4 2 1 2 1 2
1 2 1 3 1 3 4 3 4 3
4 3 4 2 1 2 4 2 1 2
1 2 1 3 4 3 1 3 4 3
4 3 4 2 4 2 1 2 1 2
1 2 1 3 1 3 4 3 4 3
4 3 4 2 4 2 1 2 1 2
1 2 1 3 1 3 4 3 4 3
如果把每2*2的小格子四个数,看成一个格子,这是一个2k+1奇数阶方阵。
画个(2k+1)*(2k+1)的格子吧,格子画大一点,我们要按奇数阶幻方的填法,填写这些格子,只不过每次要填写的是四个数。方向跟着制作出来的参考图方向一样。
例:我们要做一个6阶的幻方。参考图当然是用<1> 基本图,不需要迭加了。然后,列成3*3个大格子,大格子的顺序我们按奇数幻方的顺序填写,小格子里的顺序按1,2,3,4这四个数字的方向填写,按顺序每次填入4个数:
* * 4 2 * * * * 4 2 * *
* * 1 3 * * * * 1 3 * *
* * * * * * * * * * * *
* * * * * * * * * * * *
* * * * * * * * * * 5 6
* * * * * * * * * * 8 7
=============================================
* * 4 2 * * * * 4 2 * *
* * 1 3 * * * * 1 3 * *
12 10 * * * * 12 10 * * * *
9 11 * * * * 9 11 * * * *
* * * * 5 6 16 14 * * 5 6
* * * * 8 7 13 15 * * 8 7
=============================================
…………
继续直至填完。