爪哇流氓

· 『所有网志』 (13)
· 我的歪酷 非非共享界
· 硬汉不跳舞
·

订阅 RSS

0006051

歪酷博客

语言不华丽
文字不丰富
头脑不清楚
手脚不灵便
爪哇流氓 @ 2007-07-10 18:34

既然还发现了毕业论文,哈哈。
毕业论文(设计)任务书
 
毕业论文(设计)题目:     广义拉丁方的构造和应用研究              
题目类型[1]      理论研究             题目来源[2]­­­ ­­­­­­  教师为学生选题    
毕业论文(设计)时间从      2004.3.1            2004.6.10      
1. 毕业论文(设计)内容要求:
    该论文设计要求:1.熟悉和掌握拉丁方的基本理论和构造方法及染色问题的解法,认真阅读指定的3篇论文。 2. 对以下问题编程进行数据实验:(1)对文献[1]提出的方法用计算机编程实现, 10以内检验:(2)将其问题和方法推广到立体三个方向, 并研究之;(3) 数据实验要进行编程和调试等工作,要较好的掌握设计使用的语言工具, 3.完成实验的设计后,应对发现的规律进行研究,包括对其中一种进行较为细致的研究,4. 设计完成后,按学校毕业论文的要求完成毕业论文的写作。                                                          
 ________________________­­­­­­­­­­­­____________ _ __­­­­­____________­­­­­­­­­­­­____________­­­­­­­­­­­­________________________­­­­­­­­­­­­__________ __­­­­­____________­­­­­­­­­­­­________________________­­­­­­­­­­­­__________ __­­­­­____________­­­­­­­­­­­­________________________­­­­­­­­­­­­__________ __­­­­­____________­­­­­­­­­­­­________________________________________________­­­­­­­­­­­­__________ __­­­­­____________­­­­­­­­­­­­____________­­­­­­­­­­­­________________________­­­­­­­­­­­­__________ __­­­­­_____________­­­­­­­­­­­­____________­­­­­­­­­­­­________________________­­­­­­­­­­­­__________ __­­­­­___________­­­­­­­­­­­­____________­­­­­­­­­­­­__________­­­­­­­­­­­­__________                                                 _________________­­­­­­­­­­­­___________ _­­­­­­­­­­­­____________ _­­­­­­­­­­­­__________________ _­­­­­­­­­­­­ [1] 题目类型: 理论研究实验研究工程设计工程技术研究软件开发
[2] 题目来源: 教师科研题生产实际题模拟或虚构题学生自选题
文献查阅指引
 1. 王建中,《染色问题,湖南教育学院学报,1988.5 1999.2                                              
_2. Chen Xiaosong. Ways of Constructing Optimal Magic Cube of Order nWhen ( n, 2ž3ž5ž7)=1. Journal of Central south university of Technology. (English Edition) 2002.1(Vol.9)                                                        
_3. 陈小松n (( n, 2ž3ž5)=1)阶高级幻立方的构造方法. 湖南教育学院
学报 , 1990.5                                                     
_                                                                    
____________­­­­­­­­­­­­________________________­­­­­­­­­­­­____ _______________ ________________­­­­­­­­­­­­____________­­­­­­­­­­­­________________________­­­­­­­­­­­­___ ___________________________ ___________________­­­­­­­­­­­­____________­­­­­­­­­­­­________________________­­­­­­­­­­­­_ ____________ __________________­­­­­­­­­­­­____________­­­­­­­­­­­­________________________­­­­­­­­­­­­___________         ­­­­­­­­­­­­__________       _ ­­­­­­­­­­­­_____­­­­­­­­­­­­__________       _  _______                                              __                                                                               ___________
3. 毕业论文(设计)进度安排
阶段
   
起止时间
一、
调研、确定题目并查阅有关文献
2.23 3.10
二、
选择有关的外文参考文献完成英译中
3.11- 3.31
三、
数据实验及程序设计和调试,对有关问题进行钻研
4.1- 5.20
四、
撰写论文并根据指导老师意见完成对论文进行修改
5.21- 5.30
五、
作论文答辩准备和参加论文答辩.
5.31- 6.5
 
指导教师(签名)                       时间: 2004.3.1  
专业室(所)主任(签名)                     ­­­­­­­­­­­­时间:       
主管院长(签字)        ­­­­­­­­­­­­                       时间:       
 
================================================================================
   
摘要 …………………………………………………………………………………………… 1
Abstract ……………………………………………………………………………………… 2
 
第一章       引言 ………………………………………………………………………………… 3
1.1       拉丁方的起源   ……………………………………………………………………… 3
1.2       简易拉丁方的应用   ………………………………………………………………… 4
 
第二章       广义拉丁方的构造和应用研究 ……………………………………………………  5
2.1       拉丁方的探讨 ………………………………………………………………………… 5
2.1.1       拉丁方问题的产生意义与应用 ………………………………………………… 5
2.1.2       一般拉丁方的定义 ……………………………………………………………… 6
2.2       正交拉丁方的探讨 …………………………………………………………………… 6
2.2.1       正交拉丁方定义的得出与应用 ………………………………………………… 6
2.2.2       正交拉丁方的性质 ……………………………………………………………… 8
2.3       完备拉丁方的定义与性质 …………………………………………………………… 9
2.4       相关于拉丁方的数论领域知识分析 ………………………………………………… 10
2.4.1       数论的现状 ……………………………………………………………………… 10
2.4.2       重要性质定理 …………………………………………………………………… 10
2.4.3       域的概念 ………………………………………………………………………… 11
2.5       最佳拉丁方的入门 …………………………………………………………………… 13
2.5.1       最佳拉丁方问题的提出 ………………………………………………………… 13
2.5.2       最佳拉丁方存在性公式透析 …………………………………………………… 13
2.6       二维方块染色问题与对应最佳拉丁方存在构造的深入研究 ……………………… 14
2.6.1       二维方块染色问题的提出及其相关规定 ……………………………………… 14
2.6.2       1 到 7阶方块染色的分析与对应最佳拉丁方的存在构造 …………………… 15
2.6.3       一种二维最佳拉丁方构造方法 ………………………………………………… 21
2.7       三维立体方块染色问题的深入研究与对应最佳立体拉丁方的思考 ……………… 22
2.7.1       三维立体拉丁方 ………………………………………………………………… 22
2.7.2       三维立体拉丁方的具体构造方法 ……………………………………………… 23
2.7.3       三维染色问题的提出及其相关规定 …………………………………………… 29
2.7.4       1 到 5阶立体方块染色分析与对应最佳立体拉丁方的思考 ………………… 31
 
第三章       染色及其对应最佳拉丁方分析的计算机算法实现 ……………………………… 34
3.1       二维方块染色分析计算机实现   …………………………………………………… 34
3.2       三维方块染色分析计算机实现 ……………………………………………………… 37
3.3       二维或三维方块子元素相关性分析计算机实现 …………………………………… 42
3.4       一种二维最佳拉丁方构造方法计算机实现 ………………………………………… 47
3.5       广义三维立体拉丁方的构造算法实现 ……………………………………………… 49
 
第四章       结论总结 …………………………………………………………………………… 51
 
致谢 …………………………………………………………………………………………… 52
参考文献 ……………………………………………………………………………………… 53
 
附录 …………………………………………………………………………………………… 54


==================================================================================================

   
本文从幻方和拉丁方的起源与简易应用入手,对正交拉丁方与完备拉丁方构造的初步探讨和最佳拉丁方的引入。然后就王建中提出的染色问题与最佳拉丁方存在性的联系,在其对3,4,6阶方块染色问题过程与对应的最佳拉丁方不存在的具体化的基础上补充了5阶方块的染色的具体过程和对应的最佳拉丁方存在,并且由7阶方块推出了矛盾,即7阶最佳拉丁方存在但是7种颜色无法染色。随后设计了一个最佳拉丁方的构造方法。平面的拉丁方问题成熟后,自然过渡到三维空间,在加工拉丁方试验使之应用到三维空间的基础上把拉丁方定义推广至广义三维立体空间,并导出一种基于副斜线的n阶广义三维拉丁立方的构造方法并发现了新规律,即按此法构造的三维拉丁立方的第i行,j列,k层的元素为i,j,k之和(Jn内计算)。随后通过修改补充二维方块染色问题中的相关规约引理把平面上的染色问题拓展到三维立体空间,并且对一至五阶三维立体方块染色问题进行了细致研究,最后提出了广义立体空间上的最佳拉丁方存在性问题的一些初步的看法和思考。在研究以上问题中利用了C语言实现相关算法帮助分析并记录在文本之中。
 
 
关键词:拉丁方;最佳拉丁方;染色;广义三维立体拉丁方;广义三维立体最佳拉丁方
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Abstract
In this paper the author begins the topic with the origin of the Magic Square and Latin Square, and carries out the initial discussion of the Orthogonal Latin Square when introduces the Perfect Latin Square. Next, according to the relation between the Dye Issue and existence of the Optimal Latin Square and the specific utility in 3,4,6 order squares worked out by Wang-JianZhong,the author complement the 5,7 order squares’ specific utility and prove the fact Wang-JianZhong’s way is not suitable for the square of 7 order on the base that 7 order Optimal Latin Square exists but 7 sorts of colors can’t dye 7 order square. What’s more a method how to construct an Optimal Latin Square is designed. After the ripe idea of the Latin Square in two-dimensional space, the question is naturally extended to the three-dimensional space. So the Latin Square experiment is improved in order to suit three-dimensional space. Meantime the definition of Latin Square is spread to the extensive three-dimensional space and a method how to construct a Three-Dimensional Latin Cube of order n on the base of the deputy diagonal lines is worked out, in which a new regular pattern, that is, these Three-Dimensional Latin Cubes’ element on the ith row, jth column and kth layer constructed by the method above is the sum of i, j and k(in Jn), is discovered Afterward the author extends the Dye Issue to the three-dimensional cube by amend and complement the relevant rules as well as lemmas, and analyzes the cube of order 1~5 carefully. Finally the author gives some elementary opinions and suppositions of Optimal Latin Cube’s existence in three-dimensional space. The relevant arithmetic which can help the analyses of the discussion all above realized in C programming language is also recorded in this paper. 
 
 
Keyword: Latin Square; Optimal Latin Square; Dye; Extensive Three-Dimensional Latin Cube; Extensive Three-Dimensional Optimal Latin cube  
=================================================================================================
第一章   引言
1.1    拉丁方的起源
 
数学产生于人类生产实践。同时几乎所有的数学分文的产生与游戏或多或少地有着联系。组合数学与概率论相似,它们产生的历史与一些奇特的事情相关。概率论源于赌博问题,组合数学源于数学游戏。组合数学早期研究的内容是对象的安排数,及符合特定条件的安排是否存在。
    一些著名的难题可以上溯几百年,一门学科既依赖于自身(有许多富有挑战性的难题,几代人努力尚未攻克),又与其他学科密切相关(其他学科对他提出新问题,征求解法),从这两层意义上看,组合数学比其他数学分支更得天独厚,尤其在电子计算机日益广泛渗入各领域的时代更是如此。电子计算机普及和发展,不仅用到数值计算的各种算法,而且还大量地用到非数值计算的算法 — 主要是组合算法。而设计与分析组合算法的基础就是组合数学。此外,管理科学、信息科学、人工智能、生命科学甚至人文学科中许多问题的求解也借助并促进了组合数学。而拉丁方是组合数学里的一个子课题,它主要应用于区组设计方面,西方人最早提出了拉丁方一词,实际上在我国早就有了拉丁方的记载,下面就来简单的谈谈它的脉络。
周易》是我国古代的一本讲卜筮的书。是中国古代所谓《五经》之一,是封建社会学校教育的法定教科书,也是汉代以来中国二千多年封建社会维系封建宗法制度的理论基础。对中国古代文化思想产生了重大影响。
《周易》其著者己不可考,相传是伏羲、文王、孔丘所作。但这只是推测,实不尽可靠。
在《周易·系辞上》记载“河出图,洛出书,圣人则(效法)之”,但没有说明“河图、洛书”是什么意思。后人凭想象编造出许多神话,说“河出图”是河里跳出一匹“龙马”,背着一幅图,而“洛出水”是从洛水里爬出一支龟,背着书。到了宋朝,有人将“河出图,洛出水”与“九宫”联系起来。“九宫”是一种“纵横图”,西方人叫幻方(magic square).中国古代著作《大戴礼记》、《明堂》有“二,九,492357816四,七,五,三,六,一,八的记载。徐岳《数术记遗》中有“九宫算”,如图1-1
                                    图1-1
中国古代几百年来,许多重要数学著作都宣扬数起源于“河图、洛书”的错误论点,如宋代《数书九章》、明代《算法统宗》及清代《数理精蕴》等。直到清乾隆年间《增删算法统宗》才删去河图、洛书之类神话。在世界上,十五世纪(我十四世纪)之初,拜占庭的摩索普拉斯将东方的纵横图首先介绍到欧州去。
纵横图开始时纯粹是一种数学游戏,在今天小学算术课本中出现过这种图形。但近代研究发现纵横图和组合分析有某种关系。它在图论、程序设计、组合分析等方面都有广泛应用。
在欧州,纵横图又叫幻方,开始时是在宫庭中的一种数学游戏。幻方是所谓拉丁方(latin square)的进一步演变发展产物。所谓“拉丁方”是这样定义的。定义:设S是一个含有n
注:为了突出重要性,本文中意义重大的定义、问题、定理、性质、规定等标题都用粗体纂写。
个元素的集合。那么一个以S为基的n阶拉丁方L=(lij)是S中元素排列成一个n×n方阵。每行(或每列)中的每个元素都不相同。例如,以S={1,2,3}为基的3阶拉丁方:
 
图1-2
这是一个最为基本的一般拉丁方,随着学科的发展,应用的需要,各种广义上的拉丁方被相继提出。
 
1.2         简易拉丁方的应用
 
拉丁方应用的价值是很可观的,很多科学的试验都会利用到拉丁方。比如说一种新型的工厂防酸材料被研制出来,现要用它对三种工厂常用的酸性物质进行测试,那么可以取一块正方形的此种材料,为了让试验准确地反映材料对三种酸的抗酸性,较为合理的科学方案应该把正方形材料划分成3×3方块,三种酸用1,2,3来代替,试验方案可以设计成如图1-2的样子,这样,试验结果就会较平均而客观。
以上都是一些初步的介绍,下面我们将进入第二章,对拉丁方及广义上的拉丁方的构造和应用进行详细的研究。
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
第二章   广义拉丁方的构造和应用研究
2.1       拉丁方的探讨
2.1.1       拉丁方问题的产生意义与应用
 
设有一块地用做某一作物的 A,B,C 三种不同品种的试验田。若该地划分成如图2-1的(a),(b),则可能由于自然条件的差异,使试验不准确,较合理的试验方案如图2-2,其特点是每行、每列都有一个A,B,C。
 

A
B
C
A B C
(a)                                   (b)
                   图 2-1
A    B    C
C    A    B
B    C    A
                 图 2-2

又如治某种病的六种药 d1,d2,d3,d4,d5,d6 给六位病人进行试验,疗程为一星期。若采用表2-1 最简单的方案,其缺点是后服的药的疗效可能要好一些,因为前面服过的药已起作用。如若改为每人在六种中只服一种药,同样也存在缺点。可能有的药对某些病人有效,对另一些病人却无效。
表 2-1
             星期
                            
M1
D1
D2
D3
D4
D5
D6
M2
D1
D2
D3
D4
D5
D6
M3
D1
D2
D3
D4
D5
D6
M4
D1
D2
D3
D4
D5
D6
M5
D1
D2
D3
D4
D5
D6
M6
D1
D2
D3
D4
D5
D6
 
理想的方案是在这6天中每人都对这6种药进行试验,每天都有这6种药对六个人进行试验,而不是要么同一天里只做一种药的试验,要么一个人只对一种药做试验。自然导致构造一个6×6 的矩阵,可以把以上的讨论推广到由元素1,2,3,….,n构成的n×n方阵(aij)n×n,要求每行,每列中1,2,3,….,n各出现一次。这样的方阵就叫做拉丁方。
 
 

1   2   3   4   5   6
6   1   2   3   4   5
5   6   1   2   3   4
4   5   6   1   2   3
3   4   5   6   1   2
2   3   4   5   6   1

                                 图2-3
 
如图2-3所示的方案就是比较高效的拉丁方方案(其中6个阿拉伯数字对应的就是6种不同的药)。
 
2.1.2 一般拉丁方的定义
定义2.1:n个不同的符号,通常就取整数1,2,….,n。在一个n×n的数组中,这n个整数中的每一个数在每一行恰好只出现了一次,并且在每一列中也只出现了一次,这n阶方块就称之为n阶拉丁方。
 
2.2       正交拉丁方的探讨
2.2.1       正交拉丁方定义的得出与应用
 
但在科学实验中,一个过程往往是由许多因素互相配合又互相制约产生整体效应的。如开始我所提到的作物试验问题来看,其生长条件还可以具体化为试验田的土壤颗粒的程度,酸碱度,日照,肥料等因素。药品试验也可能是很多种药搭配来测试疗效,还可能考虑到用药的药量以及其它增效与禁忌药物等诸多因素。这就引入了正交拉丁方的概念。
著名的数学家Euler在1782年提出并猜测了一个有名的“36军官问题”:有36名军官,恰好来自6个不同的军团并带有6种不同的军衔;每个军团的6名军官恰好分占6种不同军衔。现问:36 名军官排成6×6方阵,使每行以及每列的6名军官既来自于不同的军团,又具有不同的军衔,这能办到吗?
数学家们已经证实了这个问题的不存在性,这里只是为了引入正交拉丁方,所以36军官问题的证明过程我就不再累述。现如果我们把“36军官问题”按同样的意义缩小为“9军官问题”:如有9名军官,分别来自陆海空3个军种,每个军种恰有将校尉3种军衔,问:可否排成3×3方阵,使每行与每列的3名军官既来自不同的军种,又具有不同的军衔级别?
其实,把两个3阶拉丁方迭置成每个元素都是有序数偶的3×3数组,这数偶的第一分量i取自第1个拉丁方,第二的分量j取自第二个拉丁方,即有如下形式:
 
1   2   3                       3   2   1
2   3   1       ( 迭置 )      2   3   1
3   1   2           ||           1   2   3
                                 ||

                                
(1,3) (2,1) (3,2)
 
(2,2) (3,3) (1,1)
 
(3,1) (1,2) (2,3)
         
 
                 

 
 
 
 
 
 

                 (陆,尉) (海,将) (空,校)
                 (海,校) (空,尉) (陆,将)
                 (空,将) (陆,校) (海,尉)
 
图2-4
 
其中每项(i,j),i = 1,2,3,对应于陆,海,空,j = 1,2,3,对应于将,校,尉。不难验证每行每列恰有3个军种也恰有3个军衔,这就排成了9军官问题”的解答。
定义2.2:设A = (aij),B = (bij)是两个n阶拉丁方,如迭置后的n平方个有序偶对(aij,bij)全都为互异,则拉丁方A和B就称为正交的。
并非任意两个同阶拉丁方都可正交。如迭置下面两个3阶拉丁方即不正交。
 
      3   2   1         1   3   2       (3,1) (2,3) (1,2)
      2   1   3 ( ,) 3   2   1       (2,3) (1,2) (3,1)
      1   3   2         2   1   3       (1,2) (3,1) (2,3)
                              
图2-5
 
正交拉定方的实用性比单个拉丁方更优越,它能用于2个以上的因素的试验设计问题中。例如设在某次拉力赛中试验赛车轮胎的磨损情况,现有4种牌号的轮胎:1,2,3,4。一般来说后轮与前轮磨损是不一样的(主动轮与被动轮的差别),左侧与右侧也不一样。为消除车轮位置的偏差要求在使用A,B,C,D 四辆车的情况下(尽量使用较少的车又能客观的反应磨损情况),使每种牌子的车胎恰好用在每辆车上一次,且在每个位置上一次。可按表2-2进行试验。
 
表2-2(第i 行、第j 列的元素表示车胎的牌号)车胎磨损的一个拉丁方A试验设计
 
A号车
B号车
C号车
D号车
左前轮
1
2
3
4
右前轮
2
1
4
3
左后轮
3
4
1
2
右后轮
4
3
2
1
 
如在上例的基础上,还要加如4种牌号的刹车闸垫对轮胎的磨损的影响。一位缺乏科学知识的人会让A号车全部用1号刹车闸垫;B号车全部用2号刹车闸垫;C号车全部用3号刹车闸垫;D号车全部用4号刹车闸垫;这显然不合理。因为车辆的差异淹没了刹车闸垫对磨损的真实影响。为此要求用拉丁方来设计刹车闸垫试验,并且要求与轮胎的设计“配合”的不重复。也就是找出两种拉丁方设计,A =(aij)和B = (bij)。A拉丁方试验4种牌子的车胎,B拉丁方试验4种牌子的刹车闸垫。并且使有序对(aij,bij )(i = 1,2,3,4;j = 1,2,3,4)都不相同。不妨取A拉丁方就如表2-2中的形式,B拉丁方取为表2-3中的形式。
 
表2-3 (第i 行、第j 列的元素表示刹车闸垫的牌号)刹车闸垫对车胎磨损的一个拉丁方A试验设计
 
A号车
B号车
C号车
D号车
左前轮
4
1
2
3
右前轮
3
2
1
4
左后轮
1
4
3
2
右后轮
2
3
4
1
 
这样既要顾及轮胎牌子,又要顾及刹车闸垫牌子的有关轮胎磨损综合效果组合试验设计就取为A 和B 的迭置,也就是两个互相正交的拉丁方迭置。
如表2-4
 
表2-4 (第i 行、第j 列的元素(aij,bij)是车胎牌号aij和刹车闸垫牌号bij组成的有序偶对)
           为试验4种不同牌号的车胎和4种不同牌号的刹车闸垫对轮胎磨损组合设计
 
A号车
B号车
C号车
D号车
左前轮
(1,4
(2,1
(3,2
(4,3
右前轮
(2,3
(1,2
(4,1
(3,4
左后轮
(3,1
(4,4
(1,3
(2,2
右后轮
(4,2
(3,3
(2,4
(1,1
 
由此可见,为了设计出科学、经济的试验设计方案,正交拉丁方占有着举足轻重的的地位。下面介绍一下正交拉丁方的一条重要性质:
 
2.2.2       正交拉丁方的性质
 
定理2.1:互相正交的n 阶拉丁方的个数不超过n – 1 个,即若 A1,A2,…,Ak 是两两正交的n阶拉丁方,则k≤n – 1 。
证明:设a1,a2 ,…,an 是1,2,…,n的一个排列, =  l = 1,2,…..,k。若对A1作如下的置换  1    2    … n
                                      a1   a2    ... an
        
得一方阵  n×n 下面证与A2 ,…,Ak 正交,如若不然,不妨设不与A2 正交,则中至少有一对数偶出现的次数超过1次。设该对数偶为()在上式中出现不只一次,说明数偶()在中出现的次数超过一次,这跟A1和A2 互相正交的假定矛盾。这就证明了可以对拉丁方A1 做任一置换                      
     1    2    … n
                                  a1   a2    ... an
 
得另一拉丁方  以取代 ,不改变,,……的相互正交性。,,……,也有类似的性质。根据这个道理,不妨假定,,……,的第一行都是(1 2…n)。任取1≤l<m≤k,则方阵的第一行都是((1,1)(2,2)…(n,n))。“1”不能在第一列中重复出现,故,,……,的第二列元素没有一个取“1”这个数的,而且各不相同。如若不然,则中的书;偶(d,d)至少出现两次:一次是在第一行第d列,一次是在第二行第1列,这与Al与Am互相正交的假定相矛盾。由于,,……,的第2行第1列元素不为1而互不相同,只能分别取2,3,…,n中的1个数,故k≤n – 1。
 
2.3       完备拉丁方的定义与性质
 
在拉丁方试验设计中,有时根据试验的需求,需要所用的拉丁方具有一些特殊的性质。例如,在把一块农田分成若干纵横小块做试验且根据一个拉丁方来安排试验时,相邻的二小块的安排之间彼此是有影响的,因而希望每一对可能的安排在所用的拉丁方的相邻位置上出现一次。又如,养鸡场关于饲料对鸡的长势的试验且采用一个拉丁方来安排试验时,接连使用的二种饲料彼此是有影响的,因而也希望每两种不同饲料在所用的拉丁方中都能以不同的次序接连出现一次。这就引出了一类特殊的拉丁方。下面就给出正式的定义。
定义2.3:设A = (aij)是集 S ={ a1,a2,……,am,} 上的一个m阶拉丁方。如果S的每一个有序相异元素偶都在A的行中至少一次出现为相邻(依有序对中的顺序)的一对,则称A是一个行完备拉丁方,又称为水平完备拉丁方。如果在上面的定义中把“行”换为“列”,则称A是一个列完备拉丁方,又称为竖直完备拉丁方。如果A既是行完备拉丁方,又是列完备拉丁方,则称之为一个完备拉丁方。
一个元的相邻元根据其位置可以叫做右邻元、左邻元、上邻元、下邻元。
由此定义,有
引理2.1:在定义2.3中做下述更动,并不影响A的行完备性:
把“S的每一个有序相异元素偶都在A行中至少一次出现为相邻的一对”改为“S的每一个有序相异元素偶都在A的行中至多一次出现为相邻的一对”,或者改为“S的每一个有序相异元素偶都在A的行中恰好一次出现为相邻的一对”。
证明:S 的有序相异元素偶的个数为
                         m(m —1)
A 的每一行的有序相异元素偶的个数是m – 1,A的诸行的相邻元素偶的个数是m(m —1),因此,S的每一相异元素偶在A的诸行中至少一次出现为相邻元素的充要条件是,S的每一相异元素偶在A的诸行中至多出现一次为相邻元素。
对列完备拉丁方有类似的结果。在引理2.1中把“行”换成“列”,引理的结论仍成立。
引理2.2:对一个拉丁方施行行换序并不改变它是否为行完备拉丁方;对一个拉丁方施行列换序并不改变它是否为列完备拉丁方。
证明:这是定义2.3的直接推论。
 
2.4       相关于拉丁方的数论领域知识分析
 
拉丁方尤其是本文下续的最佳拉丁方的构造研究与数论是紧密相连的,可以说数论的发展直接影响到拉丁方分支,它们的元素的构造直接运用到数论里的(剩余系(环)、域、计算表等)基本知识,以下就讨论一些基本的数论知识。
 
2.4.1 数论的现状
 
数论是主要研究整数性质的一门古老的学科。由于数论立题新颖、寓意深奥、耐人思索,吸引了古今中外许多具有数学天才和有数学灵感的人们投身于数论的研究,并获得了辉煌的成就。公元前3世纪,古希腊数学家欧几里德(Euclid)证明了素数是无穷的,并给出了求两个正整数的最大公因式的辗转相除算法。我国古代的《孙子算法》中给出了求解一次同余式组的算法,即著名的孙子定理,国外誉为中国剩余定理。从17世纪到19世纪,法国数学家费马(P.de Fermat)、瑞士数学家欧拉(L.Euler)、法国数学家勒让德(A.M.Legendre)和德国数学家高斯(C.F.Gauss)等人的工作都大大发展和丰富了数论的内容。我国从20世纪30年代开始,特别在建国后,以华罗庚教授为首的一批数学家如潘承洞、王元、陈景润等,对数论进行了潜心研究,取得了优秀成果,做出了卓越的贡献。随着现代科学技术的发展,特别是计算机技术的发展,使得这门古老学科又焕发了青春,数论中的一些难题取得了新进展和新突破,并在计算机科学、组合数学、代数编码、密码学和计算方法等领域得到了卓有成效的应用。
 
2.4.2       重要性质定理
 
1. 素数和数的互素除数(因子)的概念:
设z为有全体整数而构成的集合,若 b≠0且            
使得a=mb,此时称b整除a.记为b∣a,还称b为a的除数(因子).  
 
2. 算术基本定理:任何一个不等于0的正整数a都可以写成唯一的表达式a=P1α1P2α2…Ptαt,这里P1>P2>P3…>Pt是素数,其中αi>0  
最大公约数: 若a,b,c∈z,如果c∣a,c∣b,称c是a和b的公约数。正 整数d称为a和b的最大公约数,如果它满足 d是a和b的公约数。 对a和b的任何一个公约数c有c∣d。 注:1*. 等价的定义形式是: gcd(a,b)=max{k∣k∣a,k∣b} 若gcd(a,b)=1,称a与b是互素的。全体整数而构成的集合对整数的加法和乘法的两种运算 是封闭的且满足算术运算的所有定律,此时我们称整数 集合z为整数环。整数环z对除法运算不封闭。
 
3.带余除法:
"a∈z,>0,可找出两个唯一确定的整数q和r,
使a=qm+r, 0<=r< m,q和r这两个数分别称为以m去除a所得到的商数和余数。 (若r=0则m∣a) 整数同余式和同余方程:定义(同余)称整数a模正整数m同余于整数b,并写a≡b(mod m)是指m∣a-b, m称为模数。
注:1*.m∣a-bóa=q1m+r,b=q2m+r即a和b分别 除以m有相同的余数。“同余”二字的来源就在于此。
 
4.相对于某个固定模数m的同余关系,是整数间的一种等价关系。具有等价关系的三点基本性质:自反性:对任意整数a有a≡a(modm)对称性:如果a≡b(modm)则b≡a(modm)    传递性:如果a≡b (modm)b≡c(modm)则a≡c(modm) 于是,全体整数集合z可按(m>1)分成一些两两不交的等价类。
 
5.整数模m同余类共有m个,他们分别为mk+0,mk+1, mk+2,…mk+(m-1); k∈z,每一个算类,每一类都可以选一个代表元,一般选这一类中的最小的非负整数。于是称[0],[1],[2],…[m-1]为标准完全剩余系。Z模12的标准剩余系为:[0],[1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11]
对于某个固定模m的同余式可以象普通的等式那样相加相减和相乘: (1)a(mod m)±b(mod m)=(a±b)(mod m) (2)a(mod m)*b(mod m)=a*b(mod m)
例子.通过同余式演算证明560-1是56的倍数,223-1是47的倍数。 解:注意53=125≡13(mod56) 于是有56≡169≡1(mod56)   对同余式的两边同时升到10次幂,即有56∣560-1。其次, 注意26=64≡-30(mod47), 于是 223=(26)3·25=(26·26)26·25 ≡900*(-30)*(32) mod(47) ≡(7)(-30)*(32) (mod47) ≡1(mod47) 于是有 47∣223-1 定理:(消去率)对于ab≡ac(mod m)来说,若(a,m)=1则b≡c(mod m)
 
6.一次同余方程ax≡b(mod m)这个方程有没有解,相当于问有没有那样一个整数x,使得对于某个整数y来说,有ax+my=b    定理:如记(a,m)=d,则同余方程ax≡b(mod m)有解的充分必要条件是d∣b。当这个条件满足时,恰有d个模m同余类中的整数是上述方程的解。证明:略。(从ax+my=b入手)
 
7.整数环z模正整数m得到的剩余类集合可以记为zm(或z/(m)) zm={[0],[1],…,[m-1]}    在4中已说明zm对剩余类的加法,乘法是封闭的,可列出它们的加乘表。(见书214页)。我们称为zm为剩余类环(或同余类环)
 
8.在整数环z中是没有零因子的,即两个非零整数的乘积一定不等于0,但是剩余环则不然。例z12中:[3]*[4]=[12]=[0]    说明,zm中的元素可分为两类,一类是零因子,即若α∈zm,α≠[0]存在β∈zm且β≠[0],有α*β=[0],称α,β都为zm中的零因子。另一类是可逆元,即若α∈zm,存在β∈zm使α*β=[1],此时α,β互为各自的逆元,记α-1=β;β-1=α 定理:剩余类环zm中元素α=[a]为zm的可逆元ó(a,m)=1 要证明这个定理,只需证明下列引理: 引理:任意两个整数a和b都有一个最大公约数,这样一个最大公约数d可以表示成a,b二数关于整系数的线性组合,即有s,t∈z,使d=sa+tb。 证明:不妨设b>0,用辗转相除法,先用b去除a,得a=q1b+r1,0<=r1<b; (1) 如果r1=0,停止,否则再用r1去除b,得 b=q2r1+r2,0<=r2<r1; (2) 如果r2=0,停止,否则再用r2去除r1,得          r1=q3r2+r3;0<=r3<r2;(3)等等,这样一直进行下去,可得一系列关系式:   rk-3=qk-1rk-2+rk-1,0<=rk-1<rk-2; (k-1)  rk-2=qkrk-1+rk,0<=rk<rk-1; (k)
 
2.4.3       域的概念
 
定义:F是至少含有两个元素的集合,对F的元素定义有“+”和“.”两种运算,并满足以下F1,F2,F3三个条件的代数系统<F+.>称为域。
F1:F的元素关于“+”运算成交换群,设其单位元素为0。
F2:F\{0}的元素关于“.”运算成交换群。
F3:分配律成立,即对于a,b,c∈F有
                     a.(b+c)=a.b+a.c
          (b+c).a=b.a+c.a
例:实数的全体、复数的全体关于通常的加法、乘法都是域,分别称为实数域和复数域。
F集合的元素除去元素0以外关于乘法成交换群,其单位元素用1表示。在不引起混乱的情况下就用0和1分别表示F关于“+”,和F\{0}关于“.”运算构成的交换群的单位元素。
集合F的元素个数是有限个时,称为有限域。若p是素数,则F={0,1,2,...,p-1}在mod p的意义下关于乘法“.”加法“+”成域。
所谓mod p意义下相等,指的是a = b mod p,即a-b=sp。F 关于加法运算构成交换群,容易给予证明。要证明{1,2,...,p-1}关于乘法成交换群,只要证明属于集合中的任一元素a存在逆元素就可以了。由于p是素数,a和p的公因子为1,故唯一地存在整数b和c使得
ab + pc = 1
 
所以
                  ab = 1   mod p
        
                   +   0   1   2   3   4
 

                   0   0   1   2   3   4
                   1   1   2   3   4   0
                   2   2   3   4   0   1
                   3   3   4   0   1   2
                   4   4   0   1   2   3
                           图2-6
b就是a的逆元素。
                   . 1   2   3   4
 

                   1   1   2   3   4
                   2   2   4   1   3
                   3   3   1   4   2
                   4   4   3   2   1
                           图2-7
上例验证了p = 5时,F= {0,1,2,3,4 } 在mod 5 的意义下关于“.”,“+”运算成域。然而p不为素数时则不然,这只要从下面的例子就可以看出。p = 6 时就有
                   +   0   1   2   3   4   5
 

                   0   0   1   2   3   4   5
                   1   1   2   3   4   5   0
                   2   2   3   4   5   0   1
                   3   3   4   5   0   1   2
                   4   4   5   0   1   2   3
                   5   5   0   1   2   3   4   
                             图2-8
 
 
                   . 1   2   3   4   5
 

                   1   1   2   3   4   5
                   2   2   4   0   2   4  
                   3   3   0   3   0   3
                   4   4   2   0   4   2
                   5   5   4   3   2   1
                             图2-9
2.5              最佳拉丁方的入门
2.5.1 最佳拉丁方问题的提出
 
透过以上的这一些一般的拉丁方(基本都是要求行列中每个元素不同),它们的实用价值是很高的。从广义上我们还可以构想出一种更加特殊的拉丁方,比如就说开始2.3中那个要根据一个拉丁方来安排试验的饲料试验,再加一个限制条件,彼此二饲料有影响且要求斜方向相邻的二饲料不能相同,出于要使斜方向与横竖方向标准一样,还要每一斜方向(包含n个元素的平行于拉丁方主对角线或斜对角线的一条连接斜线,其中n为拉丁方的阶数)涵盖所有的待测饲料,如果存在这样的广义方,就按它来安排试验。这样的拉丁方是n阶拉丁方族里的最佳者。下面给出具体的定义。
定义2.4模n的剩余环(Rn,⊙, )
Rn={0,1,2,…,n-1}
在不致产生混淆时,即以Rn表(Rn,⊙, )
以Rn的元构成的拉丁方如果在每条斜线上都全部出现,就称之为最佳拉丁方,平行于主对角线的斜线叫主斜线,平行于副对角线的斜线叫副斜线。图1是一个最佳拉丁方,(2,0,3,1,4)是一条主斜线,把拉丁方右移过来,便可将主斜线联成一条,在一个拉丁方内它是被截成两段的,同样(1,2,3,4,0)是一条副斜线。
 
图2-10
 
2.5.2       最佳拉丁方存在性公式透析
 
在拉丁方内任取一元x,如果它右边紧邻的元都是x⊙h,便称这个拉丁方的右进间距为h,如果x的下方紧邻的元都是x⊙K,便称这个拉丁方的下移间距为K。当右进间距为h时,其左进间距为-h,对n阶拉丁方而言,就是n-h,沿主斜线方向,x的下一元的x⊙K⊙h,便说主斜间距为K⊙h,同样可说副斜间距为K⊙n-h,亦即K-h。右进间距为h,下移间距为K的拉丁方记为Lhk,图2-10的拉丁方是个L12,图2-11(a)表Lhk,(b)表L12。
图2-11
 
引理2.3 若(n,K)=1,则当x遍历Rn时,Kx也遍历Rn。
引理2.4 若(n,K)=g≠1,则当x遍历Rn时,Kx只能遍历Rn的一个子集,重复g次。例如,n=15,K=4,(n,K)=1,
有x=0,1,2,3,4,5,6,7,8,9,10,11,12,13,14.
4x=0,4,8,12,1,5,9,13,2,6,10,14,3,7,11.又
若K=6,(n,K)=3,
有x=0,1,2,3,4,5,6,7,8,9,10,11,12,13,14.
6x=0,6,12,3,9;0,6,12,3,9;0,6,12,3,9.
定理2.2 若(n,2)≠1,则n阶拉丁方中无最佳者。
证明 n既为偶数,则h,K只能为苛,于是K⊙h为偶,由引理2,Rh的元不能在主斜线上
全部出现,故Lhk非最佳。
定理2.3 若(n,3)≠1,则n阶拉丁方中无最佳者。
证明 n既为3的倍数,则只能有h=3P+i(i=1或2),K=3q+j(j=1或2),于是
K⊙h=3  (P⊙q)- (i+j),K-h=3⊙(q-P) ⊙ (j-i)
若i=j,则K-h为3的倍数,若i≠j,则K⊙h为3的倍数,由引理2,Rh的元总会在某种
斜线上不能全部出现,故Lhk非最佳。
定理2.4 如果(n,h)=(n,K)=(n,K⊙h)=(n,K-h)=1,则Lhk是个最佳拉丁方。
证明 因这时Rn的元在各行、各列、各斜线上都全部出现。
理解了最佳拉丁方存在性的条件,下面将进入近一步探讨。
 
2.6              二维方块染色问题与对应最佳拉丁方存在构造的深入研究
2.6.1       二维方块染色问题的提出及其相关规定
 
问题2.1:在二维平面内,把一个由n×n个小格构成的方块染色,使得同行、同列以及同斜线的小格颜色不相同,最少需要多少种颜色。当且仅当染色后,同行、同列、同斜线的各小格颜色不同时,才称之为“染色”,因此问题可以简化为“方块染色,最少要多少种颜色?”。按逻辑说,起码是要n种颜色的,如果存在n阶最佳拉丁方,就只要n种颜色。
定义2.5:方块中若干小格,如果有两个小格同行、同列、同斜线。则称为相关;否则称为无关。
规定2.1:矩阵中方块的序号:方块中的行序号,自上而下,依次为0,1,2,...,n-1;列序号自左至右依次为0,1,2,...,n-1;平行于主对角线的斜线称为主斜线,其序号的规定为 主对角线是0,此外自上而下依次为1,2,...,n-1;平行于副对角线的斜线称为副斜线,其序号规定为副对角线是0,此外自上而下依次是1,2,...,n-1;。我用a表示某小方格的行序号,b表示列序号,h表示主斜线序号,k表示副斜线序号,则每个小方格都有一个序号数组S =(a,b,h,k )。Jn = ({0,1,2,...,n-1},+,.)表模n的剩余环,于是a∈Jn ,b∈Jn,h∈Jn,k∈Jn。并且对a,b,h,k进行的运算,全在Jn内进行。
则相关问题即是两格的S中有不少于一个元素相等,则相关,否则无关。
例如:在如下一个3×3的方阵中, 

 A     B     C
 
D     E     F
 
G     H     I
 

 
 
 
 
 
                                   图2-12
 
F小格在第1行,第2列,主斜线为2,副斜线为1。即其序号数组 S = (1,2,2,1)
G小格在第2行,第0列,主斜线为2,副斜线为0。即其序号数组 S = (2,0,2,1)
F与G小格的S中有h都等于2,即同一主斜线,则F与G小格相关。
引理2.5:h = a-b, k = a+b+1.(显然)
这里的运算,可以直接用域概念里的加法表来实现。
把各行的行序号a 加上整数e,(e∈Jn),然后按行序号0,1,2,...,n-1顺序将行重新排列,这样的变换称为行变换。同样也可以对列这样进行列变换。
引理2.6:对方块(矩阵)进行行、列变换,不改变方块内的各小格的相关性。
证:显然同一行,同一列内的格子不变。由h = a+b, k = a+b+1,同一主斜线上的格子不变,因为都由h变成了h’,同理,同一副斜线上的格子,都由k变成了k’。即同一斜线上的格子也不变,引理2.6得证。
有了以上的概念、规定、和引理,下面就可以开始研究“染色”问题了。
图表规则(用三角形“△”表示选定的做相关参考的方块,用“×”表示与选定的做相关参考的方块有关的方块,用其它英文字母表示与选定的做相关参考的方块无关的方块。)
 
2.6.2 1 到 7阶方块染色的分析与对应最佳拉丁方的存在构造
 
I.          先来看2×2方块:
 

           ×
×   ×
1               2
3    4

                     图2-13                          图2-14
 
很明显,4个小方格都是两两相关,所以对它染色任两格不能同色,要4种颜色,如图2-13与图2-14我们用1,2,3,4表示,所以不存在2×2阶最佳拉丁方。
II.       对于3×3方块:
由引理2.5和引理2.6在3×3方块任意一个格子都可以经过行、列变换,变换到第0行第0列,而不改变方块各个格子的相关性。所以不妨取第0行、第0列那个格子,并划去与之相关的格子,剩下的格子如图2-15,即没有剩下一格,也就意味着3×3方块任意2格相关,所以对它染色任2格不能同色,要9种颜色。如图2-16。

   ×   ×
×   ×   ×
×   ×   ×
 
 
 
 
1    2     3
4    5     6
7    8     9
 
 
 
 

          图2-15                                             图2-16
 
所以不存在3阶最佳拉丁方。
III.     对于4×4方块:
 
由引理2.5和引理2.6在4×4方块任意一个格子都可以经过行、列变换,变换到第0行第0列,而不改变方块各个格子的相关性。所以不妨取第0行、第0列那个格子,并划去与之相关的格子,剩下各小格如图2-17,记为A1,A2,A3,A4。显然A1,A2,A3,A4两两相关,因而至多只能取1格,即4×4方块,任意3格相关。所以对它染色时,同颜色的小格最多只能有2格,所以最少需要4×4/2 = 8种颜色(我们用1,2,3,4,5,6,7,8表示),如图2-18。

   ×    ×    ×
 
×   ×    A1   ×
 
×   A2    ×   A4
 
×   ×   A3    ×
1    2     3    4
 
 3    4     1    2
 
 5    6     7    8
 
 7    8     5    6

             图2-17                                           图2-18
 
所以不存在4阶最佳拉丁方。
IV.     对于5×5方块:
由引理2.5和引理2.6在5×5方块任意一个格子都可以经过行、列变换,变换到第0行第0列,而不改变方块各个格子的相关性。所以不妨取第0行、第0列那个格子,并划去与之相关的格子,剩下各小格如图2-19,A1,A2,A3,A4,B1,B2,B3,B4。
 

     ×    ×    ×    ×
 
×     ×    A1    B1   ×
 
×     A2    ×    ×    B2
 
×     B4    ×    ×    A4
 
×     ×     B3   A3    ×
 

 
 
 
 
 
 
 
 
 

                                 图2-19
 
随着方块阶数的加高,以后的各方块的相关性用肉眼来观察容易混淆,,所以不妨由引理2.5和引理2.6通过计算每一个方块的序数组S(a,,b,h,k),再由比较S来确定诸方格的相关性,(计算机算法程序附后)
A1(a12,s (1,2,4,4))与之不相关的方格为(a00 , a04 , a20 , a24 , a31 , a33 , a41 , a43)
B1(a13,s (1,3,3,0)) 与之不相关的方格为( a00 , a01 , a20 , a21 , a32 , a34 , a42 , a44)
A2(a21, s (2,1,1,4)) 与之不相关的方格为( a00 , a02 , a13 , a14 , a33 , a34 , a40 , a42)
B2(a24 , s (2,4,3,2)) 与之不相关的方格为 (a00 , a03 , a11 , a12 , a31 , a32 , a40 , a43 )   
B4(a31 ,s (3,1,2,0)) 与之不相关的方格为 ( a00 , a02 , a10 , a12 , a23 , a24 , a43 , a44)
A4(a34 , s (3,4,4,3)) 与之不相关的方格为(a00 , a03 , a10 , a13 , a21 , a22 , a41 , a42)                               
B3(a42 , s ( 4,2,2,2)) 与之不相关的方格为(a00 , a04 , a11 , a13 , a21 , a23 , a30 , a34)
A3(a43 , s (4,3,1,3)) 与之不相关的方格为 (a00 , a01 , a12 , a14 , a22 , a24 , a30 , a31)
于是在所剩A1,A2,A3,A4,B1,B2,B3,B4中可以选出一条方案使得其各不相关为
A1 (a12)----- B2(a24)----- B4(a31)----- A3(a43),再加上a00 ,一共是5个格子,也就是说有5
个格子,各不相关,所以5×5方块中任意6格相关,则在染色时最多5格同色,所以最少
需要5×5/5 = 5 种颜色(我们用1,2,3,4,5表示),如图2-20。
 

   1     2     3      4
 
3     4     5     1      2
 
1     2     3     4      5
 
4     5     1     2      3
 
2     3     4     5      1
 
 
 

 
 
 
 
 
 
 
 
 

                                  图2-20
所以存在5阶最佳拉丁方。
V.       对于6×6方块:
由引理2.5和引理2.6在6×6方块任意一个格子都可以经过行、列变换,变换到第0行第0列,而不改变方块各个格子的相关性。所以不妨取第0行、第0列那个格子,并划去与之相关的格子,剩下各小格如图2-21,(A1,A2,A3,A4),(B1,B2,B3,B4),(C1,C2,C3,C4),(D1,D2,D3,D4)。
 
 
 
 
 
 
 
 

      ×     ×     ×     ×     ×
 
×      ×     C1     A1    D1     ×
 
×      C2     ×     B1    ×      D4
 
×      A2     B2    ×     B4      A4
 
×      D2     ×     B3    ×      C4
 
×      ×     D3     A3    C3      ×
 
 
 

 
 
 
 
 
 
 
 
 
 
 
 

                                 图2-21
 
相关性(在所剩方格中)计算:
C1(a12,s(1,2,5,4))不相关于(a25, a31 , a35 , a41 , a43 , a53)
A1(a13,s(1,3,4,5))不相关于(a21 , a25 , a32 , a34 , a41 , a45 , a52 , a54)
D1(a14,s(1,4,3,0))不相关于(a21,a31,a35,a43,a45,a53)
C2(a21,s(2,1,1,4))不相关于(a13,a14,a34,a35,a52,a53)
B1(a23,s(2,3,5,0))不相关于(a31,a35,a52,a54)
D4(a25,s(2,5,3,2))不相关于(a12,a13,a31,a32,a53,a54)
A2(a31,s(3,1,2,5))不相关于(a12,a14,a23,a25,a43,a45,a52,a54)
B2(a32,s(3,2,1,0))不相关于(a13,a25,a45,a53)
B4(a32,s(3,4,5,2))不相关于(a13,a21,a41,a53)
A4(a35,s(3,5,4,3))不相关于(a12,a14,a21,a23,a41,a43,a52,a54)
D2(a41,s(4,1,3,0))不相关于(a12,a13,a34,a35,a53,a54)
B3(a43,s(4,3,1,2))不相关于(a12,a14,a31,a35)
C4(a45,s(4,5,5,4))不相关于(a13,a14,a31,a32,a52,a53)
D3(a52,s(5,2,3,2))不相关于(a13,a21,a23,a31,a35,a45)
A3(a53,s(5,3,2,3))不相关于(a12,a14,a21,a25,a32,a34,a41,a45)
C3(a54,s(5,4,1,4))不相关于(a13,a23,a25,a31,a35,a41)
于是在所剩方格里可以选出一条方案使得其各不相关为:C1(a12)-----D4(a25)-----A2(a31)
,再加上a00,一共是4个格子,也就是说有4个格子,各不相关,所以6×6方块中任意5
格相关,则在染色时最多4格同色,所以最少需要6×6/4 = 9 种颜色(我们用1,2,3,4,
5,6,7,8,9表示),如图2-22。
 
 
 
 
 
 
 
 

1     2      3      4      5      6
 
3     4      5      6      7      8
 
6     7      8      9      4      5 
 
8     9      1      2      6      7
 
 2     3      7      8      9      1
 
 4     5      9      1      2      3    
 
 
 

 
 
 
 
 
 
 
 
 
 
 
 

                                      图2-22
 
所以不存在6阶最佳拉丁方。
VI.     对于7×7方块:
在7阶拉丁方中,由引理2.5和引理2.6来制作染色,划去与a00 不相关的方格后将剩下24格,它们分别H(a12)-----I(a13)-----M(a14)-----Q(a15)-----A(a21)-----J(a23)-----N(a24)-----
U(a26)-----B(a31)-----E(a32)-----R(a35)-----V(a36)-----C(a41)-----F(a42)-----S(a45)-----W(a46)---
--D(a51)-----K(a53)-----O(a54)-----X(a56)-----G(a62)-----L(a63)-----P(a64)-----T(a65)(如图2-23)
下面以它们的S(a,b,h,k)序数组分类列出:
 
 
 

    ×    ×    ×    ×    ×    ×
 
×    ×    H     I     M    Q     ×
 
×    A     ×    J     N    ×     U
 
×    B     E     ×    ×    R     V
 
×    C     F     ×    ×    S     W
 
×    D     ×    K     O    ×    X
 
×    ×    G     L     P     T     ×
 

 
 
 
 
 
 
 
 
 
 
 
 
 
 

                                     图2-23
 
下面以它们的S(a,b,h,k)序数组分类列出:
表2-5
       格子
序数组a
 
 
 
 
1
H
I
M
Q
2
A
J
N
U
3
B
E
R
V
4
C
F
S
W
5
D
K
O
X
6
G
L
P
T
 
表2-6
       格子
序数组b
 
 
 
 
1
A
B
C
D
2
H
E
F
G
3
I
J
K
L
4
M
N
O
P
5
Q
R
S
T
6
U
V
W
X
 
表2-7
       格子
序数组h
 
 
 
 
1
A
E
O
T
2
B
F
K
P
3
Q
U
C
L
4
M
V
D
G
5
I
N
R
W
6
H
J
S
X
 
表2-8
       格子
序数组k
 
 
 
 
0
Q
N
F
D
2
G
K
R
U
3
L
O
S
V
4
H
A
P
W
5
I
B
T
X
6
M
J
E
C
 
由以上的4个表可以选出一条方案,使得其各不相关,A (a21)-----F(a42)-----I(a13)-----V(a36),再加上a00一共5格,也就是说在7×7方块中任意6格相关,所以染色时只能有5格同色,7×7/5!= 7,所以不存在7阶最佳拉丁方,但是实际上我可以对7×7方块这样染色(图2-24):
 

7     1     2     3     4     5     6
 
 5     6     7     1     2     3     4
 
 3     4     5     6     7     1     2
 
 1     2     3     4     5     6     7
 
 6     7     1     2     3     4     5
 
 4     5     6     7     1     2     3
 
 2     3     4     5     6     7     1
 

 
 
 
 
 
 
 
 
 
 
 
 
 
 

                                     图2-24
 
所以这里与由引理2.5和引理2.6推出的设计方案矛盾,所以此方案不适合7阶以上的最
佳拉丁方判定设计。
 
2.6.3       一种二维最佳拉丁方构造方法
 
鉴于前面所定义的最佳拉丁方,即要在拉丁方的每一条斜线上出现Rn中的所有元素,由于每条斜线上的元素个数与每行每列一样,都是n个,所以结合起来也就是说,如若n阶最佳拉丁方存在的话,那就是这个拉丁方的每行、每列、每条歇线上的元素均不同,那样n个元素都必须要出现。
设一个n阶拉丁方族存在最佳者,则Rn =(0,1,2,…,n-1),Jn = (Rn,+,.)那么可以从方块的第一行开始,第一列元素定为n-1,然后后面的列元素依次加1(运算在Jn内进行)直到最后一列。
然后第二行的第一列元素定为第一行第一列元素减2(运算在Jn内进行),后面的列元素依次加1(运算在Jn内进行)直到最后一列。
后面的行第一列元素依次件2(运算在Jn内进行),而此行的后列元素依然是依次加1(运算在Jn内进行)。执行上面的操作直到n行n行元素全部填满,这个拉丁方即每行、每列、每条歇线上的元素均不同,则得出一个n阶最佳拉丁方。
例如对于11阶拉丁方族:
用上面的算法,第一行元素应该是:
10...0...1...2...3...4...5...6...7...8...9
第二行元素应该是:
8...9...10...0...1...2...3...4...5...6...7
依次下去,最后得出的结果是:
 
 
 
 
10...0...1...2...3...4...5...6...7...8...9
8...9...10...0...1...2...3...4...5...6...7
6...7...8...9...10...0...1...2...3...4...5
4...5...6...7...8...9...10...0...1...2...3
2...3...4...5...6...7...8...9...10...0...1
0...1...2...3...4...5...6...7...8...9...10
9...10...0...1...2...3...4...5...6...7...8
7...8...9...10...0...1...2...3...4...5...6
5...6...7...8...9...10...0...1...2...3...4
3...4...5...6...7...8...9...10...0...1...2
1...2...3...4...5...6...7...8...9...10...0
 
 
这就是一个11阶最佳拉丁方。
 
2.7       三维立体方块染色问题的深入研究与对应最佳立体拉丁方的思考
2.7.1       三维立体拉丁方
 
在拉丁方试验中,除了平面的,也会有立体的,构想一种试验,若有一块地用做某一作物的A,B,C三种不同品种的试验田。按照2.1.1中的安排,设计方案应为图2-2,现在若考虑这种作物在一年内的不同时段里因气候条件差异而带来的影响,则此方案还应加如一个因素,即时间。那么可以这样来设计,把一年分成三个时间段,使得每个时间段内都有如2.1.1中的方案,并且每种作物在不同时间段里的试验又成拉丁方排列,综上所述,较为合理的试验方案如图2-25。

俯视
俯视
俯视
 C       A        B
 
 B       C        A
 
 A       B        C
 A       B        C
 
 C       A        B
 
 B       C        A
 B       C        A
 
 A       B        C
 
 C       A        B
第一层
第二层
第三层
图2-25

                  
图中第一层代表一年内第一时间段,第二层代表一年内第二时间段,第三层代表一年内第三时间段。右边为左边的方案的俯视图,这样一个方案组成的一个3×3×3的立体方块就是一个广义三维立体拉丁方。
它还可以用于许多实际立体问题或者是能转化成立体问题的拉丁方试验。比如一幢高楼大厦里的若干层是用于电子通讯的,要求层与层接触的房间还有相邻房间应该尽量不产生干扰,那就要求这些两两相邻房间发射的电子波长不相同(原理:波长相等的两列波产生干扰),如果房间全部用不同波长的电子波进行通讯,那么接收器和发射器就要很多,所以我们可以只要求两两相邻的房间波长不等,那么就可以按广义立体三维拉丁方来安排房间和电子波。
还有许许多多诸如此类问题可以用广义立体三维拉丁方来生成解决方案,譬如柜厨藏药等等。
我们在这个基础上给它下一个基于平面拉丁方的定义。
定义2.6  n个不同的符号,通常就取整数1,2,….,n。在一个n×n×n的三维数组中,排列这n个整数,使得任意两维形成的所有n个平面(整个三维拉丁方中一共3n个)都是一个平面上拉丁方,则这n阶立体方块就称之为n阶广义三维立体拉丁方。
 
2.7.2   三维立体拉丁方的具体构造方法
定义好了三维立体拉丁方,我们具体来看看它的构造方法。
由三维立体拉丁方的定义出发,要求任意两维形成的平面都是拉丁方,定义三维空间内的三个坐标轴X,Y,Z,如图2-26。

2
1
0
0     1     2
 Z
Y
X
O (0,0,0)
图2-26
文本框:  0    1      2

首考虑任意两维平面段的第一层平面,先从X-Y(Z=0)平面开始,依照规定2.1,从过原点的副斜线开始,依次赋值为0,1,2,…,n-1直到最底端的副斜线,这样一来X-Z(Y=0)平面过原点的副斜线为1,则可以依次往下定副斜线为2,3,…,n-1,0。此时Y -Z(X=0)平面过原点的副斜线也为1,也可以依次往下定副斜线为2,3,…,n-1,0。然后,每一两维的第二层平面靠原点的副斜线自然就定为2,在这个第二层平面内的往下的副斜线就定为3,4,…,2。然后这一两维的第三层平面靠原点的副斜线自然是3,此平面内的副斜线同理往后推一个数字;按这样的规律把整个三维拉丁方排完,它所有3n个平面都会是拉丁方。我们具体来看几个例子。
I.          对于4阶的三维方块(12个面):
按以上规律,构造好的三维方块。
X-Y(Z=0)面俯视如图2-27(a):               X-Y(Z=1)面俯视图2-27(b):
 
 

0    1     2    3
 
 1    2     3    0
 
 2    3     0    1
 
 3    0     1    2
1    2     3    0
 
 2    3     0    1
 
 3    0     1    2
 
 0    1     2    3
 

 
 
 
 
 
 
 

        图2-27(a)                                             图2-27(b)
 
X-Y(Z=2)面俯视如图2-27(c):             X-Y(Z=3)面俯视如图2-27(d):
 

2    3     0    1
 
 3    0     1    2
 
 0    1     2    3
 
 1    2     3    0
3    0     1    2
 
 0    1     2    3
 
 1    2     3    0
 
 2    3     0    1
 

 
 
 
 
 
 
 

         图2-27(c)                                          图2-27(d)
 
 
 
 
 
 
 
X- Z(Y=0)面俯视如图2-28(a):            X- Z(Y=1)面俯视如图2-28(b):
 

0    1     2    3
 
 1    2     3    0
 
 2    3     0    1
 
 3    0     1    2
1    2     3    0
 
 2    3     0    1
 
 3    0     1    2
 
 0    1     2    3
 

 
 
 
 
 
 
 

        图2-28(a)                                           图2-28(b)
 
X- Z(Y =2)面俯视如图2-28(c):             X- Z(Y =3)面俯视如图2-28(d):
 

2    3     0    1
 
 3    0     1    2
 
 0    1     2    3
 
 1    2     3    0
3    0     1    2
 
 0    1     2    3
 
 1    2     3    0
 
 2    3     0    1
 

 
 
 
 
 
 
 

         图2-28(c)                                          图2-28(d)
 
 
 
Y- Z(X=0)面俯视如图2-29(a):            Y- Z(X=1)面俯视如图2-29(b):
 

0    1     2    3
 
 1    2     3    0
 
 2    3     0    1
 
 3    0     1    2
1    2     3    0
 
 2    3     0    1
 
 3    0     1    2
 
 0    1     2    3
 

 
 
 
 
 
 
 

        图2-29(a)                                           图2-29(b)
 
Y- Z(X =2)面俯视如图2-29(c):             Y- Z(X =3)面俯视如图2-29(d):
 

2    3     0    1
 
 3    0     1    2
 
 0    1     2    3
 
 1    2     3    0
3    0     1    2
 
 0    1     2    3
 
 1    2     3    0
 
 2    3     0    1
 

 
 
 
 
 
 
 

         图2-29(c)                                          图2-29(d)
 
 
II.       对于5阶的三维方块(15个面):
按以上规律,构造好的三维方块。
X-Y(Z=0)面俯视如图2-30(a):              X-Y(Z=1)面俯视如图2-30(b):
 

   1     2     3      4
 
1     2     3     4      0
 
2     3     4     0      1
 
3     4     0     1      2
 
4     0     1     2      3
 
 
   2     3     4      0
 
2     3     4     0      1
 
3     4     0     1      2
 
4     0     1     2      3
 
0     1     2     3      4
 
 
 

 
 
 
 
 
 
 
 
 

         图2-30(a)                                           图2-30(b)
 
 
 
 
X-Y(Z=2)面俯视如图2-30(c):            X-Y(Z=3)面俯视如图2-30(d):        
 

   3     4     0      1
 
3     4     0     1      2
 
4     0     1     2      3
 
0     1     2     3      4
 
1     2     3     4      0
 
 
   4     0     1      2
 
4     0     1     2      3
 
0     1     2     3      4
 
1     2     3     4      0
 
2     3     4     0      1
 
 
 

 
 
 
 
 
 
 
 
 

          图2-30(c)                                       图2-30(d)
 
X-Y(Z=4)面俯视如图2-30(e):
 

   0     1     2      3
 
0     1     2     3      4
 
1     2     3     4      0
 
2     3     4     0      1
 
3     4     0     1      2
 
 
 

 
 
 
 
 
 
 
 
 

          图2-30(e)
 
 
 
 
X-Z(Y=0)面俯视如图2-31(a):            X-Z(Y=1)面俯视如图2-31(b):
 

   0     1     2      3
 
0     1     2     3      4
 
1     2     3     4      0
 
2     3     4     0      1
 
3     4     0     1      2
 
 
   2     3     4      0
 
2     3     4     0      1
 
3     4     0     1      2
 
4     0     1     2      3
 
0     1     2     3      4
 
 
 

 
 
 
 
 
 
 
 
 

          图2-31(a)                                      图2-31(b)
X-Z(Y=2)面俯视如图2-31(c):            X-Z(Y=3)面俯视如图2-31(d):        
 

   3     4     0      1
 
3     4     0     1      2
 
4     0     1     2      3
 
0     1     2     3      4
 
1     2     3     4      0
 
 
   4     0     1      2
 
4     0     1     2      3
 
0     1     2     3      4
 
1     2     3     4      0
 
2     3     4     0      1
 
 
 

 
 
 
 
 
 
 
 
 

          图2-31(c)                                       图2-31(d)
 
X-Z(Y=4)面俯视如图2-31(e):
 

   0     1     2      3
 
0     1     2     3      4
 
1     2     3     4      0
 
2     3     4     0      1
 
3     4     0     1      2
 
 
 

 
 
 
 
 
 
 
 
 

          图2-31(e)
 
 
 
 
Y-Z(X=0)面俯视如图2-32(a):            Y-Z(X=1)面俯视如图2-32(b):
 

   0     1     2      3
 
0     1     2     3      4
 
1     2     3     4      0
 
2     3     4     0      1
 
3     4     0     1      2
 
 
   2     3     4      0
 
2     3     4     0      1
 
3     4     0     1      2
 
4     0     1     2      3
 
0     1     2     3      4
 
 
 

 
 
 
 
 
 
 
 
 

          图2-32(a)                                      图2-32(b)
Y-Z(X=2)面俯视如图2-32(c):            Y-Z(X=3)面俯视如图2-32(d):        
 

   3     4     0      1
 
3     4     0     1      2
 
4     0     1     2      3
 
0     1     2     3      4
 
1     2     3     4      0
 
 
   4     0     1      2
 
4     0     1     2      3
 
0     1     2     3      4
 
1     2     3     4      0
 
2     3     4     0      1
 
 
 

 
 
 
 
 
 
 
 
 

          图2-32(c)                                       图2-32(d)
 
Y-Z(X=4)面俯视如图2-32(e):
 

   0     1     2      3
 
0     1     2     3      4
 
1     2     3     4      0
 
2     3     4     0      1
 
3     4     0     1      2
 
 
 

 
 
 
 
 
 
 
 
 

          图2-32(e)
 
经过对所有面的验证,确实都是拉丁方,所以总体上以上两个立体三维方块分别是4阶三维拉丁方与5阶三维拉丁方。对于n阶三维方块也是一样的,那么上面的对于三维立体拉丁方的构造方法是可行的。
现在再来看以上的方块的各个面,可惜发现构造的n阶三维立体拉丁方的第i行(坐标X),j列(坐标Y),k层(坐标Z)的元素为i+j+k,当然,运算在规定2.1中提到的剩余环Jn = ({0,1,2,...,n-1},+,.)中进行。在4阶三维立体拉丁方中(必须是以上的构造方法)验证第1行,第0列,第1层的元素,它应该为i+j+k=1+0+1=2,到构造出来的4阶实例中去检验,确实第1行,第0列,第1层的元素为2。
在三维立体拉丁方的基础上,现在我们来看看三维空间的染色讨论。
 
2.7.3       三维染色问题的提出及其相关规定
 
问题2.2:如若把以上的方法推广到三围立体空间中来,染色问题即是在三个坐标轴形成的三个平面内,同行、同列、同斜线,以及同大斜线内的小块颜色各不相同,最少要多少种颜色。为了顺利的从二维平面过渡到三维立体空间中来查看立方体中的各小方块的相关性,先要把以前的定义及规定重新引申一下。
规定2.2:首先在三维空间中三坐标轴(x,y,z)会形成三个平面,设其为α(x轴与y轴交汇而成),β(x轴与z轴交汇而成),γ(y轴与z轴交汇而成),这样一来对于三个平面都有所属的行序号、列序号、主斜线序号、副斜线序号,坐标系原点O(0,0,0),立体拉丁方方块在坐标系中的位置如下图2-33:

2
1
0
0     1     2
 Z
Y
X
O (0,0,0)
图2-33
文本框:  0    1      2

矩阵中小方块的序号:小方块中的行序号(相对于所属平面α或β或γ),自原点而下次为0,1,2,...,n-1;列序号(相对于所属平面α或β或γ)自原点而下依次为0,1,2,..., n-1;各个平面的主对角线都是过原点或平行于过原点的那一条对角线,另一条对角线定为副对角线,平行于主对角线的斜线称为主斜线,大斜线(主副)即是立方体的4根大对角线(主副各2)以及平行于其的在同一大对角线的隶属平面的斜线。其序号的规定为 主对角线是0,此外自上而下依次为1,2,...,n-1;平行于副对角线的斜线称为副斜线,其序号规定为副对角线是0,此外自上而下依次是1,2,...,n-1;。我用x表示某小方块的行序号,y表示列序号,z表示层序号,h表示主斜线序号,k表示副斜线序号,这里的h与k是相对与不同坐标平面而言的,在α内,则hα,kα;在β内,则hβ,β;在γ内,则hγ,kγ。则每个小方块都有一个序号数组S =(x,y,z,hi,ki,[i=αβ,γ] )。Jn = ({0, 1,2,...,n-1},+,。)表模n的剩余环,于是a∈Jn ,b∈Jn,h∈Jn,k∈Jn。并且对a, b,h,k进行的运算,全在Jn内进行。
引理2.7:在平面α内,hα=x – y ; kα= x + y + 1 。
           在平面β内,hβ= – (x – z) ; kβ= x + z + 1 。
             在平面γ内,hγ= – (y – z) ; kγ= y + z + 1 。
引理2.8:把各行(x)序号加上整数e(e∈Jn),然后行(x)序号按序号0,1,2,...n-1
顺序将行(x)重新排列,这样的变换称为行(x)变换,同样也可以进行列(y)变换,层
(z)变换。与引理2.2一样,这样改变也不会改变各小方块的相关性。从二围平面引申到三围立体空间,我把立方体拉丁方各小方块的相关性定义为如下。
定义2.7
1)        坐标系中两个坐标轴值相等;
2)        一个坐标轴值相等,其余二个坐标轴交汇形成的平面有h或k相等或都相等,例如x相等,hγ相等。
3)        无一坐标轴值相等,则看是否属于同一平面上的同一大斜线。这里又分六种情况:
          i.              如两小方块都有x=y,则同属于(x=y,z)这个平面<大斜线所在平面>,再(x,y)与z组成h 或者k运算,这里(x=y,z)平面上的运算同β平面上的运算等效,不妨取x与z; hβ= – (x – z) ; kβ= x + z + 1 。如若有{ hβ,kβ}的非空子集相等,则表明两小方块属于同一大斜线,则两小方块相关。
        ii.              如两小方块都有x=z,则同属于(x=z,y)这个平面<大斜线所在平面>,再(x,z)与y组成h 或者k运算,这里(x=z,y)平面上的运算同γ平面上的运算等效,不妨取y与z; hγ= – (y – z) ; kβ= y+ z + 1 。如若有{ hγ,kγ}的非空子集相等,则表明两小方块属于同一大斜线,则两小方块相关。
      iii.              如两小方块都有y=z,则同属于(y=z,x)这个平面<大斜线所在平面>,再(y,z)与x组成h 或者k运算,这里(y=z,x)平面上的运算同β平面上的运算等效,不妨取x与z; hβ= – (x – z) ; kβ= x + z + 1 。如若有{ hβ,kβ}的非空子集相等,则表明两小方块属于同一大斜线,则两小方块相关。
       iv.              如两小方块都有x+y=n-1 , 则属于x+y=n-1这个平面<大斜线所在平面>,再(x,y)与z组成h 或者k运算,这里(x+y=n-1,z)平面上的运算同γ平面上的运算等效,不妨取y与z; hγ= – (y – z) ; kβ= y+ z + 1 。如若有{ hγ,kγ}的非空子集相等,则表明两小方块属于同一大斜线,则两小方块相关。
         v.              如两小方块都有x+z=n-1 , 则属于x+z=n-1这个平面<大斜线所在平面>,再(x,z)与y组成h 或者k运算,这里(x+z=n-1,y)平面上的运算同γ平面上的运算等效,不妨取y与z; hγ= – (y – z) ; kβ= y+ z + 1 。如若有{ hγ,kγ}的非空子集相等,则表明两小方块属于同一大斜线,则两小方块相关。
       vi.              如两小方块都有y+z=n-1 , 则属于y+z=n-1这个平面<大斜线所在平面>,再(y,z)与x组成h 或者k运算,这里(y+z=n-1,x)平面上的运算同β平面上的运算等效,不妨取x与z; hβ= – (x – z) ; kβ= x + z + 1 。如若有{ hβ,kβ}的非空子集相等,则表明两小方块属于同一大斜线,则两小方块相关。
 
2.7.4       1 到 5阶立体方块染色分析与对应最佳立体拉丁方的思考
 
基于三未立体空间内小方块的相关性难以从图中用肉眼直接观察,下面的探讨我只列出形状图,相关性用以上的规定设计出的计算机算法来通过计算机验证(计算机算法程序附后)。
. 对于2×2×2立体方块

O (0,0,0)
 Z
X
Y

图2-34
 
由引理2.7和引理2.8和定义2.7,任意一小方块都可以经过行列层变换到坐标值为(0,0,0)的那一小块,不妨就取(0,0,0)这一小块,然后清除与其相关的小方块,无剩余小方块,所以在2×2×2立体方块中任意两小方块相关,所以至少要8种颜色。
. 对于3×3×3立体方块:

O (0,0,0)
 Z
X
Y
 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

图2-35
 
由引理2.7和引理2.8和定义2.7,任意一小方块都可以经过行列层变换到坐标值为(0,0,0)的那一小块,不妨就取(0,0,0)这一小块,然后清除与其相关的小方块,无剩余小方块,所以在3×3×3立体方块中任意两小方块相关,所以至少要27种颜色。
. 对于5×5×5立体方块:
 
 

O (0,0,0)
 Z
X
Y

图2-36
 
由引理2.7和引理2.8和定义2.7,任意一小方块都可以经过行列层变换到坐标值为(0,0,0)的那一小块,不妨就取(0,0,0)这一小块,然后清除与其相关的小方块,剩余小方块:                               a012-----a013-----a021-----a024-----a031-----a034-----a042-----a043-----a102-----a103-----a112-----a113-----a120-----a121-----a122-----a123-----a124-----a130-----a131-----a132-----a133-----a134-----a142-----a143-----a201-----a204-----a210-----a211-----a212-----a213-----a214-----a221-----a224-----a301-----a304-----a310-----a311-----a334-----a340-----a341-----a342-----a343-----a344-----a402-----a403-----a412-----a413-----a420-----a421-----a422-----a423-----a424-----a430-----a431-----a432-----a433-----a434-----a442-----a443  
在这些剩余小方块中可选出一条方案再加上a000,使得其都不相关为:a000...a012…a024…a031…a043。所以在5×5×5立体方块中可以选出5小方块各不相关,所以任意6小块相关,所以至少要25种颜色。
同理,此方法也适用于6阶以上的三维立体拉丁方,鉴于后附算法,这里不再赘述。
广义三维最佳拉丁立方按平面上的最佳拉丁方来看,就是要任意两维形成的所有n个平面(整个三维拉丁方中一共3n个)都是最佳拉丁方,并且过4条大对角线的6个斜面也都要是最佳拉丁方,即一共3n+6个面都要是最佳拉丁方,它才是一个最佳拉丁立方。那么对于以上讨论的广义的三维立体染色问题,对于一个n×n×n广义三维立体拉丁方族,若染色只需要n种颜色,则存在n阶三维立体最佳拉丁方。
但是,在[9]参考文献中,三维最佳拉丁立方被定义成除了上面说的3n+6个面都要是最佳拉丁方之外,还有就是在大对角线两旁平行于大对角斜面的两个元素加起来是n×n的两个斜面是最佳拉丁方,按[9]的观点来说,最佳拉丁立方存在的充分条件是阶数n与2,3,5,7互素的,也就是说最低是11阶。详细论述见[9]与译文。
 
 
第三章 染色及其对应最佳拉丁方分析的计算机算法实现
3.1       二维方块染色分析计算机实现
 
程序名:XYLDF
程序功能:10阶以内(含10阶)二围染色问题相关性判断,方案选择,最少任意相关格数推算,最多同色格数推算,染色最少色数推算。
程序I/O(输入输出)输入二围方块阶数,经过程序处理,顺序输出此阶数的二围方块矩阵(a[0][0] ~ a[n-1][n-1]),与a[0][0]不相关的方格矩阵(相关方格在此矩阵中用*表示),与a[0][0]不相关的方格汇总横排输出,一条基于a[0][0]的互不相关的方格方案输出,在此阶方块中最少任意相关格数输出,在此阶方块中最多同色格数输出,在此阶方块中染色最少色数输出。
程序源码:
#include<stdio.h>
#include<math.h>
int n;
int b[100],c[100];
int i,j;
int m=0;
int q=0;
int count=0;
int h,k,h1,k1;
int flag=0;
int d[100],e[100];
main()
{
set1:
printf("please input the square's order:\n");
printf("\n");
scanf("%d",&n);
if(n<=1 || n>10 )
goto set1;
printf("this is %d*%d square you required:\n",n,n);
for(i=0;i<n;i++)
 { for(j=0;j<n;j++)
    { if(j!=0 && j%(n-1)==0)
       printf("a%d%d\n\n",i,j);
     else printf("a%d%d....",i,j);
    }
 }
printf("\n");
printf("\n");
printf("this is the square irrelating a00\n");
i=0;
j=0;
h=0;
k=0;
for(i=0;i<n;i++)
 { for(j=0;j<n;j++)
     { h=i-j;
       k=i+j+1;
       if(h<0)
        h=h+n;
       if(k>(n-1))
        k=k-n;
       if(j!=0 && j%(n-1)==0)
        if(i==0 || j==0 || h==0 || k==1)
          printf("*\n\n");
        else {printf("a%d%d\n\n",i,j);
              b[m]=i;
              c[m]=j;
              m=m+1;
              }
       else
        if(i==0 || j==0 || h==0 || k==1)
          printf("*....");
        else {printf("a%d%d..",i,j);
              b[m]=i;
              c[m]=j;
              m=m+1;
              }
 
       }
   }
b[m]=200;
c[m]=200;
printf("total is:");
for(m=0;m<100;m++)
   { if(b[m]!=200 && c[m]!=200)
      { count=count+1;
     printf("a%d%d...",b[m],c[m]);
     }
     else
       break;
   }
printf("\n");
printf("\n");
printf("this is one of the irrelevant elements' choice:\n ");
printf("a00....");
d[0]=b[0];
e[0]=c[0];
d[1]=200;
e[1]=200;
i=0;
m=0;
h=0;
k=0;
h1=0;
k1=0;
while(m<count)
 { q=0;
    flag=0;
    while(d[q]!=200 && e[q]!=200)
       { h=b[m]-c[m];
        k=b[m]+c[m]+1;
        h1=d[q]-e[q];
        k1=d[q]+e[q]+1;
        if(h<0)
           h=h+n;
        if(k>(n-1))
           k=k-n;
        if(h1<0)
           h1=h1+n;
        if(k1>(n-1))
           k1=k1-n;
        if(b[m]!=d[q] && c[m]!=e[q] && h!=h1 && k!=k1)
           { q=q+1;
             continue;}
        else { flag=1;break;}
 
 
       }
    if(flag==0)
      {
       d[q]=b[m];
       e[q]=c[m];
       q++;
       d[q]=200;
       e[q]=200;
 
      }
      m++;
 }
i=0;
while(d[i]!=200 && e[i]!=200)
    { printf("a%d%d....",d[i],e[i]);
      i=i+1;
    }
printf("\n");
printf("\n");
count=0;
q=0;
while(d[q]!=200 && e[q]!=200)
    { count=count+1;
      q=q+1;
    }
printf("%d elements relate at random in this %d*%d square \n\n",count+2,n,n);
printf("so the num of elements with the same color at most is %d in this %d*%d square\n\n",count+1,n,n);
printf("so at least %d different kinds of color can dye this %d*%d square\n",n*n/(count+1),n,n);
 
}
程序I/O示例截图:

3.2  三维方块染色分析计算机实现
 
程序名:3D
程序功能:10阶以内(含10阶)三围立体染色问题相关性判断,方案选择,最少任意相关小方块数推算,最多同色小方块数推算,染色最少色数推算。
程序I/O(输入输出):输入三围立体方块阶数,经过程序处理,顺序输出此阶数的三围立体方块中与a[0][0][0]不相关的小方块汇总横排,一条基于a[0][0]的互不相关的方格方案输出,在此阶方块中最少任意相关格数输出,在此阶方块中最多同色格数输出,在此阶方块中染色最少色数输出。
程序源码:
#include <stdio.h>
 
int n;
int i=0;
int j=0;
int k=0;
int m=0;
int flag=0;
int count=0;
int hxy=0;
int kxy=0;
int hxz=0;
int kxz=0;
int hyz=0;
int kyz=0;
int hxy1=0;
int kxy1=0;
int hxz1=0;
int kxz1=0;
int hyz1=0;
int kyz1=0;
int a[1000]={100};b[1000]={100};c[1000]={100};
int d[1000]={100};e[1000]={100};f[1000]={100};
main()
{ set1: printf("input 3D square's order:\n");
       scanf("%d",&n);
       if(n<=1 || n>10) goto set1;
 for(i=0;i<n;i++)
   { for(j=0;j<n;j++)
      { for(k=0;k<n;k++)
 
       { hxy=i-j;
        if(hxy<0) hxy=hxy+n;
        kxy=i+j+1;
        if(kxy>(n-1)) kxy=kxy-n;
        hxz=-(i-k);
        if(hxz<0) hxz=hxz+n;
        kxz=i+k+1;
        if(kxz>(n-1)) kxz=kxz-n;
        hyz=-(j-k);
        if(hyz<0) hyz=hyz+n;
        kyz=j+k+1;
          if(kyz>(n-1)) kyz=kyz-n;
        if( ((i==0&&j==0)||(i==0&&k==0)||(j==0&&k==0)) || (i==0&&(hyz==0||kyz==1)) || (j==0&&(hxz==0||kxz==1)) || (k==0&&(hxy==0||kxy==1)) || (i==j&&(hxz==0||kxz==1)) || (i==k&&(hyz==0||kyz==1)) || (j==k&&(hxz==0||kxz==1)) )
 
               continue;
 
               a[m]=i;
               b[m]=j;
               c[m]=k;
               m=m+1;
       }
      }
    }
 
a[m]=200;
b[m]=200;
c[m]=200;
for(m=0;m<1000;m++)
 {if(a[m]!=200&&b[m]!=200&&c[m]!=200)
     count=count+1;
   else
     break;
 }
printf("\n");
printf("the elements irrelating a000:\n");
m=0;
while(a[m]!=200&&b[m]!=200&&c[m]!=200)
    { printf("a%d%d%d...",a[m],b[m],c[m]);
      m=m+1;
 
    }
printf("\n");
d[0]=a[0];
e[0]=b[0];
f[0]=c[0];
d[1]=200;
e[1]=200;
f[1]=200;
i=0;
m=0;
for(m=0;m<count;m++)
 { flag=0;
    j=0;
    while(d[j]!=200&&e[j]!=200&&f[j]!=200)
       { hxy=a[m]-b[m];
        if(hxy<0) hxy=hxy+n;
        kxy=a[m]+b[m]+1;
        if(kxy>(n-1)) kxy=kxy-n;
        hxz=-(a[m]-c[m]);
        if(hxz<0) hxz=hxz+n;
        kxz=a[m]+c[m]+1;
        if(kxz>(n-1)) kxz=kxz-n;
        hyz=-(b[m]-c[m]);
        if(hyz<0) hyz=hyz+n;
        kyz=b[m]+c[m]+1;
        if(kyz>(n-1)) kyz=kyz-n;
        hxy1=d[j]-e[j];
        if(hxy1<0) hxy1=hxy1+n;
        kxy1=d[j]+e[j]+1;
        if(kxy1>(n-1)) kxy1=kxy1-n;
        hxz1=-(d[j]-f[j]);
        if(hxz1<0) hxz1=hxz1+n;
        kxz1=d[j]+f[j]+1;
        if(kxz1>(n-1)) kxz1=kxz1-n;
        hyz1=-(e[j]-f[j]);
        if(hyz1<0) hyz1=hyz1+n;
        kyz1=e[j]+f[j]+1;
        if(kyz1>(n-1)) kyz1=kyz1-n;
 
        if((a[m]==d[j]&&b[m]==e[j])||(a[m]==d[j]&&c[m]==f[j])||(b[m]==e[j]&&c[m]==f[j]))
           {flag=1;
            break;}
        else if(a[m]==d[j]&&(hyz==hyz1||kyz==kyz1))
           {flag=1;
            break;}
       else if(b[m]==e[j]&&(hxz==hxz1||kxz==kxz1))
           {flag=1;
            break;}
        else if(c[m]==f[j]&&(hxy==hxy1||kxy==kxy1))
           {flag=1;
            break;}
 
        else if(a[m]==b[m]&&d[j]==e[j]&&(hxz==hxz1||kxz==kxz1))
           {flag=1;
            break;}
        else if(a[m]==c[m]&&d[j]==f[j]&&(hyz==hyz1||kyz==kyz1))
           {flag=1;
            break;}
        else if(b[m]==c[m]&&e[j]==f[j]&&(hxz==hxz1||kxz==kxz1))
           { flag=1;
             break;}
          else if((a[m]+b[m])==(n-1)&&(d[m]+e[m])==(n-1)&&(hyz==hyz1||kyz==kyz1))
            { flag=1;
             break;}
          else if((a[m]+c[m])==(n-1)&&(d[m]+f[m])==(n-1)&&(hyz==hyz1||kyz==kyz1))
            { flag=1;
             break;}
          else if((b[m]+c[m])==(n-1)&&(e[m]+f[m])==(n-1)&&(hxz==hxz1||kxz==kxz1))
            { flag=1;
             break;}
 
        else{
        j=j+1;
        continue;}
       }
       if(flag==0)
        { d[j]=a[m];
           e[j]=b[m];
           f[j]=c[m];
           d[j+1]=200;
           e[j+1]=200;
           f[j+1]=200;
        }
 }
i=0;
count=0;
printf("\n");
printf("a kind of choice without relation:\n");
printf("a000...");
while(d[i]!=200&&e[j]!=200&&f[j]!=200)
     { printf("a%d%d%d...",d[i],e[i],f[i]);
       count=count+1;
       i=i+1;
     }
printf("\n");
printf("\n%d elements relate at random\n",count+2);
printf("\nso the elements with the same color at most are %d\n",count+1);
 
i=n*n*n;
printf("\n");
printf("at least %d different colors can dye this %d*%d*%d 3D square\n",i/(count+1),n,n,n);
 
}
 
程序I/O示例截图:

3.3       二维或三维方块子元素相关性分析计算机实现
 
程序名:CHECK
程序功能:10阶以内(含10阶)二围或三围染色问题输入的待测小方格或小方块相关性判断,结合原点小方格或小方块相关性判断。
程序I/O(输入输出):输入方块围数,再输入方块阶数,经过程序处理,顺序输出此阶数的二围或三围立体方块中与待测小方格或小方块不相关的小方格或小方块汇总横排,与待测小方格或小方块不相关并且与a[0][0]或者a[0][0][0]不相关的小方格或小方块输出。
程序源码:
 
#include<stdio.h>
#include<math.h>
int dim;
int n;
int i=0;
int j=0;
int k=0;
int r=0;
int c=0;
int z=0;
int h=0;
int kk=0;
int hc=0;
int kc=0;
int hxy=0;
int kxy=0;
int hxz=0;
int kxz=0;
int hyz=0;
int kyz=0;
int hxy1=0;
int kxy1=0;
int hxz1=0;
int kxz1=0;
int hyz1=0;
int kyz1=0;
main()
 
{
set1:
printf("please input the aquare's dimension:\n" );
scanf("%d",&dim);
if(dim<2 || dim>3 )
goto set1;
printf("please input the square's order:\n");
printf("\n");
scanf("%d",&n);
if(n<=1 || n>10 )
goto set1;
if(dim==3)
goto set2;
printf("\n");
printf("input the elments you want to check:a??");
scanf("%d %d",&r,&c);
printf("\n");
hc=r-c;
kc=r+c+1;
if(hc<0)
hc=hc+n;
if(kc>(n-1))
kc=kc-n;
printf("the element you selected in %d*%d square's(a,b,h,k)=s(%d,%d,%d,%d)\n",n,n,r,c,hc,kc);
printf("\nsuitable elements for a%d%d is",r,c);
for(i=0;i<n;i++)
 { for(j=0;j<n;j++)
     { h=i-j;
       kk=i+j+1;
       if(h<0)
        h=h+n;
       if(kk>(n-1))
        kk=kk-n;
       if(i!=r && j!=c && h!=hc && kk!=kc)
        printf("...a%d%d",i,j);
 
 
     }
   }
printf("\nfollow is proper elements for a%d%d in irrelating a00's\n",r,c);
for(i=0;i<n;i++)
   for(j=0;j<n;j++)
      {h=i-j;
       kk=i+j+1;
       if(h<0)
        h=h+n;
       if(kk>(n-1))
        kk=kk-n;
       if(i!=r && j!=c && h!=hc && kk!=kc && i!=0 && j!=0 && h!=0 && kk!=1)
        printf("...a%d%d",i,j);
      }
 
goto end;
set2:
printf("input the elments you want to check:a???");
scanf("%d %d %d",&r,&c,&z);
printf("\n");
hxy=r-c;
if(hxy<0) hxy=hxy+n;
kxy=r+c+1;
if(kxy>(n-1)) kxy=kxy-n;
hxz=-(r-z);
if(hxz<0) hxz=hxz+n;
kxz=r+z+1;
if(kxz>(n-1)) kxz=kxz-n;
hyz=-(c-z);
if(hyz<0) hyz=hyz+n;
kyz=c+z+1;
if(kyz>(n-1)) kyz=kyz-n;
printf("the element you selected in %d*%d*%d square's(x,y,z,hxy,kxy,hxz,kxz,hyz,kyz)=s(%d,%d,%d,%d,%d,%d,%d,%d,%d)\n",n,n,n,r,c,z,hxy,kxy,hxz,kxz,hyz,kyz);
printf("\nsuitable elements for a%d%d%d is",r,c,z);
for(i=0;i<n;i++)
   { for(j=0;j<n;j++)
      { for(k=0;k<n;k++)
 
       { hxy1=i-j;
        if(hxy1<0) hxy1=hxy1+n;
        kxy1=i+j+1;
        if(kxy1>(n-1)) kxy1=kxy1-n;
        hxz1=-(i-k);
        if(hxz1<0) hxz1=hxz1+n;
        kxz1=i+k+1;
        if(kxz1>(n-1)) kxz1=kxz1-n;
        hyz1=-(j-k);
        if(hyz1<0) hyz1=hyz1+n;
        kyz1=j+k+1;
          if(kyz1>(n-1)) kyz1=kyz1-n;
        if( ((i==r&&j==c)||(i==r&&k==z)||(j==c&&k==z)) || (i==r&&(hyz==hyz1||kyz==kyz1)) || (j==c&&(hxz==hxz1||kxz==kxz1)) || (k==z&&(hxy==hxy1||kxy==kxy1)) || (i==j&&r==c&&(hxz==hxz1||kxz==kxz1)) || (i==k&&r==z&&(hyz==hyz1||kyz==kyz1)) ||
        (j==k&&c==z&&(hxz==hxz1||kxz==kxz1))||((r+c)==n-1&&(i+j)==n-1&&(hyz==hyz1||kyz==kyz1))||((r+z)==n-1&&(i+k)==n-1&&(hyz==hyz1||kyz==kyz1))||((c+z)==n-1&&(j+k)==n-1&&(hxz==hxz1||kxz==kxz1)) )
             continue;
             printf("...a%d%d%d",i,j,k);
         }
       }
    }
printf("\nfollow is proper elements for a%d%d%d in irrelating a000's\n",r,c,z);
for(i=0;i<n;i++)
   { for(j=0;j<n;j++)
      { for(k=0;k<n;k++)
 
       { hxy1=i-j;
        if(hxy1<0) hxy1=hxy1+n;
        kxy1=i+j+1;
        if(kxy1>(n-1)) kxy1=kxy1-n;
        hxz1=-(i-k);
        if(hxz1<0) hxz1=hxz1+n;
        kxz1=i+k+1;
        if(kxz1>(n-1)) kxz1=kxz1-n;
        hyz1=-(j-k);
        if(hyz1<0) hyz1=hyz1+n;
        kyz1=j+k+1;
          if(kyz1>(n-1)) kyz1=kyz1-n;
        if( ((i==r&&j==c)||(i==r&&k==z)||(j==c&&k==z)) || (i==r&&(hyz==hyz1||kyz==kyz1)) || (j==c&&(hxz==hxz1||kxz==kxz1)) || (k==z&&(hxy==hxy1||kxy==kxy1)) || (i==j&&r==c&&(hxz==hxz1||kxz==kxz1)) || (i==k&&r==z&&(hyz==hyz1||kyz==kyz1)) ||
        (j==k&&c==z&&(hxz==hxz1||kxz==kxz1))||((r+c)==n-1&&(i+j)==n-1&&(hyz==hyz1||kyz==kyz1))||((r+z)==n-1&&(i+k)==n-1&&(hyz==hyz1||kyz==kyz1))||((c+z)==n-1&&(j+k)==n-1&&(hxz==hxz1||kxz==kxz1)) ||
          ((i==0&&j==0)||(i==0&&k==0)||(j==0&&k==0)) || (i==0&&(hyz1==0||kyz1==1)) || (j==0&&(hxz1==0||kxz1==1)) || (k==0&&(hxy1==0||kxy1==1)) || (i==j&&(hxz1==0||kxz1==1)) || (i==k&&(hyz1==0||kyz1==1)) || (j==k&&(hxz1==0||kxz1==1)) )
             continue;
             printf("...a%d%d%d",i,j,k);
         }
       }
    }
 
end:
printf("\n");
}
 
程序I/O示例截图:


3.4       一种二维最佳拉丁方构造方法计算机实现
 
程序名:OPTIMAL
程序功能:如果存在,则构造一个100阶以内的平面最佳拉丁方。
程序I/O(输入输出):输入一个100以内的拉丁方阶数,如若存在这个阶数的最佳拉丁方,则输出一个最佳拉丁方,反之,则输出出错信息,提示不存在此阶数的最佳拉丁方。
程序源码:
#include<stdio.h>
#include<math.h>
static int fix;
int i,j;
int n;
int res(int x,int y,int nn)
{ int z;
 if(x==0 && j==0)
    {z=nn; fix=z;
     if(fix<0) fix=fix+nn+1;
     if(fix>nn) fix=fix-nn-1;
     }
 else if(j==0)
    {z=nn-2*x; fix=z;
     if(fix<0) fix=fix+nn+1;
     if(fix>nn) fix=fix-nn-1;
     }
 else
     z=fix+y;
 if(z<0)
     z=z+nn+1;
 if(z>nn)
     z=z-nn-1;
 return(z);
}
main()
{
set:
printf("input the optimal latin square's order(within 100):");
scanf("%d",&n);
if(n%2==0 || n%3==0 || n<5 || n>97)
 { printf("sorry! no this optimal latin square!");
    goto set;}
printf("\nfollow is the %d*%d optimal latin square:\n",n,n);
for(i=0;i<n;i++)
     for(j=0;j<n;j++)
        { if(j==n-1)
            printf("%d\n\n",res(i,j,n-1));
          else
            printf("%d...",res(i,j,n-1));
         }
}
 
程序I/O示例截图:


3.4       广义三维立体拉丁方的构造算法实现
 
程序名:3DLDF
程序功能:构造一个20阶以内的广义三维立体拉丁方。
程序I/O(输入输出):输入一个20以内的拉丁方阶数,则输出一个构造好的此阶数的广义三维立体拉丁方的每个元素的具体排法。
程序源码:
#include<stdio.h>
int i,j,k;
int n;
int a[20][20][20];
int res(int x,int y,int z,int nn)
{int m;
 m=x+y+z;
 if(m<0)
     m=m+nn;
 if(m>nn-1)
     m=m-nn;
 if(m<0)
    m=m+nn;
 if(m>nn-1)
    m=m-nn;
 return(m);
 }
main()
{
set:
printf("\ninput the order of the 3d latin square(1<order<=20):");
scanf("%d",&n);
if(n<2 || n>20)
goto set;
printf("\nfollow are the %d*%d*%d 3d latin square's elements:\n",n,n,n);
for(i=0;i<n;i++)
   for(j=0;j<n;j++)
      for(k=0;k<n;k++)
         { printf("a[%d][%d][%d] is %d...",i,j,k,res(i,j,k,n));
          }
}
 
程序I/O示例截图:



第四章 结论总结
 
综上所述,拉丁方由一个有趣的数学游戏衍生为一支强大的自然科学的数学分支,通过社会生活与生产的广泛应用,人们强烈意识到它的科学性与实用性,自然关于它的理论研究已经到达白热化的阶段。通过本文以上的讨论研究,在对正交拉丁方、完备拉丁方以及最佳拉丁方形成了熟练而精密的学术观点之后,利用了计算机在算法设计上的帮助,从广义上以一种染色问题与最佳拉丁方的内在理论联系开展深入的讨论,去研究n阶拉丁方的存在以及该染色问题自身的属性。近而以一种拉丁方试验的推广构造了广义上的拉丁方,即三维立体拉丁方。并导出一种基于副斜线的n阶广义三维拉丁立方的构造方法并发现了新规律,即按此法构造的三维拉丁立方的第i行,j列,k层的元素为i,j,k之和(Jn内计算)。随后通过修改补充二维方块染色问题中的相关规约引理把平面上的染色问题拓展到三维立体空间,并且对一至五阶三维立体方块染色问题进行了细致研究,最后提出了广义立体空间上的最佳拉丁方存在性问题的一些初步的看法和思考。这里最主要的是“相关性”的拓展分析,把二维平面上的染色问题推广到三维立体空间,并叙述了广义立体最佳拉丁方方面的一些观点。
当然,一些方法还是有它的片面性与局限性,并且本人自己的广义立体最佳拉丁方的定义仅仅是一种猜想。
   
 
 
 
 
 
 
 
 
 
 
 
 
 
 
  
 
在这次毕业设计的工作中,我学到了很多知识,并强化了自己的创新意识,这与指导老师陈小松教授的推荐文献资料、难点答疑指导是分不开的,还有中南大学图书馆的工作人员,在文献查找方面给予了热心的帮助。在此,我要对他们表示衷心的感谢。
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
参考文献
[1] 孙有伟. 纵横图与拉丁方[J]. 辽宁教育学院学报. 2000年9月,第17卷 第5期:63 ~ 65
[2] 魏万迪. 组合论[M]. 北京:科学出版社,1987
[3] 杨骅飞 王朝瑞. 组合数学及其应用[M]. 北京:北京理工大学出版社,1992
[4] 李盘林 李丽双 李洋 王春立. 离散数学[M]. 北京:高等教育出版社,2002
[5] 高建国. 点阵与有限群的立体定义[J ]. 开封大学学报. 1994年2月,第2、3期:56 ~ 61
[6] Carla P.Gomes  Rommel G.Regis David B.Shmoys[J]. Annual ACM-SIAM Symposium on Discrete Algorithms. 2003Vol. 14th No.1832 ~ 833
[7] 欧阳录. 最佳拉丁方与高级原幻方[J]. 数学理论与应用. 2001年9月,第21卷第3期:22 ~ 29
[8] 王建中. 方块染色问题的探讨[J]. 湖南教育学院学报. 1991年,第9卷 第2期:39 ~ 41
[9] 陈小松. n (( n, 2ž3ž5)=1)阶高级幻立方的构造方法[J]. 湖南教育学院学报. 1990年5月,卷期页码不详
[10] Chen Xiaosong. [J]. Ways of Constructing Optimal Magic Cube of Order n When ( n, 2ž3ž5ž7)=1. Journal of Central south university of Technology. (English Edition) 2002.1Vol.9 No.170 72
[11] 程品. 利用完全拉丁方快速构造素数阶完全幻方[J]. 四川师范学院学报(自然科学版). 1996年9月,第17卷 第3期:106 ~ 108
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
  
 
外文资料原文:
Ways of constructing optimal magic cube of order n
when(n,2·3·5·7)=1
CHEN Xiao-song(陈小松)
Department of applied mathematics and applied software, central south university, shangsha 410083, China
 
Abstract: an optimal magic cube of order n is a magic cube whose row sums, column sums and oblique sums of 9 n layers are . The author proved that optimal magic cubes of order n may be constructed as long as n and 2,3,5,7 are relatively prime, and a formula for making optimal magic cubes by using optimal Latin squares and optimal magic squares was given.
Key words: optimal Latin square; optimal magic square; complete residue system
Document code:  A
                                                                                  
 
The concept of optimal magic cube and the way of constructing optimal magic cube of order 16n was given in . How to construct optimal magic cubes of order n when n is odd ? In this paper, the author proves the optimal magic cubes of order n may be constructed when (n,2·3·5·7)=1, and a formula for making optimal magic cubes by using optimal Latin squares and optimal magic squares is given.
Write a square matrix A of order n for
and call it square A. We write square A for [a1, a2, …, an] if aj is the jth column of A,  (the least positive complete residue system of module n). Totality of two parallel segments is called an oblique line if the two segments are on the two sides of the diagonal and the number of elements in it is n. Diagonal is also an oblique line .The sum of all elements on an oblique line is called oblique sum. Totality of two parallel sections is called an inclined plane if the two sections are on the two sides of diagonal plane and the number of elements on it is . Diagonal plane is also an inclined. Square A is called an optimal magic square if the total elements are 1,2,3,…,  and all its row sums, column sums and oblique sums are .
 
Foundation item: Supported by the Arts and science Foundation of Central South University (No.2000007)
Biography of author: CHEN Xiao-song, associate professor, born in 1956, majoring in algebra and number theory.
Received date: Jane 27, 2001
 
 
Square A is called a Latin square if its n elements appear on every row and column; if its n
elements appear also on every oblique line, then A is called an optimal Latin square.
Definition A magic cube A is a cube which consists of 1,2,3,…,  and all its row sums , column rows, vertical sums and four large diagonal sums are . An optimal magic cube of order n is the magic cube whose row sums, column sums and oblique sums of 9 n layers are . (including 3n layers which run parallel to the surface and 6n inclined plane).
Let A=[a1,a2,a3,…,ai,ai+1,…,an], ,define =[ai,ai+1, …,a1,…ai-1]; if (n,a)=1, define =[,,…,,…, ],1+(j-1)a .
Let
 
 
Then both E and  are Latin squares. We shall construct optimal magic squares and optimal magic cubes by using E and.
Lemma 1 (1) ,  here A and B are both square of order n, m is an integer;
(2) (or ) is an optimal Latin square if and only if n,k-1)=(n,k)=(n,k+1)=1;
(3) If both  and  are Latin squares, and (n,k-h)=1, then  and  are orthogonal (the pair of elements on corresponding position of  and  are pair wise different).
(4) If A is a optimal Latin square which consists of 0, 1, 2, … , n-1, B is an optima Latin square which consists of elements of , which Z and B are orthogonal, then M=nA+B is an optimal magic square.
Lemma 2 If  is an optimal magic square (optimal Latin square) then () is also an optimal magic square (optimal Latin square).
Proof By definition of  , (n, a)=1, this shows that 1+(j-1) a passes though a complete residue system of module n when j-1 passes through a complete residue system of module n, And as 1+(j-1) , there exists j0 that makes i=1+(j0-1)a. Hence the fact that  is an optimal magic square implies  is an optimal magic square, thus =[,,,…]=  is also an optimal magic square.
Lemma 3 Let M be Latin square of order n ( M consists of 1, 2, 3, …, ), L is a Latin square of order n ( L consists of 0,2,…,(n-1) ), (n,h)=(n,r)=(n,h-r)=1, and , then all elements of ,,…,are {1,2,3,…, }.
Theorem 1 Optimal magic cubes of order n can be constructed of the following conditions are satisfied:
(1) (n,6)=1;
(2) There exists optimal magic square M of order n, Which makes both  and  optimal magic square;
(3) There exists an optimal Latin square L whose elements are {0,2,…,(n-1) }, which makes all of the ,, and  optimal Latin square.
Proof Let (k=1,2,3,…,n), we pile up ,,…, from up to down make a cube , by lemma 3, all elements of  are 12,3,…,. We shall now prove  is an optimal magic cube.
Pile up ,,,…, to make a cube , and pile up ,,,…, to make a cube  corresponding with  . Since every row, column and oblique line of 3n layers (which run parallel to the surface) is row or column on some inclined plane in a cube, so we only prove that every row sum, column sum and oblique sum on 6n inclined plane of  is , and every row sum, column sum and oblique sum on 6n inclined plane of  is . Therefore every row sum, column sum and oblique sum on 9n layer of  is .
Consider the first (seeing Fig.1)
Fig 1. cube
Diagonal plane A1 A2 B3 B4 and kth inclined plane counting from up to down (which runs parallel to A1 A2 B3 B4) is =[,,,…]=, by lemma 2, each of the m is optimal square. (k=1, 2, 3, …,n)
Diagonal plane B1 B2 A3 A4 and kth inclined Plane counting up to down(which runs parallel to B1 B2 A3 A4) is =[,,,,…]=  is optimal magic square. (k=1,2,3,…,n)
As the kth layer of  (from up to down) is =[,…,,…],
             jth column                                               jth column
the ith row of it is identical with the ith row of  ;the 1st,2nd,3rd,… column of it is respectively identical with the 1st,3rd,5th,… main oblique line counting from the right (which runs parallel to main diagonal) of  ;the 1st,4th,7th,… main oblique line (counting from the right) of it is respectively the 1st,3rd,5th,… main oblique line (counting from the right) of ;the 1st,2nd,3rd,… auxiliary oblique line counting from the right (which runs parallel to the auxiliary diagonal) of it is respectively identical with the 1st,3rd,5th,… auxiliary oblique line counting from the right of  ,by lemma 2,all  are optimal magic square. (k=1,2,3,…,n).
Consider the other inclined planes, similarly. Therefore, all row sums, column sums and oblique sums on every inclined plane of  are .
Fig2. cube
Similarly, all row sums, column sums and the (i,j) -entry of  satisfies .
Diagonal plane A1 B2 B3 A4 and kth inclined plane counting from up to down (which runs parallel to diagonal plane) is
oblique sums of every inclined plane of  (seeing Fig.2) are .
Theorem 2 if (n,2·3·5·7)=1 ,then we can construct the optimal magic cubes  of order n. The kth layer (from up to down) of  is  . (k=1,2,3,…,n) .
Proof Since (n,2·3·5·7)=1 , by lemma 1,  are optimal Latin square,  and  are orthogonal,  and  are orthogonal,  and  are orthogonal. Therefore  are all optimal Latin square,  are optimal magic squares, the optimal magic cube of order n is constructed.
 
References
[1] Li li. Fast way of constructing 1st class optimal magic cube of order 16n[J]. Mathematics Progress (in Chinese), 1988. 17(4): 385-390.
[2] Andrews W S. Magic squares and cubes[M]. Dover Publications INC, 1960. 64-206.
[3] Hua Luo-geng. Introduction to theory of numbers (in Chinese)[M].Beijing: Science Press, 1979.
[4] Min Si-he, Yian Shi-jian. Primary theory of numbers (in Chinese)[M].Beijing: People Education Press, 1983.
[5] Chen Xiao-song. Way of constructing advanced Magic Cube of order n when (n, 2.3.5)=1 (in Chinese)[J]. Journal of Hunan Education Institute, 1990, 5: 104-106.
[6] Chen Xiao-song. The researching of ways of constructing prime number and it’s primitive root (in Chinese)[J]. Mathematics Theory and Applications, 2000, 20: 66-68.
 
 
外文资料主体正文译文:
 
n阶最佳幻方的构造方法
(n,2·3·5·7)=1
陈小松
应用数学与应用软件系,中南大学,长沙410083,中国
摘要:一个n阶的最佳幻立方是一个9n层行和、列和、的斜和都为。作者证明了当n与2,3,5,7都互素时,n阶的幻立方是可以被构造出来的,并且推导了一个利用最佳拉丁方和最佳幻方来构造最佳幻立方的公式。
关键词:最佳拉丁方;最佳幻方;完全剩余系
 
 
最佳幻立方的概念以及16n阶的最佳幻立方的构造方法已经在1988年被给出。怎样构造一个n为奇数的最佳幻立方呢?在这篇文章里,作者证明了当n与2,3,5,7都互素的奇数阶的最佳幻立方的构造方法以及采用最佳拉丁方和最佳幻方来构造的构造公式。
写一个n阶的拉丁矩阵A如下:
称之为方块A。我们写A=[a1, a2, …, an] 如果aj在A的j列,  (模n的最小正完全剩余系)。两个平行段的总体被称为一条斜线,如果两个段在对角线的两边并且这条斜线上有n个元素。当然,对角线也是一条斜线,一条斜线上所有元素的和称为斜和。两个平行段的总和成为斜面,如果两个段位于一条对角线面的两边并且其上的元素个数是。对角面也是一个斜面。方块A就是一个最佳幻方,如果所有元素是1,2,3,…, 并且它的行和、列和、斜和都是。
方块A被称之为拉丁方,如果它的n个元素都出现在每一行、每一列;如果它的n个元素也都出现在每一条斜线,那么就称之为最佳拉丁方。
定义:幻立方A 由1,2,3,…, 组成,它的所有行和、列和、垂直纵向和、4个大对角线和都为,一个n阶最佳幻立方,它9n层的行和,列和,斜和也都是(包括平行于相应表面的3n层和6n斜面)。
A=[a1,a2,a3,…,ai,ai+1,…,an], ,定义 =[ai,ai+1, …,a1,…ai-1];如果(n,a)=1,定义 =[,,…,,…, ],1+(j-1)a 。
设:
 
 
那么E和都是拉丁方,我们将使用E和来构造一个最佳幻方和一个最佳幻立方。
引理1:(1),这里的A和B都是n阶方块,m是一个整数;
2)(或者)是一个最佳拉丁方,当且仅当(n,k-1)=(n,k)=(n,k+1)=1;
3)如果和是拉丁方,并且(n,k-h)=1,那么是正交的(对应位置的的元素对之间是两两不相同的)。
4)如果A是一个由0,1,2,…,n-1组成的最佳拉丁方,B是一个由里的元素组成的最佳拉丁方,当Z与B正交的时候,M=nA+B是一个最佳幻方。
引理2:如果是一个最佳幻方(最佳拉丁方),那么也是一个最佳幻方(最佳拉丁方)。
证明:由的定义可知,(n,a)=1,这就说明了1+(j-1)a通过了模n的一个完备剩余系当(j-1)通过了模n的一个完备剩余系。并且当1+(j-1)a ,存在j0,使得i=1+(j0-1)a,因此是一个最佳幻方表明了是一个最佳幻方,所以 =[,,,…]= 也是一个最佳幻方。
引理3:M是一个n阶的拉丁方(M由1,2,…,构成),L是一个n阶的拉丁方(L由0,2,…,(n-1)构成),(n,h)=(n,r)=(n,h-r)=1,而且 ,那么,所有,,…,的元素是{1,2,3,…, }
定理1:n阶最佳幻立方可以被构造出来,如果满足以下条件:
1)n,6)=1;
2)存在n阶最佳幻方,使得与都是最佳幻方;
3)存在最佳拉丁方L,其元素是{0,2,…,(n-1) },使得所有的,和都是最佳拉丁方。
证明:设(k=1,2,3,…,n),我们从上至下堆叠,,…,来构造一个立方体,由引理3,所有的元素是1,2,3,…,。我们现在来证明是一个最佳幻立方。
堆叠,,,…,来构造一个立方体,再堆叠,,,…,来构造一个对应于的,因为3n层的每一行、每一列、每一斜线(平行于表面)是立方体中某一个斜面的行或者列。所以我们只证明的6n斜面上的每一行和、列和、斜和都是,并且的6n斜面上的每一行和、列和、斜和都是。因此的9n层面上的每一行和、列和、斜和都是。
考虑第一个(如图1)
图1 立方体
 
对角面A1 A2 B3 B4和从上至下数的第k斜面(平行于A1 A2 B3 B4)是 =[,,,,…]=,由引理2,每一个m都是一个最佳幻方(k=1,2,3,…,n)。
对角面B1 B2 A3 A4和从上至下数的第k斜面(平行于B1 B2 A3 A4)是 =[,,,,…]=是最佳幻方(k=1,2,3,…,n)。
当的第k层(从上至下)是 =[,…,,…],
             第j列                                                     第j列
图2
它的第i行的元素是与的第i行是恒等的;它的第1列,第2列,第3列,…,分别与的从右开始数的主斜线(平行于主对角线)的第1条,第3条,第5条,…,恒等;它的主斜线(从右开始数的)的第1条,第4条,第7条,…,分别与的从右边开始数的主斜线的第1条,第3条,第5条,…,恒等;它的从右开始数的副斜线(平行于副对角线)的第1条,第2条,第3条,…,分别与的从右开始数的副斜线的第1条,第3条,第5条,…,恒等,由引理2,所有的都是最佳幻方(k=1,2,3,…,n)。设置如上面的图2。
再考虑其他的斜面,同理是一样的。因此,的每一个斜面上的行和、列和、斜和都是
 
 
图3 立方体
 
同理,所有的行和,列和和(i,j)-通道满足。
对角面A1 B2 B3 A4 和从上至下(对行于对角面)的第k斜面的斜和是每一个斜面的斜和,为。如图3。
定理2:如果(n,2·3·5·7)=1,那么我们可以构造一个n阶的幻立方,它的第k层(从上至下)是 (k=1,2,3,…,n)
证明:因为(n,2·3·5·7)=1,由引理1,是最佳拉丁方,和是正交的,和是正交的,和是正交的,因此都是最佳拉丁方,都是最佳幻方,所以n阶最佳幻立方能被构造出来。



 
爪哇流氓 @ 2007-07-10 18:14

今天清理房间的时候在一个满身灰尘的箱子里发现了在学校读书时候的电脑的那块硬盘,翻了翻,里面东西还真多,勾起了好多好多的回忆,先贴一篇在学校作过的课程设计的一部分文档,现在看起来简直就没什么技术含量,设计也做得好烂。
订单管理系统设计文档
项目问题说明
订单管理系统在销售环节、到货、售后服务和维护方面的优越性十分明显。特别当客户是法人单位,需要多次付款,商品需要安装、服务、维修的情况下,通过成本控制、应收款管理等手段,企业能够把销售过程中的资金占压控制在最小,使资金回笼更快。另外,通过商品在途催赶、安装前期计划和安装计划、签收等手段,在时间要素方面,完成对客户的承诺,从而提高客户的满意程度,维系住客户。
系统主要要求总体来说就是以B/S模式实现对合法用户提交的订单加以回收并提供给管理员进行效对及支付处理并做出交易通知。
可行性分析
1. 技术可行性:b/s系统的三层结构把程序按照内部分工及业务逻辑分割成几个相对的独立的程序,一般划分为界面层、业务处理层、数据存储层。而业务处理层根据需要又可以再进一步分割,使程序之间的关系变得清晰,耦合小。对于此订单管理系统实行这样的设计完全可行。
2. 经济可行性:开发本系统成本按我工作小组每人每工作日计算100元人民币,这样合算下来人力总成本为100*3*14=4200人民币,加上开发设备成本合算为1000元人民币,成本总计为5200元人民币。此系统如若开发成功并顺利交于用户使用,可以使得商务机构大大提高定货发货交易的效率,效益总估算为50000元人民币/年,经济上完全可行。
3. 使用可行性:该系统采用普遍而简单的web浏览器作为客户前端,界面良好,操作易于上手,且功能一目了然,完全可行。
4. 法律可行性:本系统拥有自主的知识产权,属于合法开发,可行。
目标设计
1. 客户订购系统的主要功能要求
l         用户可以随时登陆或注册,购物车中的商品不会丢失
l         用户可以随时找回密码,密码将发送到其注册时候填写的信箱
l         用户申诉功能,如果用户订单未被处理,可以随时提出申诉(需要提供订单编号和用户帐号)
l         用户在最后支付时,可选择不同的支付方式,将看到不同的信息
l         用户可以随时查看站务公告(站务公告将公布最新消息)
2. 管理员管理系统的主要功能要求
l         用户管理(批量查看用户资料,查询/编辑/修改帐号)
l         订单管理(批量查看所有订单、根据订单查询、查看用户申诉)
l         邮件管理(发送邮件、设置邮件默认标题/内容)
l         商品管理(批量查看所有商品、添加商品、查看/修改/删除商品)
l         其他管理部分(添加公告、浏览/删除公告、设置用户折扣比例、设置用户级别、设置积分与级别关系、添加支付方式、浏览和删除支付方式)
l         加入了在线支付接口代码。完全实现在线购买(此支付代码为招商银行的支付代码、用户在使用时需向当地招行申请商户资格、申请完毕后只要修改银行的ID和商户的ID即可)
l         超级管理员可以添加普通管理员
设计思路及数据字典
系统功能设计
根据系统功能的要求,订单管理系统各个模块之间的关系如图一:

查看所有订单
对未执行的订单加备注
参考订单的执行流程
会员登陆
显示现有未执行完的订单选择其他的订单跟踪操作
订单执行进度流程图
订单显示
显示所有订单
订单的详细内容
订单的详细内容
加备注内容
查看未执行完的订单
图一

系统的h
 
0层图:

订单管理系统客服系统
系统数据库
订单管理系统管理员系统

1层图:

匿名用户登陆
系统数据库
管理员登陆
文本框: 真实用户登陆文本框: 新用户注册文本框: 订购商品1.1文本框: 找回密码文本框: 订单申诉文本框: 查看站务公告文本框: 用户与订单管理1.2文本框: 其他管理1.3文本框: 商品管理1.4

2层图:
1.1

订购商品
分类浏览商品
预定到购物车
预定到购物车
确认支付
银行接口

1.2
用户与订单管理
文本框: 用户管理2.1文本框: 邮件管理2.2文本框: 订单管理2.3

商品管理
1.3

1.4
其他管理
文本框: 主分类管理2.4文本框: 分类别管理2.5文本框: 商品管理2.6文本框: 填加公告文本框: 浏览和删除公告文本框: 设置用户折扣比例文本框: 登出文本框: 浏览和删除支付方式文本框: 设置用户级别文本框: 设置积分与级别关系文本框: 添加支付方式 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

3层图:2.1

用户管理
文本框: 批量查看用户资料文本框: 查询编辑修改帐号

邮件管理
2.2

 
文本框: 发送邮件文本框: 设置邮件默认标题和内容 
 
 
 
 
 
 
 
 

2.3

订单管理
文本框: 批量查看所有订单文本框: 查看用户投诉文本框: 根据订单批号查询 

 
 
 
 
 
 
 
 

2.4

主分类管理
文本框: 添加删除主分类文本框: 修改合并主分类 

 
 
 
 
 
 
 
 

2.5
分类别管理
文本框: 添加删除分类别文本框: 修改合并移动分类别

2.6

商品管理
文本框: 批量查看所有商品文本框: 添加商品文本框: 查看修改删除商品 

 
 
 
 
 
 
 
 
 
 

数据库设计与实现
数据库需求分析
l         用户信息
l         管理员信息
l         订单信息
l         商品明细表
l         折扣信息
l         付款方式信息
l         电子邮件管理列表
l         公告栏内容
 
数据库的逻辑设计
对于系统用户信息数据库,可以列出以下数据项和数据结构:
l         用户信息:用户名、姓名、密码、所在省市、电子邮件、电话、住址、享受打折比例、积分
l         管理员信息:用户名、姓名、密码
l         订单信息:用户名、订单号、时间、总金额、支付方式、交易是否已经完成、送货地点、电子邮件
l         商品明细表:货号、商品子类、商品分类、数量、名称、价格、订购数量、说明、是否打包、图例、是否推荐
l         折扣信息:折扣等级、折扣值、积分
l         付款方式信息:付款方式、付款方式说明、时间、交易人姓名
l         电子邮件管理列表:邮件主题、邮件内容、寄信人
l         公告栏内容:标题、内容、发布时间、发布人姓名
数据字典卡片

名字:adminuser
     别名:管理员信息
     描述:管理员名称和密码
     定义:adminuser=username+password+ID
     位置:服护器数据库
 

 

    
名字:discount
别名:打折信息
描述:物品的优惠打折情况表
定义:discount=ID+discount+leavel+jifen
位置:服护器数据库
 
 
名字:maildefault
别名:电子邮件
描述:用户的电子邮件地址主题邮件内容
定义:maildefault=ID+mailsubject+mailbody+frommail
位置:服护器数据库

名称:paydefault
别名:付费
描述:付费方式和时间交易人
定义:paydefault=ID+paymenttype+idate+senfuser
位置:服护器数据库
名字:orders
别名:订单信息
描述:用户购物数量、时间、总金额、付费方式
定义:orders=ID+username+inbillno+ordertime+summony+
paymenttype+comp+saddress+semail
位置:服护器数据库
名字:message
别名:消息
描述:公布栏内容
定义:message=ID+subject+message+idate+senduser
位置:服护器数据库

 
 
 
 
 
 
 
 
 
 
 
 
 

名字:subs
别名:商品信息
描述:商品的类型数量以及价格订购数量
定义:subs=ID+subs+area+bigarea+subsnumber+subsnme
           price+add+bookbm+other+ispacket+photo+
           top+tuijian
位置:服护器数据库
 

 
 
 
 
 
 

名字:user
别名:用户信息
描述:用户的名字密码和住址联系方式
定义:user=ID+username+password+userform+
           oicq+email+telephone+discount+
位置:服护器数据库

数据库的结构创建
根据数据库需求的分析,建立如下8个数据表(基于Access):
(为了以后简化具体设计时对数据库的处理,我们决定把字段名设计成英文名,具体如下)
       系统用户信息数据表(users):
字段名称
数据类型
字段说明
ID
自动编号
 
username
文本
用户名
password
文本
密码
userfrom
文本
所在省市
oicq
文本
Oicq号
email
文本
电子邮件
telphone
文本
电话
discount
数字
打折比列
sumjifen
数字
积分
 
管理员信息表(Adminuser):
字段名称
数据类型
字段说明
ID
自动编号
 
username
文本
用户名
password
文本
密码
 
订单信息数据表(orders):
字段名称
数据类型
字段说明
ID
自动编号
 
username
文本
用户名
inbillno
文本
订单号
ordertime
文本
定货时间
summoney
文本
总金额
paymenttype
文本
支付方式
comp
是/否
交易是否完成
saddress
文本
送货地址
semail
文本
发送电子
 
商品明细表数据表(subs):
字段名称
数据类型
字段说明
ID
自动编号
 
subs
文本
货号
area
文本
商品子类
bigarea
文本
商品分类
subsnumber
文本
数量
subsname
文本
名称
price
数字
价格
add
文本
是否已经加入
bookbm
文本
订购数量
other
备注
说明
ispacket
文本
是否打包
photo
文本
图例
top
文本
是否在顶层
tuijian
文本
是否推荐
 
折扣信息数据表(discunt):
字段名称
数据类型
字段说明
ID
自动编号
 
discount
数字
折扣等级
leavel
文本
折扣值
jefen
数字
积分
 
付款方式信息数据表(paydefault):
字段名称
数据类型
字段说明
ID
自动编号
 
paymenttype
文本
付款方式
paymentmessage
备注
付款方式说明
idate
文本
时间
senduser
文本
交易人姓名
 
电子邮件管理数据表(maildefault):
字段名称
数据类型
字段说明
ID
自动编号
 
mailsubject
备注
邮件主题
mailbody
备注
邮件内容
frommail
文本
寄信人
 
公告栏内容(message):
字段名称
数据类型
字段说明
ID
自动编号
 
subject
文本
标题
message
文本
内容
idate
文本
发布时间
senduser
文本
发布人姓名
 
===========================================================================================
源代码省略
===========================================================================================
                            开发难点与解决技巧
include的方法与实现数据库的打开操作:
对于一个Wab站点而言,一般每个页面的顶部或尾部基本上都是相同的,那么你可以将这些相同的部分放在一个文件中,在学要时引用他。
在处理用户登录和注册的页面中,由于同一数据库的打开操作十分频繁,所以用include的方法,简化代码,如下的代码是adduser.asp的开头,第一行中的include所包含的就是userconn.inc这一文件:
<!--#include file="inc/userconn.inc"-->
<html>
<head>
<title>用户注册</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
本系统将所有象userconn.inc这样的文件放在系统的根目录下的inc子目录下,以便修改和查找,这也是asp编程中的一个常识技巧。下面具体看看userconn.inc:
     <%     Set Conn=Server.CreateObject("ADODB.Connection")
Connstr="DBQ="+server.mappath("database.mdb")+";DefaultDir=;DRIVER={Microsoft Access Driver (*.mdb)}"
Conn.Open connstr
   %>
可以看出,userconn.inc的作用就是打开数据库database.mdb。最后需要说明的是,include file可以放在网页的任意地方,但必须位于所有ASP代码块的外部,asp解释器发现include file时,所作仅仅是简单的将文件的内容复制到包含它的代码中。
分页技术:
 见面介绍了如何检索数据并输出到浏览器端,对数据量大的情况,采取分页输出是 非常必要的。
错误处理:
代码的执行过程中,可能因各种原因发生错误,如:代码本身有问题、网络断开等,所以在程序中设计错误捕获和处理是非常必要的。
 在本系统中,采用采用错误处理方法是,将所有错误的处理集中在同一界面error.asp中,在各个功能页面发生错误时就重定向到error.asp中,交给error.asp作统一处理, error.asp的代码在主程序中有。
==============================================================================
                                                                                  课程设计心得
说到本次课程设计的心得和体会,真是一言难尽。首先我们所用的工具——ASP,我们以前基本没有接触过,这就要求我们现学ASP教程,无疑给我们的进程增加了难度:去书店找书,学习教程,实践中摸索,掌握技巧,解决困难……还有就是团体的合作,三个人完成一个项目和一个人完成是不一样的,三个人必须做到合作而且发挥自己的特长,才能使我们的项目完成的速度快而且质量高。我们组的三人都尽力做到了这些,共同克服困难,基本完成了任务。必须指出的是:我们从现学的ASP出发所完成的项目,不足之处再所难免。总的来说:本次课程设计给了我们一次学习和锻炼的机会,完善了自我,为我们以后的学习和工作增加了砝码。
=============================================================
                                                      系统重要画面
 贴不了本地的图片,传到互连网上太慢了,省略。
==============================================================================
END

   


 
爪哇流氓 @ 2007-07-10 10:58

        从自身经历的角度谈谈企业信息化软件项目经理的能力和主持项目时应关注的问题和焦点,不足之处请广大同行指点,大家一起交流共同进步。
        我国的软件企业大部分是以接项目的形式做为生存和发展的途径,项目有大有小,大的二三百万,小的三五万,因此项目的成败及效率就直接影响着公司运营成本和利润以及大家的薪金收入。而项目经理的人选则决定了项目的成败和收益,因此结合自己的经验谈谈项目经理在主持项目实际运作时的二个责任观点三种协调关系和应具备的四个能力。
        MIS软件项目经理应时刻记住自己的两个责任和观点:
  一、如何尽快地将项目验收回款,为公司和团队创造更多的利润,为下属带来更多的利益。

  二、如何在做项目的过程中将项目提练成产品。

  我的观点是以项目提炼出产品并养活产品,而产品则更好地为项目服务以创造更大的利润和发展空间。

  MIS软件项目经理应具有三种协调关系:

  一、协调好和客户的关系,保证客户交流时的气氛活跃活泼,事情做不完,明天可以再做,但客户的心情一定要开心!

  二、协调好和上级的关系,这样你才会有行使项目经理的职权及争取到更好的资源配置。

  三、协调好和下属的关系,他们才是为真正为项目打拼并出成绩的核心人员。

  MIS软件项目经理应具有的四个能力:

  一、学会引导客户

  作为MIS软件,会不会引导客户是整个项目进度的成败。因为一个软件公司做项目时一般都有一个半成品,这时候项目经理和客户谈程序时的作用就是举重若轻,若会引导客户,则程序的二期开发量将会非常小,我当初拿着一个程序版本和客户谈时,连续三个大模块都获得客户的认可,只有3×0.5天工作量,而内部计划里则是3×20天的工作量的,同样项目提前了近两个月就转入验收期了。我当初获得这么大的成功,主要有两点:一是对自身软件产品非常熟,谈时扬长避短,并引导了客户。二是当时和客户谈时我说的都是模块的整体业务和模块的业务流程运作,引导客户并在大方向上达成了一致,不陷入技术细节。题外话:当时讲解时出现保存不正确的现象,我当时则没陷入这问题,而是说数据保存后将转入到下一个流程而过关的。


          二、对客户需求的认知及把握开发进度估算


  在项目推进过程中,不可避免地出现程序需求差异,需求变更和新需求的情况。此时项目经理就肩负着项目开发周期和任务及资源的调整问题,这就要求项目经理能够对客户需求的正确认知和把握及对开发进度的估算。当项目经理面临着需求变更程序变动时,需在最短时间在心里做完的事情是:1、估算出需要的人力和工作日 2、如果做则对整个项目时间周期的影响 3、此项工作的重要度和紧急度,应当安排在什么时候做。然后将结果和客户交流并达成一致,最好用书面形式留档。以项目中一个三个工作日新模块的开发为例,在充分理解客户的基础上如果会引导客户,则三个工作日后该模块就可顺利完成并得到客户的认可。如果不会引导客户,再加上自己对需求的理解不正确又没把握好,用上两个月都有可能,这样使得合同里是半年的项目最后做成了一年而程序还在开发,项目成了程序垃圾的汇集地。国内不少软件公司或多或少都存在这现象。


          三、如何有技巧地说不和点头

  在项目推进过程中将会出现非常多的需求,其中有些需求是当初没考虑好,有些需求是迫切的(比如领导发现后提的),有些需求是无理的而且困难度大,有些需求则是没有意义的,有些需求是技术上达不到的,有些需求是必要的,有些是合理的,有些是合理但不必要的,……。因为需求的变更必然引起工作量的增加和人员的调配,有时处理不好就会使得项目验收遥遥无期甚至和客户关系变僵,所以此时就需要项目经理有技巧地说不和点头了。记住一点:客户是上帝,但你不是基督教徒。我有一次在准备将项目转入验收期和他们的老总谈程序时,那老总要求在一个FORM单独做报表打印,而我们的报表打印都是集中在一起的,在和那老总交流解释后我宣布的就是:做,而且连夜赶工,明天一早就得在纸上看到。结果当然是项目顺利转入验收期了。我常用的说不的方法是现在的工作重点是什么什么,你所提的问题我们将在几个月后程序升级时自动将这需求解决的。

     四、计划与实际现场运作的时间点观念及协调统一

  在项目推进过程中经常会出现计划变更等情况,这时项目经理要做的事:一、根据实际情况调整你的计划,并做好充分的预估(我一般是将困难说大一点,日期长一些)。二、将变更原因和你的新计划向你的上级汇报。三、和你的同事开会协商宣布时同时宣布人员安排和日期安排。记住一点:项目要想做好,时间点是个关键。这样就会因为团队的实力和项目经理的能力而出现加班和强度压力工作的频繁情况,如何让你的下属能够更愿意为这项目打拼,就需要你的协调交流和组织能力了。大家不要忘了两句话:我们的职权是谁赋于的?项目经理和你的同事一样都是打工的。所以大家也知道我在做项目时一和二的用途了吧!



 
爪哇流氓 @ 2006-08-16 11:32

            得到大哥83岁高龄的祖父仙逝的消息,便马上筹备了我们一帮人商定要送的奠礼,与他随车匆忙赶往那个名叫金鸡坳的小村落.
村落不大,三三两两摆布着几幢房子,新的,旧的.高的,矮的都有.而那时将近晌午,烟囱里冒出的袅袅炊烟让人不免觉得饥肠轱辘.好容易一路颠簸到了目的地,就远远看见灵堂已经搭设完毕,城里的人,乡里的人各司其职在忙碌着.
一下车,首先是鸣放鞭炮,两卷十万响的电光炮噼里啪啦响彻天空,好不热闹.接着,我神情肃穆地步进那间由土砖构砌的老堂屋,毕恭毕敬地向老太爷磕头上香,这不仅是因为我与大哥感情笃深,如同手足,必须衔哀致诚,以吊往者,而我此行也带去了远在异地的那帮兄弟姐妹的拳拳盛意.
乡下办丧事,据我的经历和观察,是分外隆重的,与婚嫁一般,极为人们关注,是古代礼制在现代社会的鲜活体现.不过说一千道一万,就是宾主双方的行为要合乎礼的规范:宾客不仅要表示对逝者的悼意和对主人(逝者家属)的关慰,也应视交往深浅和自身经济条件的优劣在奠礼上做全人情面子;主人则需在跪拜答礼和烟酒饭食招待等方面对宾客以及附近那些来帮忙的农夫农嫂表示谢意,切不可怠慢.经过一番礼数上的来往,复杂难办的丧事便由于众人拾柴火焰高而顿时变的热闹而体面了.
既有如此多人热烈参与,就该有个中心,其他人则是为这个中心服务的,不然就会群龙无首,没有章法。一般说来,乡下丧事的中心是嫡长子和嫡长孙,大哥作为老太爷唯一的嫡孙,他肩上的担子委实不轻。既要跪拜祭奠焚、焚化纸钱,还要向宾客答礼,抽空接待他们,如真有分身之术那确实可以减轻他的负担的。丧事由始至终,大哥都没有好好休息过。累了也是随便找处地方打一小会盹,一有召唤就得立马翻身而起,其劳其累数倍于平常的工作量。记得进行“一百零八拜”时,他抱着灵位跟着和尚转圈,还要频频跪拜,尤其折磨人的是最后要响大量鞭炮,浓郁的硝烟,刺进鼻孔,钻入喉咙,苦不堪言。但没有办法,作为嫡孙是要吃这些苦头的,大哥没有半句怨言,下乡随俗嘛。我在旁虽有心想替他“暂时下场”,但经历过几次大丧事的我又深知:这种事决不可越趄代庖,大哥理应承受种种这些“磨难”。人不也是一样吗?该扛的时候就要扛住。
有人很奇怪大哥为什么以光头出现在这种场合,终于有位老人道出了其中原委:按乡村旧礼,老人过世后儿孙要留“百日头”即一百天内蓄发不剃,以表孝心。大哥为了方便留“百日头”,就干脆剃了个光头,是从风俗。孝哉甚也!其实在老太爷出殡的那天,我半搀着大哥,只见他顶着当空的烈日,由于没有头发的保护,也不能戴帽子,头、脸、颈这几处如绿豆般的汗珠流个不止,我只好用湿毛巾为他稍作檫拭,仍能对他被日光暴晒以致灼热的头皮感同身受,加之山道崎岖狭窄,到老太爷下葬结束,大哥捧遗像的双手已经麻木而不觉疼痛了,衣服也析出了汗水中的盐分——一大片一大片的白色。
之所以老太爷能够顺利而热闹地入土为安,很重要的一个原因就是不能离不开附近乡民的襄助。时值农忙,大家都要忙双抢,但传统的观念和中国农民天然的淳朴使得乡民能够顾义全礼,不计得失投入到繁琐亦不失辛苦的丧事中来。城里人很难忍受人多又炎热的环境,我们便提个西瓜去寻个农家乘凉。乡民们象征性地吃了几块西瓜,接了根烟就笑呵呵地把家中全部的电扇搬出来,腾出位置供我们休息。要知道,电扇是他们平时是舍不得用的,而对着我们吹的那几台电扇,是被拧到了最大档位的。不巧那天我乘凉时发现裤子被划破了一个大口子,那户农家的女主人便爽快地应我所求找出针线帮我缝补。当我看到那里的农家夜不闭户的那一刻,想到白日里乡民的朴实与热情,淡泊与憨厚,心头一震:安静的池塘、零星的村庄、因为交通不便利而远离城市的乡民不正构成了一幅现代的桃花源景象吗?五柳先生笔下的世外桃源固然风光恬美,胜似仙境,但更可贵的应是桃花源中“黄发垂髫,怡然自得”的朴素心情和与世无争的人生态度。设若时下急功近利的城里人真的入住桃花源中,惟恐连那美不胜收的自然景物都要大打折扣哩。
我由此顿悟:无论何时何地保持一份平常、淡雅的心态乃是人生最最紧要之事。佛曰“无常”,道说“无为”实是为那些整天奔走于功名利禄的世人开具的良方,奈何总是“原本将心鉴明月,明月偏偏照沟渠”。
我将在那个村落所在的县城工作,假使有机会,我定会当好那些乡民的“公仆”,为他们创造丰收果实的条件。因为,他们真的让我感动,真的…………


 
爪哇流氓 @ 2006-08-16 11:17

好久没来了,好多朋友都问我:你的博客好久都没写了哦,是啊,确实很久没写了。 

这一段好忙,不仅仅是工作上事情特别多,私人事情饿挺多的,有时候晚上回家,打开电脑,正想要写点什么的时候,鼠标都没抓稳,不到几分钟就睡着了。哎,岁月催人老啊,身体抗不住了。

爷爷去世了,回去了一趟,做了我应该做的一些事情。

等下发一篇兄弟写的文章。。。



 
爪哇流氓 @ 2006-06-09 13:33

abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的面向对象能力。abstract class和interface之间在对于抽象类定义的支持方面具有很大的相似性,甚至可以相互替换,因此很多开发者在进行抽象类定义时对于abstract class和interface的选择显得比较随意。其实,两者之间还是有很大的区别的,对于它们的选择甚至反映出对于问题领域本质的理解、对于设计意图的理解是否正确、合理。本文将对它们之间的区别进行一番剖析,试图给开发者提供一个在二者之间进行选择的依据。

理解抽象类

abstract class和interface在Java语言中都是用来进行抽象类(本文中的抽象类并非从abstract class翻译而来,它表示的是一个抽象体,而abstract class为Java语言中用于定义抽象类的一种方法,请读者注意区分)定义的,那么什么是抽象类,使用抽象类能为我们带来什么好处呢?

在面向对象的概念中,我们知道所有的对象都是通过类来描绘的,但是反过来却不是这样。并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。抽象类往往用来表征我们在对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。比如:如果我们进行一个图形编辑软件的开发,就会发现问题领域存在着圆、三角形这样一些具体概念,它们是不同的,但是它们又都属于形状这样一个概念,形状这个概念在问题领域是不存在的,它就是一个抽象概念。正是因为抽象的概念在问题领域没有对应的具体概念,所以用以表征抽象概念的抽象类是不能够实例化的。

在面向对象领域,抽象类主要用来进行类型隐藏。我们可以构造出一个固定的一组行为的抽象描述,但是这组行为却能够有任意个可能的具体实现方式。这个抽象描述就是抽象类,而这一组任意个可能的具体实现则表现为所有可能的派生类。模块可以操作一个抽象体。由于模块依赖于一个固定的抽象体,因此它可以是不允许修改的;同时,通过从这个抽象体派生,也可扩展此模块的行为功能。熟悉OCP的读者一定知道,为了能够实现面向对象设计的一个最核心的原则OCP(Open-Closed Principle),抽象类是其中的关键所在。

从语法定义层面看abstract class和interface

在语法层面,Java语言对于abstract class和interface给出了不同的定义方式,下面以定义一个名为Demo的抽象类为例来说明这种不同。
使用abstract class的方式定义Demo抽象类的方式如下:

abstract class Demo {
abstract void method1();
abstract void method2();
…
}

使用interface的方式定义Demo抽象类的方式如下:

interface Demo {
void method1();
void method2();
…
}

在abstract class方式中,Demo可以有自己的数据成员,也可以有非abstarct的成员方法,而在interface方式的实现中,Demo只能够有静态的不能被修改的数据成员(也就是必须是static final的,不过在interface中一般不定义数据成员),所有的成员方法都是abstract的。从某种意义上说,interface是一种特殊形式的abstract class。

从编程的角度来看,abstract class和interface都可以用来实现"design by contract"的思想。但是在具体的使用上面还是有一些区别的。

首先,abstract class在Java语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个interface。也许,这是Java语言的设计者在考虑Java对于多重继承的支持方面的一种折中考虑吧。

其次,在abstract class的定义中,我们可以赋予方法的默认行为。但是在interface的定义中,方法却不能拥有默认行为,为了绕过这个限制,必须使用委托,但是这会 增加一些复杂性,有时会造成很大的麻烦。

在抽象类中不能定义默认行为还存在另一个比较严重的问题,那就是可能会造成维护上的麻烦。因为如果后来想修改类的界面(一般通过abstract class或者interface来表示)以适应新的情况(比如,添加新的方法或者给已用的方法中添加新的参数)时,就会非常的麻烦,可能要花费很多的时间(对于派生类很多的情况,尤为如此)。但是如果界面是通过abstract class来实现的,那么可能就只需要修改定义在abstract class中的默认行为就可以了。

同样,如果不能在抽象类中定义默认行为,就会导致同样的方法实现出现在该抽象类的每一个派生类中,违反了"one rule,one place"原则,造成代码重复,同样不利于以后的维护。因此,在abstract class和interface间进行选择时要非常的小心。

从设计理念层面看abstract class和interface

上面主要从语法定义和编程的角度论述了abstract class和interface的区别,这些层面的区别是比较低层次的、非本质的。本小节将从另一个层面:abstract class和interface所反映出的设计理念,来分析一下二者的区别。作者认为,从这个层面进行分析才能理解二者概念的本质所在。

前面已经提到过,abstarct class在Java语言中体现了一种继承关系,要想使得继承关系合理,父类和派生类之间必须存在"is a"关系,即父类和派生类在概念本质上应该是相同的(参考文献〔3〕中有关于"is a"关系的大篇幅深入的论述,有兴趣的读者可以参考)。对于interface 来说则不然,并不要求interface的实现者和interface定义在概念本质上是一致的,仅仅是实现了interface定义的契约而已。为了使论述便于理解,下面将通过一个简单的实例进行说明。

考虑这样一个例子,假设在我们的问题领域中有一个关于Door的抽象概念,该Door具有执行两个动作open和close,此时我们可以通过abstract class或者interface来定义一个表示该抽象概念的类型,定义方式分别如下所示:

使用abstract class方式定义Door:

abstract class Door {
abstract void open();
abstract void close();
}

使用interface方式定义Door:

interface Door {
void open();
void close();
}

其他具体的Door类型可以extends使用abstract class方式定义的Door或者implements使用interface方式定义的Door。看起来好像使用abstract class和interface没有大的区别。

如果现在要求Door还要具有报警的功能。我们该如何设计针对该例子的类结构呢(在本例中,主要是为了展示abstract class和interface反映在设计理念上的区别,其他方面无关的问题都做了简化或者忽略)?下面将罗列出可能的解决方案,并从设计理念层面对这些不同的方案进行分析。

解决方案一:

简单的在Door的定义中增加一个alarm方法,如下:

abstract class Door {
abstract void open();
abstract void close();
abstract void alarm();
}

或者

interface Door {
void open();
void close();
void alarm();
}

那么具有报警功能的AlarmDoor的定义方式如下:

class AlarmDoor extends Door {
void open() { … }
void close() { … }
void alarm() { … }
}

或者

class AlarmDoor implements Door {
void open() { … }
void close() { … }
void alarm() { … }
}

这种方法违反了面向对象设计中的一个核心原则ISP(Interface Segregation Priciple),在Door的定义中把Door概念本身固有的行为方法和另外一个概念"报警器"的行为方法混在了一起。这样引起的一个问题是那些仅仅依赖于Door这个概念的模块会因为"报警器"这个概念的改变(比如:修改alarm方法的参数)而改变,反之依然。

解决方案二:

既然open、close和alarm属于两个不同的概念,根据ISP原则应该把它们分别定义在代表这两个概念的抽象类中。定义方式有:这两个概念都使用abstract class方式定义;两个概念都使用interface方式定义;一个概念使用abstract class方式定义,另一个概念使用interface方式定义。

显然,由于Java语言不支持多重继承,所以两个概念都使用abstract class方式定义是不可行的。后面两种方式都是可行的,但是对于它们的选择却反映出对于问题领域中的概念本质的理解、对于设计意图的反映是否正确、合理。我们一一来分析、说明。

如果两个概念都使用interface方式来定义,那么就反映出两个问题:1、我们可能没有理解清楚问题领域,AlarmDoor在概念本质上到底是Door还是报警器?2、如果我们对于问题领域的理解没有问题,比如:我们通过对于问题领域的分析发现AlarmDoor在概念本质上和Door是一致的,那么我们在实现时就没有能够正确的揭示我们的设计意图,因为在这两个概念的定义上(均使用interface方式定义)反映不出上述含义。

如果我们对于问题领域的理解是:AlarmDoor在概念本质上是Door,同时它有具有报警的功能。我们该如何来设计、实现来明确的反映出我们的意思呢?前面已经说过,abstract class在Java语言中表示一种继承关系,而继承关系在本质上是"is a"关系。所以对于Door这个概念,我们应该使用abstarct class方式来定义。另外,AlarmDoor又具有报警功能,说明它又能够完成报警概念中定义的行为,所以报警概念可以通过interface方式定义。如下所示:

abstract class Door {
abstract void open();
abstract void close();
}
interface Alarm {
void alarm();
}
class AlarmDoor extends Door implements Alarm {
void open() { … }
void close() { … }
void alarm() { … }
}

这种实现方式基本上能够明确的反映出我们对于问题领域的理解,正确的揭示我们的设计意图。其实abstract class表示的是"is a"关系,interface表示的是"like a"关系,大家在选择时可以作为一个依据,当然这是建立在对问题领域的理解上的,比如:如果我们认为AlarmDoor在概念本质上是报警器,同时又具有Door的功能,那么上述的定义方式就要反过来了。

结论

abstract class和interface是Java语言中的两种定义抽象类的方式,它们之间有很大的相似性。但是对于它们的选择却又往往反映出对于问题领域中的概念本质的理解、对于设计意图的反映是否正确、合理,因为它们表现了概念间的不同的关系(虽然都能够实现需求的功能)。这其实也是语言的一种的惯用法。


 
爪哇流氓 @ 2006-06-07 10:10

一个同事,男性,年龄大概在28-29岁左右,长得一般,胡子拉茬的,但是认为自己很帅,从为人处世上来看,基本没什么阅历,还要装做自己城府很深,阅人无数的样子.情绪不是很稳定,很喜欢做作,看了实在叫人恶心,我写着写着就联想起他那副故做深沉的嘴脸,真是痛心疾首,饭都不想吃了.男人玩深沉不要紧,重要的是要从内而外的散发出来,而不是矫柔造作的摆弄姿态,那样只会适得其反,叫人反感.这个同事不知道什么时候能清醒过来,送给他一句话,还没有达到"大智"的时候,就不要"若愚",蠢货!


 
爪哇流氓 @ 2006-06-06 12:53

刚来这边工作的时候,由于现在中国教育制度严进宽出的弊端,在学校里学的东西基本派不上用场.就只能拼命的自学,看书,上网查资料,看别人的技术论文和公司的设计文档.吃的是技术饭,技术上不懂等于是个废人,白天只能帮组里人打打杂,开会就做做记录,要不就帮别人吵文档,有时还要去搬搬电脑,反正也不会让你很闲着.一空下来我就自己看书学习,或者在计算机上实践实践,白天自由的时间不是很多,那时候是8点上班5点下班,下了班后,我就在食堂随便吃点,然后回来加班,加班干吗呢,又开始看技术方面的书啊,资料啊,自己做做小实践啊.这样每天如此,将近持续了3个多月,肚子里总算是有那么点东西了,算是入门的初级工了,但还是在别人说什么我就做什么这个层次上,因为自己的功力还不够,打个比喻,只能是别人做好鞋,我来装箱.我这个人不太喜欢向别人请教,喜欢自己默默钻研,所以不太多问同事和前辈什么问题,一般是他们在讨论,我就用心听,听不懂的先记下来,回去自己慢慢琢磨,翻资料啊,看公司原来项目的分析书啊,反正是搞七搞八的,每天都基本到12点才休息.这样又持续了3个多月.终于,算个中级普工了,这样可以做点小设计了,有时的思路还不错,前辈们觉得还有那么点意思了,经常拍着我的肩膀说:小伙子,不错嘛,进步不小啊!是啊,进步是不小,那是我的睡眠和头发换来的,这半年里,头发真掉了不少,一是计算机辐射大,二是天天神经紧张,工作完了还要学习,休息时间太少......
之后的日子我就更加努力了......虽然我智商不高,但我这个人舍得死,拼得命,结果终于有一天,我说的话前辈们开始有点听不懂了(我一来的时候是他们说的话我基本听不懂,当然不是方言,是专业技术领域的一些东西),从参加工作到这一天,一共差不多是365天.这个时候我照镜子的时候,发现人苍老了很多,头发怎么越来越稀疏了......

年纪不是很大,又还没找朋友没成家的男人就这个,当然我是非常紧张的,我也不想因为这个到时候找不到老婆,哈哈.所以,我小小治疗了一把,效果还行,至少把掉发控制到了正常范围,长没长到不是很清楚.一些朋友都开始叫我"秃子"了,哎......

最近又有点掉头发了,没怎么去管,时常照着镜子看着自己稀疏的顶,回忆原来一头又黑又密的头发时候的帅哥形象,那是多好的时候啊,一个人的头发真的很重要,它能改变一个人的精神面貌和整体形象,哎,我遗失的头发啊,看来你是回不来了,我的妹妹们啊,你们估计也不会来了......