0%

「生命」对每个人来说,都是永恒的主题。

最近看到一则采访费曼教授的视频,他谈到了他对原子弹的看法。他说当初研发原子弹的时候,整个团队都认为这是为了反制德国。但是当纳粹德国宣布研发原子弹失败后,他们仍然在制造原子弹。最后,原子弹在日本爆炸了。他得知这件事后,很长一段时间里进入到了一种抑郁的状态。他看到正在施工的建筑、形形色色的人们,都觉得他们做的没有意义——要毁掉一切太容易了。

这引起了我的兴趣:我们是怎样看待原子弹这类武器的?我们为什么会这么想?我认为,我们对于核武器以及传统的武器的看法不同,根本原因不在于它们能杀害多少数量的人——生命的价值也不应该用数量衡量。让我们感到震惊和不安的,是我们对生命的「脆弱程度」的认识。现代科学技术,尤其是医学的发展,让我们有了一种错觉:维持自己的生命不是,也不应该是一件费力的事。然而这种错觉最终被打破了:很多东西能轻易夺走人的生命,只是我们一直都被严格的保护着。「仅仅为了活着而竭尽全力」会打破我们习以为常的很多东西:自由、道德和爱……而概括起来,就是「人性」。这是我们引以为傲的,把人和其他动物区别开来的概念。而它正是根植于最基础的人权保障之上的。

当这一切突然抽离,我们面对的就是一个严峻的问题:我们是否要「仅仅」为了活着而活着?有很多末世题材的小说和其他形式的文学都在针对这个问题尝试给出自己的答案。其中有一个我认为挺有意思的:故事设定是人类文明越发达,就越会频繁而大量地受到某种自然灾害的影响。表面上看,这种自然灾害和人类文明的发达程度呈正相关。然而随着故事的推进,你就会发现在经受自然灾害的同时,人类文明也发生了根本性的变化:人类这个种群经受了某种筛选,更有能力抵抗这种自然灾害的人活了下来并且活得更好,从此开始人类变得更加「动物化」了。生存资源的分配模式也变得有些像是「弱肉强食」。人类也就变得更加戏剧化:人类在生存和发展文明中引发自然灾害而开始与其斗争,然而在斗争的过程中人类文明又表现为某种倒退。

不过说到底,我也不太认同「人类」这样一种建构的概念。也不同意人人都有义务为了「人类」不灭亡做出牺牲。因为在组成抽象意义的人类之前,首先是我们每个人本身。「人」本身成为了「使人类种群不被灭亡」的手段是很讽刺和可笑的,甚至连动物也不会做出这样的事。

不过,仍然有很多问题是有待解决的:如果我们终究要死去、人类也终究要灭亡、甚至太阳系也会在很久以后变成一个黑洞,那么我们所做的事情有什么意义?或者说,会不会有一点点意义?我认为,我们有时把「灭亡」和「淘汰」看得太负面了。如果我们退后一步,在整个自然的角度上,「灭亡」和「存活」只是两种状态。我们永远不能真正感受到这件事,因为我们没办法看到已死去的生物——这仅仅是由我们的视角决定的。小到每个人的人生,大到整个自然界的进化过程,也许都不过是一种尝试:一种向稳定追求的尝试。也许一种生物灭亡了,仅仅代表着它不适应所处的环境,但更有可能是无数次可能尝试的进化方向的一小部分。而这些部分组合起来,组成了过去、现在和未来。

5月4日,bilibili发出名叫《后浪》的短片。其中有这样一段话:

向你们的自信致敬

弱小的人才习惯嘲讽和否定

而内心强大的人 从不吝啬赞美和鼓励

向你们的大气致敬

小人同而不和

君子美美与共 和而不同

年轻的身体 容得下更多元的文化 审美 和价值观

——《blibli献给新一代的演讲》

「嘲讽」和「否定」是怎么和「弱小」联系在一起的?我们怎么看待否定?

首先我们需要明确否定的概念和起源。「否定」和「肯定」是一对反义词,在一开始就体现了「相对性」。也就是说,并不天然存在「对」或者「错」这个属性,而是由于我们将事物分成了两类,分别给这两类标上了这两个记号而已。我们具体是怎么分类的呢?分类的标准与我们的动机有关。最基本的动机当然是想通过概括事物的详细属性以把问题简化,但是具体怎么简化就有了很大的分歧,这里也就是我们对同一件事的好坏看法不同的根源。

从这个角度看,片中的台词看起来似乎是没有道理的。如果我们不去否定某些事情,那么我们也无法去肯定另外一些事情。但是我们还没有讲清楚,作出分类之后会对我们造成什么样的影响。如果从方法论上讲,我们「否定」的事情需要尽量去避免,而「肯定」的事情应该尽量去争取和保持。

而这就是问题的关键。我们将「弱小」和「否定」联系起来,其内在的逻辑就是我们不想承担「规避被否定的事情发生」的成本。在这里,事情本身是好是坏已经没那么重要。我们只是觉得,承认「原本自以为的正确其实是错误」显得自己很弱小。而总是否定自己原以为是正确的事情,又显得自己的想法很没有稳定性。在动荡不安的正确和平庸安逸的「经不起推敲」的正确之间,很多人选择了后者。

然而最有意思的是,「否定」根本不是这个问题里面关键的要素。我们把「否定」和「肯定」替换后,问题看起来也没什么变化:我们能看到有人坚定地否定某件事物,而不允许别人质疑他的看法。这再一次体现了肯定和否定的相对性。在我看来,我们应该把「否定」看作一个中性词。

之前有一篇文章是我在学习排列组合时做的笔记,自从这篇文章发出来之后,我也向不少人询问过意见。很多人觉得我的思路很好,但是从结果看来太过冗长了,尤其是与课本上的解释比起来。这中说法引起了我的思考:我做的事情,是不是把简单的问题复杂化了呢?究竟什么对于我来说是简单,又有什么是复杂的?由此,还可以继续追问:数学和物理学的发展究竟是越来越简单,还是越来越复杂?我们现在实际追求的,又是什么?

要解决这个问题,首先我们需要寻找「简单」和「复杂」的定义。回想一下,我们一般认为什么是简单的,又有什么是复杂的呢?最简单的方法是从认知规律的角度定义:小学生学的肯定比高中生学的要简单。不过,我上一篇文章不也是小学奥数的内容吗?我们也可以感受到,有些习以为常的现象背后有着深刻的物理学规律。所以,这样定义似乎不够准确。

我们还可以从问题的角度定义:有些问题解决起来需要花费更多成本,它们是相对更「难」的问题。不过我们也可以发现,同一个问题有着不同的解法,而从解法上来说又有着准确性之分。寻找某个解法的成本和解法的准确性有时是矛盾的。就像是日心说和地心说。如果从整个物理学的发展历程来看的话,物理学是正在变得越来越准确了。然而物理学上的成果越靠近现代,越难为人理解和掌握了。这一点有些让人感到奇怪。难道古代人就不会自创出一些复杂而冗长的解释吗?我想这应该很有可能,只不过那些解释随着无法解释(或者解释起来很困难)的新的现象被发现被淘汰掉了。看起来,我们一直在追求着简单化的学说。不过这有点像是背包问题:你不知道现在看起来简单易懂的学说在解释新现象时是否会变得更加冗长。也许,我们在这一点上只能一直采取贪心策略。不过从运动来看的话,「本质」就是相对于「现象」的运动,更加静止的东西。如果说简洁的学说就是更加静止的、「本质」的,那么它能够被我们自然而然地追求和发现也就不足为奇了。

与此相对的,就是「科学有时是反直觉的」。有些物理和数学现象会让我们感到很疑惑,与我们常规的认知相悖。不过在我看来,这种情况完全说不上是一件坏事。因为违反直觉的部分往往就是最关键的部分,它往往与这个学说的最根本的前提有关。

我们可以从上面提到的两种「复杂」概括出科学发展的方向:其一是给出新定义,以使理论更加贴近现实,更加完美地解释现实。其二是从逻辑上完善严谨性,让那些违反直觉的部分得到精确的论证。当然,这两个部分本来就是相互依存的。

我们还可以从信息量的角度定义复杂程度。例如,为什么「数形结合」使得问题简化了?如果我们不能在平面直角坐标系里思考二维坐标,那么他们对于我们而言就是两个数字的组合而已。显然,我们人类擅长从视觉中提取信息。当「两个数字的组合」放到坐标系里表达时,虽然并没有本质上的变化,但是我们得到的信息变多了:两个点之间的距离有多大、直线穿过几个点、曲线是什么形状的等等。

我在看数学压轴题的题解时,常常有这种感觉:看完之后能够从逻辑上认同给出的答案,但是自己做的时候,就又不会了。这是因为没有仔细理解每个步骤的意图,也即「为什么这么做?」。要从题解中很好地理解每个步骤的意图是很复杂的。这也暗示了从「解题思路」到「题解」的转换之间存在着信息的损失。更好的例子是从高级语言到汇编码的转换。对于机器来讲,汇编码是简单的,因为它其中的每一条指令都很具体和底层。可是对于人来说,我们想要理解代码的意思,这时高级语言就更加简洁和清晰了。用高级语言编写的源代码包含一种信息,就是我们构造代码的「理念」:我们想要这段代码在宏观上作出什么事情。而汇编码只会指导机器一步一步地执行具体的操作,而不关心究竟得到了什么。

汇编码到高级语言的转换常常被人称作「抽象」。在这里我们可以瞥见抽象的一个重要意义:它通过归纳和概括,隐去一些不重要的信息,从而使得「理念」性的信息凸显出来,使人易于理解。事实上,并非完全没有办法把汇编码反编为高级语言。但是得到的结果也往往和原先的代码差别很大,而且和转换前一样难以理解。这与抽象时的「一对多」情况有关。也就是多个版本的源代码可能会编译出同样的汇编码。具体可以看看我写的另一篇文章「排列组合为什么这么难」。与之相同的是,我之前幻想能够把一道数学题的难以理解的代数解法一条一条转换为几何解法。现在看来,这是行不通的。不过这么做也许是思考几何解法的一个好的开始,因为几何图形对我们来说信息量更大,也更丰富。

在数学和物理中,有很多精妙的抽象大大简化了我们对「理念」的认识过程。而大多数都与「数形结合」有关。平面直角坐标系、向量场、微分方程中的相图......数学之所以让人感到难学,有很大一部分原因是我们对它的认识「不精确」:这个定理描述的是什么?这种解法什么时候起作用?极限是什么意思?图像和其他的直观的理解,正是它们在我们脑海「精确化」的过程。

自从开学起,我已经与排列组合折腾了好几个月了。在此过程中,我也一直在反复思考、追问一个问题:「排列组合为什么这么难?」然而直到今天,我也只有了一些模糊的思路而已。故记录如下。

首先,我们先要搞清楚的是「排列组合难在哪里?」我认为最困扰我的一点是:有太多的「做题技巧」,而其中绝大多数的适用范围都是不明确的。也就是说,当看到一个问题时,我会想到很多个可能的解决方法,却又感觉哪一个都不像。

我现在想试着解释一下,为什么会出现这样的情况。首先我们来看最简单的一道题:有五个数\(\begin{Bmatrix} a, b, c, d, e \end{Bmatrix}\),现在从前三个数(注意必须是前三个数)中同时任意取出两个数,求有多少种可能的情况?如果你学过排列组合或者看过我之前写的《排列组合笔记》,很容易看出答案是\(C^{2}_{3}\),也即「3个里面取2个,不关心顺序」。 \[ \begin{aligned} C^{2}_{3}&=\dfrac {3!}{2!\left( 3-2\right) !}\\ &=\dfrac {3\times 2}{2\times 1}\\ &=3 \end{aligned} \] 但是这里有一点可能会引起你的注意:\(C^{2}_{3}\)中的3为什么一定是那前三个数?如果不是,那岂不是不符合题目条件了吗?然而稍微思考一下,又会发现无论是取前三个还是后三个,又或者是中间三个等等,得到的结果都应该是一样的。这又意味着什么呢?我想把这样的现象概括为:「问题空间」和「解空间」的元素,不满足一一对应的关系,而是多对一的关系。「问题空间」代表的自然就是纯粹的题目存在的空间。「解空间」代表的就是\(C^{2}_{3}\),或者简单地说成是3这个数字(显然这两者是等价的,数学运算只是一种等价变换而已)存在的空间。

这种多对一的关系又意味着什么呢?首先,它包含着一种抽象。实际上,原本的问题与最终的答案\(C^{2}_{3}\)比起来,所包含的信息量是降低了,然而\(C^{2}_{3}\)与3比起来没有任何差别——我们可以把它们看成表达「3个里面取2个,不关心顺序」的个数的两个记号。我们解题的过程,就是抛弃对最终结果没有影响的信息,从而简化问题,最终映射到已经抽象好的模型的过程。当然,这只是这一道题的情况。有的题目需要你想办法排除妨碍你简化问题的信息,比如定序排列(排列问题,不过需要你让某几个被排列的东西按一定的顺序出现)就需要利用除法把不符合要求的情况排除掉。从排列数公式推出组合数公式就是这种问题。不过很有意思的是,这个基于除法的定序方法同样也是多对一的情况:你不能「保证」你定序的就是题目要求的那几个东西,不过你可以保证的是,无论定序的是哪几个,除数都是一样的。也就是说,「简化问题」本身也可以当作问题去看,并且也有它自己的模型。

我们当然不是第一次接触这样的抽象了。早在小学的时候,我们就知道无论是苹果的个数、施工天数还是跑步的距离都可以看作\(x,y\)等字母,然后列出方程,解出答案。不过这种抽象比较简单,因为这差不多是一种一一对应的关系:把个数、时间、距离等一一替换成\(x,y\)等字母是让人觉得可靠的,甚至我们都感觉不到丢失了信息。然而在排列组合问题里情况就复杂得多了:你很难确定哪一些信息不会对结果产生影响。

以往我在解题的时候,思维都是一条单行线:先看题目有哪些条件,然后逐个考虑解决方法,最后连起来得到解法。但是现在看来,这样做常常是行不通的。我更应该考虑的是「我可以从什么方面简化、抽象问题?」

转眼间,五月到了。一年已经快要过半,而「湖面」也已经超过一个月没有更新过一篇文章了。

之前确实有过间隔一两个星期不更新的情况,但是这么久不更新,还是第一次。综合看来,这是由很多因素造成的。

从1月份以来,我每天都在家里,甚至三天才出一次门。长期的、高度重复的生活让我越来越麻木、疲惫。我也尝试写过很多篇文章,但是都写到一半,然后卡住,到最后终于放弃了。当然,以后有时间的话,我也很有可能会尝试补上。

为什么会出现中途卡住的情况呢?我写文章都是先有一个大致思路,然后简单列出提纲就开始写作。写着写着,常常发现自己有些不能自圆其说的地方,又或是有些地方的逻辑性太差让我无法接受。最后几经尝试也只能无奈放弃了。这一方面是因为选题本身就不好。也许是因为最近看书少、以及长期待在家里的缘故,我的「灵感」变得比以往少了很多。很多时候只能强迫自己思考。另一方面就是我本身的知识存量不够。这当然也是因为看书太少了。

另外,随着自己的思考越来越多,很多时候我之前的一些想法成为了包袱。我在看文章、看书的时候常常要把对方的思想和我原有的思想进行比对。这是对我原有的思想和对方思想的一个批判性思考。当然,现在这么多对我来说变得越来越困难了。

然而,麻烦还不仅如此。在家学习时,我更难在上课和写作业时集中精力。也更难以调和我自己的兴趣爱好与高考的关系。也许我已经变了很多吧——半年之前,我还认为「人需要为了单纯的好奇心去学习」、「学习不能带有目的」,然而我现在也接受了「我需要参加高考」这个事实。很多人说,现在忍一忍,高考完后就可以按自己喜欢的方式学习了。真是这样吗?我不知道,但是我也无路可走了。

「人们声称的最美好的岁月其实都是最痛苦的,只是事后回忆起来的时候才那么幸福。」我有些怀疑,我们所认为的「困难」和「痛苦」都是什么?「幸福」在多大程度上,是因为困难和痛苦呢?但是我也有些看得开了:也许那些「困难」的事情才是比较有意义的吧。至于是不是「困难」赋予了它意义呢?我不知道。

不过我至少能够开始接受,我只是一个凡夫俗子。别人觉得困难的事情,我可能也能够不费什么力气做到。但是也有很多在别人眼里轻而易举的事情,我需要花多得多的气力完成。

独立思考和批判性思维的「困难」程度,也许也不是能够轻易定义的吧。在我现在看来,它也许随着时间的推移会发生变化。而我,就处在那条曲线变陡的位置。不过无论快或慢,我始终在缓慢前进。这也许是还值得我庆幸的一件事吧。

昨天下午刚收到通知,5月10日回学校。也是时候对这长达4个月的居家生活说再见了。在此,留下一个时间戳吧。

2020年5月9日

深夜

在YouTube上有一位数学科普UP主,名为3Blue1Brown(在Bilibili上也有官方账号)。他的视频基本都以可视化的方式讲解高等数学(及以上)中的内容。我第一次看到他的视频还在上初中,那时我看的是「微积分的本质」系列。在看到那个系列的视频之前,我从来都不知道数学可以如此优美和直观。虽然当时我几乎看不懂最后几个视频的内容,但是它还是让我对数学产生了兴趣。直到现在,我每次看到他的视频时还在想:到底什么是数学呢?我所喜爱的那个数学是什么样子的?

我认为,数学的精髓就在于「抽象」。最简单的抽象就是「寻找共性」。比如说三个苹果和三支铅笔,这两组东西中有着某些共性,而这种共性我们也常常能在其他地方找到。这就是数,是最基本的数学。「共性」让我们能够把不同的事物联系在一起,所以它能让事情变得更加简单。但是,抽象过程中随之而来的就是我们研究的东西开始远离我们的生活,最终成为纯粹存在于我们思维,成为一种「理念」。而在当今的学科体系中,数学是所有学科中最为高级的抽象。可以说,它正是对其他学科的抽象。有很多人认为这是数学不受大多数人欢迎的原因:它离我们的生活还是有些遥远了。那么,难道抽象就是与此矛盾的吗?

也许并不是这样。注意到我刚才说,抽象就是「寻找共性」。我们当然也可以把抽象的数学公式和形象直观的东西联系起来,这也正是3Blue1Brown在做的事情。动画可以作为公式的另一种表达,它带有与公式相同的内容,但是有着更多的信息。这就使得动画更加易于理解。

然而,3Blue1Brown所做的并不只有给公式加上动画这样的事情。它还具有一种很强的「逻辑性」和「参与感」。想象一下你正在看悬疑小说。它对于你的现实生活有意义吗?你的现实生活又与此相接近吗?可能很多人不这么认为。当然,它们对于现实生活而言肯定比数学更接近。我想说的是:它们使我们感兴趣,是几乎出于本能的。我们几乎天生就为侦探逐步推理找到答案这件事感到激动。数学也应该是这样:我们也许没办法使用侦探小说那样的叙事方式,但是我们也要能够感觉到:在解决问题时每一步都是经过推理自然而然得出的结果,所有的定义都不是凭空冒出来的。显然,3Blue1Brown很好地做到了这一点。

当今,数学这门学科在应试教育中最强调的就是形式推理能力。形式推理固然很好,它能够训练我们的思维使其更加严谨。但是,我们也不应该成为只会按照教材上的定义和结论做题的机器人。数学的发展很大程度上就是它的定义的扩展。数系就是最明显的一个例子:从一开始的自然数再到整数,再到实数和虚数。数学的边界就是我们的想象力的边界。当然,我们也要强调严谨的重要性,但是我们也要尝试着自己「发明」新的数学,并且找到严谨化的表述。这并不需要多么高深,只要它表达的是一种规律,就是有价值的。

很多人会认为,只有聪明的人才会喜爱数学。这是我不认同的。无论你的水平如何,都可以当个「数学爱好者」,找找数学中自己感兴趣的领域并多听多看多想。我的天资不高,数学成绩也算差了,但是我仍然可以坦然地说出「我喜欢数学」,仅仅因为它让我着迷而已。

最后放上一段话,选自《什么是数学:对思想和方法的基本研究》一书。

Formal mathematics is like spelling and grammar -- a matter of the correct application of local rules. Meaningful mathematics is like journalism -- it tells an interesting story. Unlike some journalism, the story has to be true. The best mathematics is like literature -- it brings a story to life before your eyes and involves you in it, intellectually and emotionally.

形式数学就像拼写与语法——只是对局部规则的正确使用。有意义的数学有如新闻工作——它只讲述有趣的故事,但又不像某些新闻报道,因为它的故事必须真实。而最美的数学则如文学——它将故事栩栩如生地呈现于你眼前,使你在理智和情感上都情不自禁地投入其中。

排列组合大概是数学中学习者年龄跨度最大的部分之一了吧。从学奥数的小学生们到即将参加高考的我们,都无不被排列组合问题所困扰。为什么几乎没有抽象定义、基本逻辑符合直觉的排列组合能常常难倒我们呢?我想,原因可能就是它定义地过于简单了,有一些我们所认为的「常识」,并没有经过仔细的审视。这样最终会导致我们认为简单的「常识」之间没有联系,总结的解法也常常局限于例子。当条件稍微有些改变时,我们就常常不知道该怎样更改普遍的解题策略使其适应了。

首先来明确最基础的定义。排列和组合都是什么意思?它们有什么区别?这两个概念其实都来源于数学中的计数法。所谓计数法,从字面和常识去理解就能猜到它指的是求给定集合中元素个数的方法。很容易想到,要做到计数,我们就要遍历集合中的全部元素。这就是最基本的解法,也是排列组合这些解法的本质。遍历强调的是不能重复也不能遗漏,而这就是所有解法要遵循的基本原则了。这些虽然抽象,却应该作为思考的出发点。只有这样,我们才能够把握各种看似不相关的事物的联系。

现在开始讨论具体的例子。考虑一个集合\(A= \begin{Bmatrix} a, b, c \end{Bmatrix}\),我们现在要进行计数。不过对这个集合计数有些无聊,你可以直接数出来它的元素个数是3. 我们现在定义出一个新的集合\(B\),使集合\(B\)的元素等于集合\(A\)中任意两个元素的排列。等一下,我们为什么说排列而不是组合?这就引出了前面那两个问题的答案。排列是「关心顺序」的,而组合是「不关心顺序」的。也就是说,如果认为\(ab = ba\)则是组合,否则是排列。现在,我们想要问集合\(B\)中有多少个元素。这当然也就是在问,\(a,b,c\)中任意选出两个有多少种不同的排列,而且我们把顺序不同也算作不同。

接下来的问题就是如何解答了。仔细回想你数集合\(A\)中元素个数的过程,你会发现自己是按照一定的顺序数的。这是什么意思?我们可以用这个式子表示:\(a \rightarrow b \rightarrow c\). 也就是你用有向的箭头把集合中的元素连接起来,第一个计数为1,此后顺着箭头遍历,每遇到新的元素就把计数加上1,直到最后没有箭头可往下遍历为止。这就是最基本的遍历方法了。而它给我们的思路就是:要在元素之间建立连接。集合中元素建立连接后形成的,我们称之为「图」。在数学中还有专门研究图的部分,就叫做「图论」。我们是这样想的:字母就是图中的节点,而箭头就是有向线段,它把节点连接起来。每个节点都是计数过程中的一个状态,而有向线段则提供这个状态转到下一个状态的方式,也就是在计数器上加1.

也许你想说这样的解法效率太低了,但我们不妨将它作为思考的起点,在这个基础上尝试优化。我们首先要写出集合\(B\)的元素。不过我们要怎么写呢?我们不能看着集合\(A\)并毫无规律地写下集合\(B\),因为那样既有可能重复,而且更容易遗漏。这就违背了上面所说的两个原则了。一个好的方法是通过遍历给定集合\(A\)来写出集合\(B\). 我们直接按照刚才的\(a \rightarrow b \rightarrow c\)遍历。注意到集合\(B\)的定义是:随机按照顺序选择\(A\)中两个元素,所有可能的情况。我们就在每次遍历到新的元素时把该元素作为第一个,然后重新开始遍历一遍作为第二个。这样就能确保不重复也不遗漏了。结果如下: \[ \begin{Bmatrix} aa,ab,ac,ba,bb,bc,ca,cb,cc \end{Bmatrix} \] 显然,这里有些错误。\(aa\)这样的元素是不符合定义的。因为定义说必须要选择两个不同的元素(集合中本来也不应该有相同的元素)。所以\(aa,bb,cc\)都是应该被去掉的。我们现在想要添加的过滤规则是:只保留每种字母出现一次的元素。因此,我们需要重新选择整理和组织元素形成图的方式以便计数。

有时,退回一步思考常常能够给你思路。我们先假设对于一种元素可以选择多次,然后尝试把写出\(B\)中元素的过程用图表达,因为这个过程不就是把\(B\)中的元素遍历了一遍吗?我们在图中要经历的过程就是「写出\(B\)中的一个元素」,而每个节点就是这个过程的一个状态,有向线段是状态之间的转换方式。最终结果如图1.

图1

在这张图上,我用不同的颜色标出了三种有向线段。对于状态我采用了集合的方式表示,不过依据定义,我们要区分\(\begin{Bmatrix} a,b \end{Bmatrix}\)\(\begin{Bmatrix} b,a \end{Bmatrix}\). 无论如何,我们能明白它的含义就行。像这样的具有层次结构的图,我们称为「树」。节点就好比树叶,线段就好比枝干。我们可以用分类的方法整理\(B\)。在图中,我们把它分成了三类,分类依据则是第一个元素。那么我们就可以把各个分类的元素数量计算出来,然后直接加起来就是最终结果。这就是加法原理。不过我们发现,每个节点都有固定的模式,除了最右边的节点以外,每个节点都与下一层的三个节点连接。所以我们想说的是,这几类的元素个数都一样,都为3. 我们只要把类的个数乘3就可以得到结果,这就是乘法原理。也就是 \[ \begin{equation*} 3\times 3=3^{2} \end{equation*} \] 我们也得出了对于第\(n\)层,节点个数是:\(3^{n-1}\). 那么再扩展一些,对于有\(m\)个元素的集合\(A\),这个图的第\(n\)层,节点个数是:\(m^{n-1}\).

不过我们还没有满足「不能重复」这一条件。我们考虑一个例子,你已经遍历到了这颗树第二层上的\(\begin{Bmatrix} b \end{Bmatrix}\)节点。你接下来要依据\([ +a]\rightarrow [ +b]\rightarrow [ +c]\)这样的顺序遍历你对当前状态的操作并得出下一个状态。那么什么时候会造成重复呢?自然就是你遍历到的操作添加了你状态中已有的元素。对于有\(m\)个元素的集合\(A\),当你遍历到第\(n\)层时,依据定义,层数就是你做的操作的次数,所以你的状态就是已经选择了集合\(A\)中的\(n-1\)个元素。那么你就会遍历出\(n-1\)个出现重复的状态。因为对于第\(n\)层中所有的状态都是如此,所以我们直接在每个算出的状态数中乘上\(\frac{m-( n-1)}{m}\)就可以了。对于上面的例子来说就是: \[ \begin{equation*} 3 \times \frac{3-( 1-1)}{3} \times 3 \times \frac{3-( 2-1)}{3} = 3 \times 2 = 6 \end{equation*} \] 我们也可以发现如果集合\(A= \begin{Bmatrix} a, b, c, d \end{Bmatrix}\),我们要按顺序选出其中不重复的三个元素有\(4\times 3\times 2\)种情况。我们可以总结出,对于有\(m\)个元素的集合\(A\),这个图的第\(n\)层,节点个数是: \[ m\times ( m-1) \times ( m-2) \times \dotsc \times ( m-n+1) \] 到这里,我们就解决了排列的基本问题。现在来考虑组合问题。我们只需要稍微修改一下前面对于集合\(B\)的定义:我们把只有顺序不同的两个元素视为同一个元素。我们按照上面的方法画出集合\(B\)中元素的形成过程。

排列组合笔记3.png

这里我为了突出不考虑顺序这一点,删掉了集合内的逗号。要找出这张图的规律看起来很困难。于是我们想要找一个新的方法去组织状态和操作。你可能会想到,这时对于每个给定的状态,都可以唯一地对应简单的「选/不选」。比如说对于\(\begin{Bmatrix} a \end{Bmatrix}\)这个状态,我们可以用\(\begin{Bmatrix} 1,0,0 \end{Bmatrix}\)表示。也就是选A,不选B,不选C。这样做的优势在于哪里呢?它不但消除了先后次序所造成的差异,而且排除了选取多个相同元素的情况(当然,如果你想考虑这一点,也可以允许\((2,1,1)\)这样的情况存在)。更重要的是,它提供了一个几何上整理上图中的节点的方法。\((1,0,0)\)正好可以用三维直角坐标系中的一个点表示。重新整理后如下图所示。

图3

不难看出,对于有\(m\)个元素的集合\(A\),我们可以用\(m\)维的坐标系表示从集合\(A\)中任意选取元素所得到的所有可能的状态,状态个数为\(2^m\). 对于任意选取\(n\)个元素到集合\(B\),我们可以怎么做呢?我们需要重新思考我们是怎样画出上面这张图的。

排列组合笔记4.png

为了讲清楚这一点,我又画出了三张图。它们分别对应元素个数为1、2、3时的情况。元素个数为0时只有一个点,就是$\(. 这里就不画了。注意图中的灰色箭头,它表示的是一个平移过程。例如\)m\(为2时,箭头表示向下平移,代表着增加\)b\(这个元素,从蓝色的线段也可以看出这一点。我们现在的目标是:找出当集合\)A\(中元素个数为\)m\(时有多少个包含\)n\(个元素的节点(这里\)n\(和上面的定义不一样)。在上面的例子中\)n$为2.

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

上面的这张表格的第一行是\(m\)的值,第二行和第三行都是对应的图中的节点的元素个数。而第二行是由第一行「平移」得到的。举例来说,当\(m=2\)时,第一行的0, 1代表着图中的\(\emptyset, a\)而第二行的1, 2代表\(b, ab\). 这正好对应了平移的操作。当我们想得到第\(m\)列时,我们就把第\(m-1\)列的第二行放在第一行的后面,然后整个放在第\(m\)列的第一行。第二行则是对上一行的每个数字都+1得到的。我们再列出一个表格,写出每一列中各种数字的出现次数。

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

我们可以看出,「0」的个数是固定不变的,也就是说每张图中都有且仅有一个节点为\(\emptyset\),这是一切的开始。「1」的规律是什么?随着\(m\)增加,它每次都加上1. 这是因为根据平移的规则,除了第一列的1以外所有的1都是由上一列的0加上1得来的,而每一列的0的个数都为1. 而2的规律也类似,它是由上一列的1加上1得到的。为了方便解释,我定义一个函数来给出这个表格中某一格的数字:\(C(m, n)\)\(m\)表示的是表格的「数字」,\(n\)表示的是第几张图(注意这里的和上面的是反的)。所以, \[ C(2, n)=C(2, n-1)+C(1, n-1) \] 对于3 \[ C(3, n)=C(3, n-1)+C(2, n-1) \] 如果你想要看看对于更大的\(m\)是什么情形,你可以直接看「杨辉三角」:

杨辉三角

不过我们现在还是回到正题,我们先尝试写出\(C(2, n)\)的规律,然后用它推出\(C(3, n)\)的规律。

1 2 3 4 5
\(C(0,n)\) 1 1 1 1 1
\(C(1, n)\) 1 1+1 1+1+1 1+1+1+1 1+1+1+1+1
\(C(2, n)\) 0 0+1 0+1+2 0+1+2+3 0+1+2+3+4
\(C(3, n)\) 0 0 0+(0+1) 0+(0+1)+(0+1+2) 0+(0+1)+(0+1+2)+(0+1+2+3)

根据等差数列的求和公式,可以得到: \[ C( 2,n) =\frac{( 0+n-1) n}{2} =\frac{n( n-1)}{2} \] 我们再仔细看一下: \[ C(3, 5) = 0+(0+1)+(0+1+2)+(0+1+2+3) = 0 \times 4+1 \times 3+2 \times 2+3 \times 1 \] 我们可以写出: \[ C(3, n) = 0(n-1) + 1(n-2) + 2(n-3) +\dots + (n-3)2 + (n-2)1 \]

注意到,去掉第一项后,这个式子是对称的!怎样去计算这个式子呢?我从计算平方和的方法中得到了灵感。为了演示,我选择\(C(3, 7)\)进行计算。

排列组合笔记5.png

上图中有三个三角形,每个三角形中的全部数字加起来都等于\(C(3, 7)\). 它是这样画的:第一行我们写下\((n-2)\)个1,第二行写下\((n-3)\)个2,以此类推,最后一行只有一个数字,就是\((n-2)\). 你可以发现它们加起来就是上面的公式。然后我们把它旋转60°,一共旋转两次,就得到了上面的三个三角形。接下来,我们只要把这三个三角形中的数全部加起来除以3就是结果了。怎样去加这三个三角形?我们把相同位置的三个数加起来,放到一个新的三角形中。你可以看出,这个三角形中的数全都都是7. 详细的证明就省略了。而7的个数是:\(5+4+\dots +2+1\). 这是一个等差数列。最终结果就是: \[ C( 3,\ 7) =\frac{( 5+1) 5}{2} \ \times 7\times \frac{1}{3} \] 推广到对于\(n\)来说: \[ C( 3,\ n) =\frac{( n-1)( n-2)}{2} \times n\times \frac{1}{3} =\frac{n( n-1)( n-2)}{3\times 2} \]

那么,如果是\(C(4, n)\)呢?问题开始变得复杂了。这次我们要用到正四面体。要对四面体数有个快速的了解,你可以看看四面体数序。我们是如何排列我们的数字的呢?首先来看看我们要排列什么: \[ C(4, 8) = 1+[1+(1+2)]+\dots +[1+(1+2)+\dots+(1+\dots+5)] \] 这里为了简单,我直接省略了所有的0. 我们现在要把数字填到下面这个四面体中,使它们相加等于\(C(4,7)\).

四面体数

我在这里无法画出四个四面体。我只画出了四个四面体的底部,也就是上图绿色的部位。

排列组合笔记6.png

我们把这四个三角形的数都加起来,形成的新三角形中每一个数都是8. 这就是我们预期的结果。另外,每个四面体中有多少个数呢?仔细观察四面体,我们发现它的每一层的数字个数为1, 3, 6, 10, 15. 这正是刚才我们推出的数列\(C(3,n)\). 这里一共有5层,所以\(C(3,7)\)就是数字的个数。我们可以写出: \[ C( 4,\ 8) =C( 3,\ 7) \times 8\times \frac{1}{4} =\frac{7\times 6\times 5}{3\times 2} \times 8\times \frac{1}{4} \] 推广后就是: \[ C( 4,\ n) =C( 3,\ n-1) \times n\times \frac{1}{4} =\frac{n( n-1)( n-2)( n-3)}{4\times 3\times 2} \] 如果我们继续像这样推出\(C(5,n)\)的话,我们就要讲到四维空间了。所以最好还是就此打住,回顾和比较我们已经发现的结论。

排列组合笔记7.png

这些解法之间都存在着一种固定的模式,而实际上这个模式就来源于定义。仔细观察表格,格内的所有数加起来,就是那一格的答案。不过这里有一点让人困惑:前3列中都只有一个数字,就是1,为什么到了第4列及之后,就开始有了1, 2, 3等等呢?其实,我们简化了\(C(3,n)\)的写法。你如果集中精力,对照着最右边那张四面体数的图,想象你把\(C(3,n)\)中大于1的数都展开成多个1,并且把这些多出来的1放置在四面体上,你会发现它们刚刚好能够填满四面体。也就是说,由数列1, 2, 3...组成的三角形数组都能用只由1组成的四面体数组表示。那么由数列1, 2, 3...组成的四面体数组能不能用三角形数组表示呢?是可以的,数列为1, 3, 6, 10...

现在,离最终的答案已经很近了。不过,我们还差一点。仔细观察刚才我们推出的两个普遍公式,我们似乎有一种感觉: \[ C( m,\ n) =C( m-1,\ n-1) \times n\times \frac{1}{m} \] 我们应该好好思考一下这一条依据经验和直觉猜到的等式。对于大于4的\(m\),情形是很难想象的,所以我们还是列出这个式子: \[ C( 2,\ 5) =C( 1,\ 4) \times 5\times \frac{1}{2} \] 它是在说什么呢?代入刚才的思路,我们应该猜到\(C(2, 5)\)被写成\(1+2+3+4\). 而再倒序一下就是\(4+3+2+1\). 这两个式子上下放在一起,把对应位置的数相加就是\(5+5+5+5\). 之后再除2就是答案了。我们似乎可以捕捉到这个思路的结构:假设你现在要算\(C(m,n)\),你就把\(C(m,n)\)整理成好几组数的和,每一组中的所有数字都是同一个。

(至于具体的证明实在想不到了...)

最后,我还想简单介绍一下「乘法原理」。(这里直接用教材的写法了,\(A^{3}_{5}\)表示5个中不重复地排列3个) \[ A^{3}_{5} =5\times 4\times 3=A^{1}_{5} \times A^{1}_{4} \times A^{1}_{3} \] 可以发现, \[ A^{1}_{5} \times A^{1}_{4} \] 在这里对应的含义就是对于树状图的第二层中的每个元素,都有\(A^{1}_{4}\)个线段连接到下一层的元素。而这个意思正是「5个中选一个,再在4个中选一个,再在3个中选一个」。也就是教材上的定义方法。

可以在此基础上稍微扩展,形成「除法原理」。也就是对于树状图的某一层中,有\(\frac{1}{n}\)个线段连接到下一层的元素。而这个说法听起来就很微妙了。我个人猜测这个说法在引入概率之后是可以被合理化的,不过我还没想出来。

Reference:

后记:

这篇文章是我在学习排列组合时自己找了些资料,经过理解和整合后呈现的结果。不过,后面这一部分基本都是我自己想到的。有些人会说,我这样的理解太复杂冗长了。确实是这样,在教材中这些知识都有一些更加简单直观的解读。但是我认为,对数学的探索并不只是为了解决问题本身,更重要的是发现各个知识之间的联系。我们刚才已经触及到了排列组合之外的很多东西:图和树、杨辉三角、三角形数、四面体数等等。我们不应满足于一个基于常识的对数学概念的解读,因为常识总是容易出错,而且常识与常识之间是零散的。所以,我更加愿意花一些时间,寻找常识背后的完整逻辑。这大概就是本文的意义所在了。

经友人指点,我在讲解组合的时候画出的图对应数学上的一个概念「Abstract polytope」(抽象多胞形)。如果你有兴趣的话,可以去维基百科上看看。

想象你正站在早餐店的柜台前,你看上了一个巧克力蛋糕和一个水果沙拉。而你身上的钱只够你买其中一个。你正犹豫该买哪个:巧克力蛋糕更美味,而水果沙拉更健康、更能帮助你保持体型。最后,你选择了巧克力蛋糕。此时,你开始回想刚才发生的一切,并开始担忧自己的体型。你有些懊悔,觉得你本来可以选择水果沙拉的。这里的「本来可以选择」是什么意思?这个想法引起了你的注意。你好像是想要说,没有什么阻碍你选沙拉。但是,难道放弃美味的蛋糕还不算是一种阻碍吗?如果在加上一个前提:你之前好几天都买的是沙拉而不是蛋糕,那么选择蛋糕是不是就是你不得不做的了?好像仍然不是,你仍然觉得你拥有自控力,可以在为了自己体型的考虑下选择沙拉。不过你当然也会在为了自己的享受的考虑下选择蛋糕,你最后不是仍然要从这两个中作出选择吗?我们开始怀疑,如果我们进一步追溯下去,选择蛋糕有一个合理而充分的解释,也就是说选择蛋糕是由作出选择的那一刻前你的所有经历所决定的。这种观点被称为「决定论」。与决定论相对的就是自由意志。这种说法认为自由意志影响着我们的思想,而使我们所有的思想都带有随机性。

可以看出,决定论是出自我们对自身思考的反思。如果你认同决定论,那么就好像是在说你所有的思想都是有原因的,如果一切都重来一次,你还是会那样选择。有些人可能会觉得这是荒谬的,如果真是这样,那我们反思自己的行为还有什么意义呢?不过,我们反思的目的当然不是要扭转过去。反思的原因当然是出于对未来的考虑。你可能还会想,因为我们所有的想法都是有原因的,这可以推出它们都是合理的,但是我们常常不这么想。不过,我们之所以有时回忆起自己的想法时认为有些不合理,也是因为我们在考虑未来,我们希望以后的那个自己能够作出合理的决策。

我们还需要更加深入地思考一些情景。假如你在犹豫时,身边出现了一个人拿枪对着你,要求你选蛋糕。你是否就觉得,这时你就不是「本来可以选择」了?这是什么意思呢?这时你正面临着生命上的威胁,所以你不得不被迫选择蛋糕。但是,难道一开始的情景中,你就没有受到威胁吗?你不明白蛋糕会让你发胖吗?这两者之间的区别好像只是生命威胁更加重要。事实上,「本来可以选择」这样的说法是相对的。再考虑一个情景,没有人威胁你,但是把水果换成香烟。这时你觉得自己的决策更加「自由」了吗?可能对于大多数不抽烟的人来说并不是。你如果选了香烟,就面临得肺癌的风险。虽然不及生命威胁那样重要,但也比发胖的威胁重要多了。现在我们换个角度想想,在上面所说的三个情景中,似乎你的思想的「自由度」根本没有区别。尽管别人可以拿枪对着你,但是他仍然无法左右你的思想。如果你不认识枪,那么他就根本无法强迫你。

我们常常说「本性」这个词,它指的是什么呢?它说的似乎是在没有外界因素影响的条件下,人们自主作出的选择。这和我们上面所讲的有些矛盾。你可能会说虽然选择蛋糕还是沙拉是由它们是否让人发胖决定的,但是选择好吃的和让人发胖的食物这一点是由你自己选择的。然而,你对「好吃」和「发胖」的理解也来源于外界。我们开始怀疑人是否真的有「本性」可以唯一地与其他人区别开呢?还是说,本性也是被外界影响所造成的?

如果事实真的是这样,你会发现你自己其实不是「自由」的。要想无形地控制一个人,只要从他出生开始就控制外部输入的信息就可以了。到底什么是自由呢?仔细思考对自由的理解,就会发现有很多我们称作「不自由」的决策其实也是完全自由的,没有任何人能从思想上阻止你作出其他选择。但是从刚才的分析来看,我们的决策都是由目的决定的,而目的就是从你的经验中产生的。这样一来,无论在什么情景下作出的决策都是决定好的。那么,我们到底是怎么理解自由的呢?

有人对「自由」的解释是:我们每个人都有自己的「内心」,内心与外在的冲突决定了我们是否自由。但是显然这是有问题的,如果没有外在,我们也不会有自己的思维和经验,更不会有「内心」了。我认为,关键在于我们作出决策时的目的。我们能够感受到有一些决策的目的更加稳定。(待续)

有一句话是这样说的:「你无法肯定世界是运动的,因为这个结论就带有静止性」。我们很难想象出一个完全静止的世界,而且暂时也没有任何理由认为世界是静止的。但是这句话的逻辑至少表明:如果我们想定义某些事物的运动,与此同时我们也必须定义某些事物是静止的。物理学家想要总结出守恒定律,数学家要提出公理,而我们在进行哲学思考时必须要把什么看作是静止的呢?有些人可能会想到笛卡尔说过的那句话:「我思故我在」。的确,哲学思考允许我们进行任何假设和幻想,也鼓励怀疑一切事物。但是有一件事看起来是无法被怀疑的:那就是我在思考。我自身所唯一能够确定的,就只有我在思考过程中的材料、运用的逻辑以及得出的结论。

这就让我们来到了相对与绝对的矛盾中。我们在描述运动之前,总要定义出一个相对静止的「参照物」。想要描述整个世界的运动就不可能不将其分裂开来,使其中一个部分静止。如果你在说某个事物是运动的,你的表达中其实就蕴含着它运动的规律,而你是把这个规律当作静止的了。那么,你的意思自然是那个事物相对于你定义的静止的规律运动。如果想反驳那个规律的静止性,你就要去寻找或是定义它的静止的二阶规律、三阶规律......但是这里我们还漏了一件事:研究规律的主体是「我」,这个观察者也是必须要被假设成静止的。在这里,我们所做的就应该是首先假设观察者的静止,然后尝试把这个静止等价变换为规律的静止。那么显然是先有观察者的静止性,才有规律的静止性。当然,这个规律和我们平常所称的规律还不一样,它需要被简化、加工成易于表达和理解的形式。而这是一个近似,所以它往往就是可以被质疑的。

不过,我们还感觉到有另外一种相对。当我说某种结论是「正确」的时候、当我说某件事情「好」的时候,当然会与之相对地存在错误的结论、坏的事情(虽然这些相对的事情常常会被省略)。这也是一种相对。但是我们可以感觉到,它和我们前面所讲的运动中的相对静止是根本不同的。我之前在《人的局限性》中就讨论过这种相对。正确和错误、好与坏都完全基于我们预设的目的。换句话说,我们的目的就是这些相对的规律或者说本质。

显然,我们在寻找规律的时候会抛弃我们认为错误的那些结论,以及结论中我们认为无关紧要的部分。这实际上是一种近似。因为所有在我们意识中浮现的结论都不是凭空出现的,它一定带有一些原因。抛弃结论是武断的做法。这些原因归根结底都是出自观察者,所以这也体现了观察者的静止性。而我们近似的原因,自然是我们的目的了。

让人感到困惑的是,我们刚才把「目的」归结为一种规律,而规律描述的自然是运动。那不就是在假设观察者是运动的吗?我们似乎违背了我们一开始的假设。解决这个问题的关键在于我们要认识到结论与结论之间的观察者不是相同的,也就是说,观察者在这个维度下是会运动的。我们的记忆可以使我们很容易地认同这一点。当然了,我们在尝试认识我们的「目的」时,不可避免地也会存在一个静止的观察者,即那个正在思考目的的观察者。倒不如说我们永远无法真正认识我们的目的,而只能认识到我们的目的的近似,这是源于我们认识目的时的「目的」。

Related posts:

01背包

问题描述

给定一组物品,每种物品都有自己的重量和价值,现有一个背包,能承受的重量有限,在受限制的重量下,取若干物品,使得总价值最大。这一类问题,被称为背包问题。

阅读全文 »