书城科普读物探索未知-诗歌与数学
8885000000008

第8章 韵律与密码

古人喜欢用诗来作为传递信息的工具,除了用诗句直接传递信息之外,还有把诗作隐语或密码用的。

北宋时期,辽和西夏已经十分强大,他们频频进犯中原。为了窃取北宋的军事情报,赢得战争的胜利,便常常派遣间谍潜入中原,刺探各种情报。当时的军机要件,大都是派心腹直接投送的。当时的军事著作家曾公亮注意到军事通讯工作中保密的重要性,指出泄密的危害,因而要求加强保密措施。他认为旧的军事通讯技术有严重缺点:“旧法军中启事,若以文牒往来,须防泄漏;以腹心报事,不惟劳烦,亦防人情有离叛。”为了解决这个问题,曾公亮设计了一种保密技术,即编制了一种特殊的通讯密码表,保存在他编纂的《武经总要》一书中。其所用的解密码的密钥竟是一首唐诗。

曾公亮所用的方法是:将军中常用的40个军事术语,分别编为相应的数字代码。例如:1.请增兵;2.请增粮;……

40.被贼围。

等等。再选定一首没有重复字的五言律诗(三言8句,共40个字)作为密钥。大将军率兵出征时,主帅便发给他一个密码本,即40个军事常用术语的代码,又发给他一首没有重复字的五言律诗作为解码的密钥。例如,下面这首唐诗就可作为解码的密钥:八月湖水平,含虚混太清。

气蒸云梦泽,波撼岳阳城。

欲济无舟楫,端居耻圣明。

坐观垂钓者,徒有羡鱼情。

假如统兵大将的粮草已经不多,急需后方增粮。这时他可在密码本上查出“请增粮”的代码是2,唐诗中的第2个字是“月”。于是,他可马上编发一道嵌有“月”字的普通公文,并在“月”字上加盖他的印章,以表示此字是关键。公文到达后,统兵主帅立即从密码本上查出统兵大将的意图。

这种通讯的保密方式很好。因为40个常用军事术语,可以按任意的)顺序随便编排,五言律诗又多得“不计其数”,只要主帅和大将之间的密码本和密钥不落入旁人之手,以当时的科技水平而言,这种密码几乎是不可能破译的。

随着时代的进步,现代通讯技术多采用数据通讯。而诗与数据也有非常密切的联系哩。

例如,旧体诗词都有一定的平仄格式,平仄指的是两种不同的声调,是诗词格律中最基本的要素。古典诗词中的近体诗,每句诗中各字的平仄都有明确的规定。它们是按照字的不同声调相互协调搭配而成的,是为了造成诗的节奏、旋律、表现出诗的音乐美。

例如杜牧的七言绝句《题乌江亭》一诗,他用的是这样一种平仄格式:胜败兵家事不期,——仄仄平平仄仄平包羞忍耻是男儿,——平平仄仄仄平平江东子弟多才俊,——平平仄仄平平仄卷土重来未可知。——仄仄平平仄仄平

项羽兵败,自刎乌江之后,历代文人同情项羽的颇多,认为项羽如能回到江东,或偏安一隅,或卷土重来,事情还难以预料。杜牧的这首诗可以说是一个典型的代表。但是宋朝的王安石,则以他政治家独特的眼光,认为项羽在垓下失败以后,大局已定,无可挽回。即使回到江东,也已失去民心,再没有人肯为他卖命了。王安石也写了一首《乌江亭》,对杜牧反唇相讥:百战疲劳壮士哀,——仄仄平平仄仄平中原一败势难回。——平平仄仄仄平平江东子弟今虽在,——平平仄仄平平仄肯与君王卷土来?——仄仄平平仄仄平

两位诗人的观点不同,可他们使用的平仄格式却完全一样。

大凡是有某种结构或规律的东西,就有数学的用武之地。对于近体诗的平仄格式,我们也可以将它转化为数学对象。如果我们用1代表“仄”声,用0代表“平”声,那么,上面所涉及的这两首七言绝句的平仄格式,就转化为下面的形式:1 1 0 0 1 1 00 0 1 1 1 0 00 0 1 1 0 011 1 0 0 1 1 0

这个表叫做一个“4×7维布尔矩阵”。矩阵中的每一行,例如第一行(1,1,0,0,1,1,0)叫做一个“7维布尔向量”。每一个数叫做布尔向量的一个“分量”,一个布尔向量中分量的个数称为它的“维数”。将m个n维布尔向量按顺序排成一个表,就称为一个“m×n维布尔矩阵”。因此,一个“m×n维布尔矩阵”是一个由m×n个数组成的数表,每个数不是1就是0,表中共有m行,每一行有n个数。

布尔向量和布尔矩阵都是现代数学的重要概念,在各个领域中都有许多重要的应用。

每一个汉字都可以转化为布尔矩阵。

我们知道,电子屏上显示的数字,都是由7条小光管构成的。如图a所示,7条小光管分别记作f1,f2,f3,f4,f5,f6,f7。

图a图b当fi(i=1,2,…7)取值1时,表示对应的小光管是亮的;当fi(i=1,2…,7)取值0时,则不亮。这样,每一个数字就与一个7维布尔向量相对应。例如图b所示,“3”字的f1,f2,f3,f4,f75个小光管是亮的,f5,f62个小光管是黑的,所以,“3”字就可用7维布尔向量(1,1,1,1,0,0,1)

来表示。

10个数字表示为布尔向量的方法如下表:

f1f2f3f4f5f6f7对应的布尔向量显示数字1111110(1,1,1,1,1,1,0)00110000(0,1,1,0,0,0,0)11101101(1,1,0,1,1,0,1)21111001(1,1,1,1,0,0,1)30110011(0,1,1,0,0,1,1)41011011(1,0,1,1,0,1,1)51011111(1,0,1,1,1,1,1)61110000(1,1,1,0,0,0,0)71111111(1,1,1,1,1,1,1)81111011(1,1,1,1,0,1,1)9。

计算器的屏幕显示就是按这一原理设计的。

我国所用的电报码,今天电脑使用的区位码,都是用4个数字代表一个汉字,因此,如果用7维布尔向量表示一个数字,那么,每一个汉字就可用一个“4×7维布尔矩阵”来代表。例如,“数学”两个字的区位码分别是数——4293,学——4907

它们便分别对应布尔矩阵:

数→01100111101101111101111110014293数→01100111111011111111011100004907

最后,请你考虑一个与布尔向量有密切关系的有趣的问题:某剧团准备连续演出4个月,计划每天至少要上演一个节目,要求任何两天上演的节目都不完全相同(部分节目可以相同)。这个剧团至少要准备多少个节目,才能按要求的条件演出?

把准备的节目按次序编号,如果当天的演出安排中,某节目上演,则将其记作1;某节目不上演,则将其记作0。例如,剧团共准备了7个节目,今天安排上演第一、第二、和第六、第七等4个节目,其余的第三、第四、第五个节目不上演,就可将今天的演出用一个7维布尔向量(1,1,0,0,0,1,1)

来表示。由于7维布尔向量共有27=128个,除了(0,0,……0)外,都可以用作每天的演出安排。4个月最多有122天,所以有7个节目就足够了。但6维布尔向量只有26=64个,如果只有6个节目则显然是不够的。