0%

转专业

这一年里,我做的最重要的事就是转专业了。这件事是如此值得纪念,以至于我专门写了一篇博客来讲述我转专业的过程:《轻轻的,我来了》。在这篇文章的末尾,我这样写道:

总而言之,不知不觉间,我就要离开我暂时的住处,到达更适合我的新环境了。

这个新环境是怎样的?这就是这篇年终总结的主要内容。

如果要用一个字来描述这一年,那必定是“忙”了。

转专业之后是期末考试。考试的结果是有好有差,但许多课程不在信院培养方案之内,从而没什么影响。

然后就是小学期。15 天从早到晚的编程让我第一次体验到开发一个完整的项目的感觉。我们组做了个打砖块游戏,算是中规中矩。(有些组真的太强啦!)

接着就是算法竞赛。暑假留校训练到 8 月 10 日,回家继续线上训练,合计 20 场。但排名不是很好,所以只分配到一场 ICPC 的名额,没分到 CCPC 名额。CJS 说挑早一点的好,因为到学期后面可能反而没时间准备了。于是我们挑了 10 月 18~19 日的西安站。

可是,在西安的赛场上,我们一直没做出第四简单的 F 题。于是,我在这个赛季只收获了那盒到现在都没吃完的西安酥饼。

事实证明,CJS 的判断无比正确。从西安回来后不久,我就为了接连到来的期中考试忙得团团转。好不容易考完所有课程——包括补修的大一课程——的期中考,已经是 11 月下旬了。正如一位老师所说:

你们好像期中考试后没几个星期就期末考了。

而在期中考和期末考之间,还有一系列任务:小组作业啦,展示啦,报告啦。做完这些,期末考试已经开始了:12 月 24 日晚上十点,我考完电路实验考试,回去还要和同组的人(也是同宿舍的)一起赶 12 点截止的小程序期末项目,最终有惊无险。

期末周的考试非常密集,有一天我复习到十二点半,没洗澡直接睡了,第二天早上 6:40 继续复习。在突击考试的过程中,我也获得了一些经验。

社交

我在信院的社交活动基本集中在软件学社里。考完期中物理考试之后,我参加了软件学社的聚餐。这是我第一次和其他社员们线下见面。社长和许多来自不同年级的社员给了我深刻的印象。

最值得一提的是,我给 C 语言积分赛出了一道题,并参与了比赛的组织。这在期末考之前带给我许多乐趣。

AI

这一年里,计算机领域的每一个人都感受到了 AI 技术的突飞猛进带来的震撼与恐慌。“氛围编程”(vibe coding)甚至成为了柯林斯词典的 2025 年度词。

我在 2025 学年第一学期选修了两门有关 AI 的课程,这让我对 AI 的架构与原理有了更深刻的了解。这一年里,我使用 AI 的频次也明显多于前一年。

和氛围编程相比,与一般人的生活更息息相关的是“AI垃圾”(AI Slop)。对它的讨论使得“slop”成为韦氏词典的 2025 年度词。不过,我们不必为这些“垃圾”的泛滥而恐慌。正如韦氏词典在公布词汇时说的:

In 2025, amid all the talk about AI threats, slop set a tone that’s less fearful, more mocking. The word sends a little message to AI: when it comes to replacing human creativity, sometimes you don’t seem too superintelligent.

展望

所以我脑子里当时想到的一个意象,就是“悬浮”。大家都在高速流动,非常勤快,非常辛苦,非常努力,但他不断高速流动,并不是因为他喜欢这个工作,而正是因为他不喜欢甚至痛恨这个工作。
……
所以“悬浮”一个很本质的特征,就是说对当下的一种悬置,不直接面对当下,总是想迈向未来。当下存在的意义,不过是他迈向未来的一个台阶,所以你越快地跨越过当下越好。
——项飙《悬浮的人,如何扎根?

我能预料到,接下来的一年里,我会像刚过去的一年里一样忙碌。但对于如何过好忙碌的生活,我已经有了许多经验。不过,我会避免进入项飙所说的“悬浮”状态。就像 Robert Frost 一样,在雪夜的林边驻足凝望片刻,好好感受当下的一切,再去赶那睡觉前要赶的路:

And miles to go before I sleep,
And miles to go before I sleep.
— Robert Frost, Stopping by Woods on a Snowy Evening (1923)

祝马年快乐!

期末考试时间: 2026.01.07

为了打字方便, 用 代替 .

第六章 (I) 群、环、域

  1. 半群, 幺半群.

  2. 幺半群的常见例子: .

  3. .
  4. 群的常见例子: .
  5. Klein 四元群.
  6. 有限群无限群. 群的.
  7. 平凡群.
  8. 交换群/Abel 群.
  9. 群中元素的. 幂的性质.
  10. 群中元素 . 若 存在, 则: (i) ; (ii) 当且仅当 .
  11. 是群 的元素, 则方程 中有唯一解 , 方程 中有唯一解 .
  12. 群的运算满足消去律.
  13. 群中的唯一幂等元是 .
  14. 为群. 若 的非空子集, 且 关于 的运算与单位元构成群, 则称 子群, 记作 .
  15. 为群. 若 的非空子集, 且 关于 的运算构成群, 则 .
    只需证明 , 也就是证明 . 事实上, 由 .
  16. 子群判定定理: 设 为群, 的非空子集, 则 的充分必要条件是 .
  17. 为群 的元素, 令 , 则由子群判定定理可知 . 称 生成的子群.
  18. 为群, 令 , 可以通过子群判定定理证明 . 称 中心.
  19. 为群 的子群, 则: (i) ; (ii) .
  20. 循环群生成元.
  21. 循环群的常见例子: .
  22. 是循环群, 则:
    (a) 若 为无限群, 则对任意两个不同的整数 , 有 .
    (b) 若 阶有限群, 则 互不相同.
  23. 是循环群, 则:
    (a) 若 为无限群, 则只有 的生成元.
    (b) 若 阶有限群, 则 个生成元. (使用 Bezout 定理证明.)
  24. 是循环群, 则 的子群都是循环群. ( 是无限群时显然; 否则设子群有两个元素 , 使用 Bezout 定理.)
  25. 置换及其符号. 置换的乘法 (积).
  26. 轮换及其符号.
  27. 任何置换都可分解为若干个不交的轮换的积. (用图论证明.)
  28. 全体 元置换关于置换的乘法构成群, 称为 对称群, 记作 . 的子群称为 置换群.
  29. 陪集.
  30. 为群 的子群, 则 的所有不同的左陪集形成 的一个划分.
  31. Lagrange 定理: 若 阶有限群 阶有限群 的子群, 则 中的不同的左陪集的个数为 .
  32. . 零元 , 幺元 , 负元 , 逆元 .
  33. 环的常见例子: .
  34. 交换环, 幺环, 无零因子环, 整环.
  35. 幺环的幺元不等于零元, 除非此幺环只有一个元素.
  36. 为环 的元素, 则 .
  37. 若环 的元素个数大于 , 则 不是群.
  38. 整环的常见例子: .
  39. .
  40. 是域, 则 是 Abel 群.
  41. 域的常见例子: .
  42. 为合数时, 不是整环; 但 为素数时, 不仅是整环, 还是域.

第六章 (II) 格与布尔代数

  1. . 最小上界 与最大下界 .

  2. 格的常见例子:

    • , 的正因子的集合, 为整除关系, 则 是格, 其中 , .
    • 为一个集合, 则 是格, 其中 .
    • 是格, 其中 .
  3. 格的最小上界运算 与最大下界运算 满足交换律、结合律、幂等律、吸收律.
  4. 若代数系统 $(S,\,,\,\circ)\circS\preceq使(S,\,\preceq)x,\,y\in Sx\land y=x*y,\,x\lor y=x\circ y$.
  5. 子格.
  6. 格的同构.
  7. 分配格.
  8. 分配格判定定理:
    (a) 格 是分配格的一个充分必要条件是 不含有与钻石格五角格同构的子格.
    (b) 格 是分配格的一个充分必要条件是, 对任意 , 若 , 则 .
  9. 全下界 , 全上界 . 有界格.
  10. 有限格都是有界格.
  11. 为一个集合, 则 是有界格.
  12. 为有界格 的元素, 若 满足 , 则称 补元.
  13. 有补格.
  14. 在分配格中, 若一个元素存在补元, 则它的补元是唯一的.
  15. 布尔代数/布尔格 .
  16. 布尔代数的等价定义: 代数系统 $(B,\,,\,\circ)\circ0,\,1\in B使a\in Ba1=a\circ0=aa\in Ba’\in B使aa’=0,\,a\circ a’=101$ 的定义见上一项.
  17. 为布尔代数, 则任意 满足 .

第七章 图的基本概念

  1. 图的各种基本定义. 本书只讨论有限图.

  2. 空图, 平凡图.

  3. 关联次数.
  4. , 入度 , 出度 .
  5. 孤立点, 悬挂点, 悬挂边.
  6. 最大度 , 最小度 , 最大出度, 最小出度, 最大入读, 最小入度.
  7. 度数之和与边数的关系.
  8. 度数为奇数的顶点的个数是偶数.
  9. 简单图多重图.
  10. 无向完全图 有向完全图.
  11. - 正则图. - 正则图的边数 .
  12. 生成子图. 导出子图 ().
  13. 补图.
  14. 图的同构.
  15. 通路及其长度. 回路. 简单通路, 简单回路, 路径, , 复杂通路, 复杂回路.
  16. 存在通路, 则 存在路径.
  17. 连通. 连通图.
  18. 连通关系将顶点集划分为若干等价类, 由它们导出的子图称为连通分支. 连通分支的个数记为 .
  19. 最短路径距离.
  20. 使得 的极小的 称为点割集. 点割集中的点称为割点.
  21. 使得 的极小的 称为 (边) 割集. 割集中的边称为割边/桥. 若 为割集, 则 .
  22. 点连通度 , 边连通度 .
  23. .
  24. 可达, 相互可达.
  25. 弱连通图, 单向连通图, 连通图.
  26. 关联矩阵, 邻接矩阵.
  27. 通过邻接矩阵求两点之间特定长度的通路的数量.
  28. 可达矩阵.

第八章 树

  1. , 平凡树, 森林, 树叶, 分支点.

  2. 对于 条边的 阶图 , 以下命题等价:
    (a) 为树;
    (b) 的每对顶点之间有唯一的路径;
    (c) 连通, 且 ;
    (d) 无圈, 且 ;
    (f) 连通, 且 的边均为桥;
    (e) 无圈, 且在 中任何两个不相邻的顶点之间增加一条边, 就得到圈.

  3. 非平凡树至少有两片树叶.
  4. 生成树, 树枝, , 余树. 余树一般不是树.
  5. 无向连通图都有生成树.
  6. 无向连通图都满足 .
  7. 基本回路, 基本回路系统.
  8. 基本割集, 基本割集系统.
  9. 带权图. 边的 , 图的 .
  10. 最小生成树.
  11. 有向树.
  12. 若一棵非平凡的有向树, 除一个顶点入度为 外, 其余顶点入度均为 , 则称之为根树, 称入度为 的点为树根, 称出度为 的点为树叶, 称其余点为内点. 内点和树根统称分支点.
  13. 层数 , 树高 .
  14. 子点, 父点, 祖先, 后代.
  15. 根子树.
  16. 元树, 元正则树, 元完全正则树.

第九章 二部图、欧拉图、哈密顿图

  1. 二部图, 互补顶点子集.

  2. 完全二部图.

  3. 二部图判定定理: 一个无向图是二部图的充分必要条件是它没有长度为奇数的圈.
  4. 匹配. 极大匹配, 最大匹配.
  5. 饱和点非饱和点. 完美匹配.
  6. 完备匹配.
  7. Hall 定理: 二部图 有完备匹配的充分必要条件是对于 , 中的任意 个顶点至少与 中的 个顶点相邻.
  8. 欧拉通路, 欧拉回路, 欧拉图.
  9. 无向图 有欧拉通路的充分必要条件是 连通且度数为奇数的顶点不超过 个.
  10. 无向图 有欧拉回路的充分必要条件是 连通且所有顶点度数均为偶数.
  11. 有向图 有欧拉回路的充分必要条件是 弱连通且所有顶点都满足入度等于出度.
  12. 阶有向图 有欧拉通路但无欧拉回路的充分必要条件是 弱连通且各个顶点的入度与出度之差包括一个 、一个 .
  13. 哈密顿通路, 哈密顿圈, 哈密顿图.
  14. 若无向图 为哈密顿图, 的非空真子集, 则 .
  15. 若无向图 有哈密顿通路, 的非空真子集, 则 .
  16. 阶无向简单图. 若对 中每一对不相邻的顶点 , 都有 , 则 有哈密顿通路.
  17. 阶无向简单图. 若对 中每一对不相邻的顶点 , 都有 , 则 是哈密顿图.
  18. 阶无向简单图. 若 , 则 为哈密顿图.

第十章 平面图及其着色

  1. 平面图, 非平面图, 平面嵌入/表示.

  2. , 无限面/外部面, 有限面/内部面. 边界, 次数 .

  3. 面的次数之和等于边数的 倍.
  4. 欧拉公式: 若连通平面图 个顶点, 条边, 个面, 则 .
  5. 个连通分支的平面图满足 .
  6. 连通平面图 的每个面的次数都不小于 , 则 .
  7. 同构, 同胚, 收缩.
  8. Kuratowski 定理: 对于图 , 下列命题等价:
    (a) 是平面图;
    (b) 没有与 $K5K{3,3}GK5K{3,3}$ 的子图.
  9. 平面图的对偶图.
  10. (点) 着色. - 可着色, 色数 .
  11. (a) 为奇数时, ; 为偶数时, .
    (b) 非空图 的色数为 的充分必要条件是 为二部图.

期中考试时间: 2025.11.20
期末考试时间: 2026.01.07

第三章 集合的基本概念和运算

  1. 集合, 元素. 这门课介绍的是朴素集合论, 不试图定义集合. 常见的集合包括 .
  2. 属于 , 不属于 .
  3. 表示集合的方法: 列元素法 (如 ) 与谓词表示法 (如 ).
  4. 集合的元素是彼此不同的. 本书中认为 .
  5. 集合的元素是无序的.
  6. 子集, 包含 , 不包含 . .
    包含关系有传递性.

  7. 相等 . .

  8. 真子集 . .
  9. 是一切集合的子集.
  10. 元集. 集合的大小用 表示.
  11. 幂集 . .
  12. 并集 , 交集 , 相对补集 , 对称差集 :

    对称差集的另一种定义是
    .
    显然, 集合的并、交、对称差运算满足交换律.

  13. 集合的并运算与交运算满足结合律. 事实上,

    这还可以推广到无穷多个集合的情况.

  14. 针对当前的研究对象定义一个全集 , 则可定义绝对补集: 的绝对补集

  15. 文氏图.

  16. 根据 与命题逻辑的等值式, 可以得到大量关于 的运算律.

  17. 根据 , 由此可知
  18. 此外, 集合还有一些其他运算性质:
  19. 容斥原理.

第四章 二元关系和函数

  1. 有序对.
  2. 笛卡儿积 . .

  3. 笛卡尔积的性质:

  4. (从 的) (二元) 关系.
  5. 上的二元关系. 上有 个不同的二元关系.
  6. 空关系 , 全域关系 , 恒等关系 .
  7. 常见的关系: 小于等于关系, 整除关系, 包含关系.
  8. 关系矩阵关系图.

  9. 关系的定义域 , 值域 , :

  10. 关系 逆关系 .

  11. 关系 对关系 复合 . 注意, 本书采用右复合写法.

  12. 关系的一些性质:
  13. 上的关系 满足 .

  14. 上的关系 的定义是 .

  15. 上的关系 的关系矩阵为 , 则 的关系矩阵为 用逻辑加替代普通加法计算的 次幂.
  16. 关系的幂满足性质 .
  17. 有限集合上的关系的各次幂必有周期.
  18. 上的关系可能具有的性质:
    1. 自反性: .
    2. 反自反性: .
    3. 对称性: .
    4. 反对称性: .
    5. 传递性: .
  19. 上的关系可能具有的五种性质的集合描述:

    1. 自反性: .
    2. 反自反性: .
    3. 对称性: .
    4. 反对称性: .
    5. 传递性: .
  20. 关系的运算是否保持原来关系的性质:

自反性 反自反性 对称性 反对称性 传递性
× ×
× ×
× × × ×

  1. 自反闭包, 对称闭包, 传递闭包.

  2. 闭包存在唯一定理: 设 上的关系, 则:

    1. 其自反闭包 .
    2. 其对称闭包 .
    3. 其传递闭包 .
  3. 上的关系, 则
  4. 等价关系及其记号 .
  5. 上的等价关系, 则 关于 等价类
  6. 关于 商集 .

  7. 划分划分块. 注意划分块不能为空.

  8. 关于 的商集是 的划分. 反过来, 给定 的划分 , “处于 同一划分块中” 是 上的等价关系, 且 关于此关系的商集为 . 也就是说, 一个非空集合中, 等价关系与商集一一对应.
  9. 一个典型的等价关系是 等价关系 . 这一等价关系下共有 个等价类, 即

    它们组成 的一个划分.

  10. 偏序关系 (“小于等于”) 及其记号 .

  11. 可比.

  12. “小于” .
  13. 全序关系.
  14. 偏序集 . 常见的偏序集包括 与 $\langle P(A),\,R\sube\rangleR\sube$ 为包含关系).
  15. 覆盖. 哈斯图.
  16. 最小元 (“大于等于” 任何元素), 最大元 (“小于等于” 任何元素), 极小元 (不存在 “小于” 它的元素), 极大元 (不存在 “大于” 它的元素). 注意它们都是就一个定义了偏序关系的集合的子集而言的, 且都属于这个子集. 显然, 最小元和最大元若存在则唯一.
  17. 上界 (“大于等于” 任何元素), 下界 (“小于等于” 任何元素), 最小上界 (上界组成的集合的最小元), 最大下界 (下界组成的集合的最大元). 它们也是就一个定义了偏序关系的集合的子集而言的, 但不一定属于这个子集.
  18. 的最小元一定是 的最大下界; 的最大元一定是 的最小上界.
  19. (从 的) 函数. 注意, 这里的 不一定是函数的值域.
  20. 的函数有 个, 它们组成的集合记作 .
  21. 一个集合在函数下的. 函数的.
  22. 满射, 单射, 双射.
  23. 为单射, 则函数 为双射.
  24. 常函数, 单调递增/减函数, 严格单调递增/减函数.
  25. 常见的函数:
    1. 恒等函数 .
    2. 特征函数 . 它的定义是
    3. 自然映射. 设 上的等价关系, 函数 称为 到它关于 的商集的自然映射.
  26. 函数的复合.
  27. 复合运算保持函数满射/单射/双射的性质.
  28. 若函数 为双射, 则 是从 的函数, 且为双射; 否则 不是从 的函数. 是函数时, 称之为 反函数.
  29. 一个双射 与其反函数 满足

第五章 代数系统的一般概念

  1. ( 上的) 二元运算及其符号. ( 上的) 一元运算及其符号. 注意, 运算的定义隐含了封闭性.

  2. 运算表.

  3. 二元运算可能具有的性质: 交换律, 结合律, 幂等律.
  4. 幂等元.
  5. 一个二元运算对另一个二元运算可能满足分配律.
  6. 两个二元运算可能满足吸收律.
  7. 左单位元, 右单位元, 单位元.
  8. 单位元若存在则唯一.
  9. 若一个运算存在左单位元和右单位元, 则左单位元等于右单位元, 从而该运算存在单位元.
  10. 左零元, 右零元, 零元.
  11. 零元若存在则唯一.
  12. 若一个运算存在左零元和右零元, 则左零元等于右零元, 从而该运算存在零元.
  13. 单位元和零元不相同, 除非定义运算的集合只有一个元素.
  14. 左逆元, 右逆元, 逆元, 可逆.
  15. 若二元运算 满足结合律, 且 存在关于 的逆元, 则 关于 的逆元唯一, 此时通常将逆元记作 .
  16. 若二元运算 满足结合律, 若 存在关于 的左逆元和右逆元, 则这个左逆元等于这个右逆元, 从而 存在关于 的逆元.
  17. 二元运算可能满足左消去律/右消去律/消去律. 注意, 若该运算存在零元, 则消去律的要求不考虑零元. 事实上, 当定义运算的集合多于一个元素时, 零元不可被消去.
  18. 代数 (系统) 及其构成类型. 注意, 代数系统的定义要求集合非空.
  19. 子代数.
  20. 注意代数系统的表示中代数常数的意义. 两个仅有代数常数不同的代数系统是不同的代数系统. 代数常数还影响到子代数的判断. 不过, 这里有一些边缘地带, 例如, 显然不是 的子代数, 但论及 是否为 的子代数, 则见仁见智.
  21. 任何一个代数系统的最大的子代数是它本身, 比它小的子代数称为真子代数.
  22. 若一个代数系统的所有代数常数组成的集合对这个代数系统的所有运算封闭, 则该集合构成这个代数系统的最小的子代数. 它和这个代数系统本身都是这个代数系统的平凡子代数.
  23. 子代数的一个典型例子是: 构成代数 的子代数.
  24. 积代数因子代数.
  25. 积代数保持两个因子代数都具有的交换律、结合律、幂等律、单位元、零元. 然而积代数不一定保持两个因子代数都具有的消去律, 原因是积代数的一些成员不是零元, 但其第一元素或第二元素是因子代数中被豁免消去律要求的零元.
  26. (代数 到代数 的) 同态 (映射).
  27. 同态的一个典型例子是: 的同态, 其中 , 为模 加法.
  28. 同态像.
  29. 代数 的同态 下的同态像是 的子代数.
  30. 的同态. 下的同态像拥有与 对应的单位元与零元, 且同态像中的运算具有与 中对应的运算相同的性质 (交换律, 结合律, 幂等律).
  31. 满同态 $V1\sim\phi V2$, 单同态, 同构 $V_1\cong\phi V_2$.
  32. 自同态, 自同构.
  33. 自同态的一个典型例子是: 的自同态, 其同态像为 .

期中考试时间: 2025.11.20
期末考试时间: 2026.01.07

第一章 命题逻辑

  1. 命题, 真值, 真命题, 假命题.
  2. 将命题描述的事物替换为变量, 用来表示一系列命题, 这叫做命题变项. 命题变项不是命题. 需要凸显与命题变项相对时, 命题也称命题常项.
  3. 简单命题, 复合命题, 联结词.
  4. 否定 , 合取 , 析取 , 蕴涵 , 等价 . 为前件, 为后件.
  5. 联结词的优先级: 从高到低为 .
  6. 命题的符号化. 这门课里约定 “ 仅当 ” 指的是 而非 .
  7. (命题) 公式. 公式的层次 (从 开始计算). 公式的解释赋值 (成真赋值, 成假赋值).
  8. 个命题变项的公式有 个赋值, 全部列出可得到真值表. 含 个命题变项的公式, 其真值表有 种可能.
  9. 永真式 (重言式), 永假式 (矛盾式), 可满足式.
  10. 等值 (). 注意 是不同范畴的概念.
  11. 置换规则等值演算.
  12. 24 个重要等值式:
    1. 双重否定律.
    2. 等幂律, 交换律, 结合律, 分配律.
    3. 德摩根律, 吸收律.
    4. 零律, 同一律, 排中律, 矛盾律.
    5. 蕴涵等值式, 等价等值式, 假言易位, 等价否定等值式.
    6. 归谬论.
  13. 涉及蕴涵的几个等值式:
    1. .
    2. .
    3. .
    4. .
  14. 文字, 简单析取式, 简单合取式, 析取范式, 合取范式.
  15. 范式存在定理: 任一命题公式都存在与之等值的析取范式和合取范式. 事实上, 只需进行三个步骤:
    1. 消去除 外的联结词.
    2. 利用 , 内移或消去否定联结词.
    3. 利用 的分配律求析取范式, 利用 的分配律求合取范式.
  16. 极小项及其记号. 主析取范式.
  17. 主析取范式存在唯一定理. 任何命题公式均存在主析取范式, 且主析取范式唯一.

    唯一性显然. 存在性的证明方式是把简单合取式都扩充成若干极小项 (这就是主析取范式的构造方法).

  18. 极大项及其记号, 主合取范式.
  19. 主合取范式也满足存在性和唯一性. 事实上, 主合取范式的各个极大项的出现的下标就是主析取范式各个极小项中没有出现的下标.
  20. 联结词完备集. 显然 是一个联结词完备集.
  21. 都是联结词完备集.
  22. 与非 , 或非 .
  23. 都是联结词完备集. 事实上,
  24. 推理及其形式结构. 前提结论. 推理的正确性.
  25. 推出 (). 注意 是不同范畴的概念.
  26. 8 条推理定律:
    1. 附加
    2. 化简
    3. 假言推理
    4. 拒取式
    5. 析取三段论
    6. 假言三段论
    7. 等价三段论
    8. 构造性二难
  27. 推理规则: 前提引入, 结论引入, 合取引入, 推理定律.
  28. 推理的证明.
  29. 附加前提证明法归谬法.

第二章 一阶逻辑

  1. 个体词: 个体常项, 个体变项.

  2. 个体域, 全总个体域. 个体域不能为空.

  3. 谓词: 谓词常项, 谓词变项.
  4. 量词: 全称量词 , 存在量词 . 有限个体域中量词可展开.
  5. 一阶逻辑中命题的符号化.

    例 1. 在一阶逻辑中将下列命题符号化:
    (1) 有的兔子比所有的乌龟跑得快.
    (2) 不存在同样高的两个人.
    (1) , 其中 : 是兔子, : 是乌龟, : 跑得快.
    (2) , 其中 : 是人, : , : 同样高.

  6. , 原子公式.

  7. (逻辑) 公式.

  8. 指导变项, 辖域, 约束出现, 自由出现.
  9. 闭式. 在最前面加量词可使任意公式变为闭式.
  10. 解释. 注意, 解释的对象包括谓词变项, 但不包括个体变项.
  11. 赋值. 赋值的对象是自由出现的个体变项. 赋值 的值记为 .
  12. 永真式, 永假式 (矛盾式), 可满足式.

    例 2. 判断下列逻辑公式的类型:
    (1) .
    (2) .
    (1) 记此公式为 . 设 的任意一个解释, 其个体域为 . 若 为假, 则 为真. 若 为真, 由于 非空, 可设 , 则 为真, 于是 为真, 仍为真. 因此解释 为真. 由 的任意性知 为永真式.
    (2) 记此公式为 . 取解释 : 个体域为 , . 在 下, 的前后件均为真, 故 为真.
    再取解释 : 个体域为 , . 在 下, 前件为真, 后件为假, 故 为假.
    由于 在解释 下为真, 而在解释 下为假, 是非永真的可满足式.

  13. 代换实例: 用谓词公式代换命题公式的命题变项得到的逻辑公式.

  14. 永真式的代换实例均为永真式, 永假式的代换实例均为永假式.

    例 3. 判断逻辑公式

    的类型.
    此公式是 的代换实例, 而 , 故此公式是永真式.

  15. 等值 (). 显然, 命题逻辑中的等值式的代换实例均为等值式.

  16. 一阶逻辑中重要的等值式:

    1. 换名规则: 将公式中某个量词的指导变项及其在辖域内的所有出现都换成辖域内未曾出现过的某个个体变项, 所得公式与原公式等值.
    2. 量词否定等值式: .
    3. 量词辖域收缩与扩张等值式:
    4. 量词分配等值式:

      例 4. 证明下列等值式:
      (1) .
      (1)

  17. 前束范式.
  18. 前束范式存在定理: 任一谓词公式均存在与之等值的前束范式. 事实上, 只需进行以下步骤:
    1. 消去除 外的联结词.
    2. 利用量词否定等值式将联结词 向内深入, 使之直接作用于原子公式.
    3. 利用换名规则, 使所有个体变项的名字均不同.
    4. 利用量词分配等值式和量词辖域收缩与扩张等值式, 将所有量词移至公式的开始, 即辖域覆盖整个公式.
  19. 一个公式可能存在与之等值的若干有 “非平凡” 的区别的前束范式. 例如, 与前束范式 均等值.

    这个例子也告诉我们 .

  20. , 其中 根据以下规则确定: 当 时, 就是 ; 当 时, 是与 对偶的量词 (即 一个为 , 一个为 ).
  21. 上一条的一个推论是 .
  22. 一阶逻辑的推理定律的来源:
    1. 将命题逻辑的推理定律中的公式变为其代换实例.
    2. 由基本等值式生成推理定律 (24 条 + 换名规则).
    3. 量词分配蕴涵式:
  23. 一阶逻辑的推理规则:
    1. 前提引入, 结论引入, 合取引入.
    2. 推理定律.
    3. 全称量词消去 (UI): , 其中 不能在 中约束出现.
    4. 全称量词引入 (UG): , 其中 不能在 中约束出现.
    5. 存在量词引入 (EG): , 其中 不能在 中出现.
    6. 存在量词消去 (EI): , 其中 外没有其他自由出现的个体变项. 这里 表示 “为了对 应用 EI 而专门创造的个体常项”. “专门创造” 的设定的效果是禁止对另一公式 应用 EI 而引入 .

      例 5. 证明下面的推理:
      (1) 前提: , .
      结论: .
      (2) 前提: , .
      结论: .
      (3) 前提: .
      结论: .
      (1)
      [1] (前提引入)
      [2] ([1] EI)
      [3] (前提引入)
      [4] ([3] UI)
      [5] ([2] 化简)
      [6] ([4][5] 假言推理)
      [7] ([2] 化简)
      [8] ([6][7] 合取)
      [9] ([8] EG)
      (2)
      [1] (前提引入)
      [2] ([1] 置换)
      [3] ([2] 置换)
      [4] ([3] UI)
      [5] (前提引入)
      [6] ([5] UI)
      [7] ([6][4] 假言三段论)
      [8] ([7] UG)
      (3)
      [1] (前提引入)
      [2] ([1] 置换)
      [3] ([2] 置换)
      [4] ([3] 置换)
      [5] ([4] UI)
      [6] ([5] UI)
      [7] ([6] UG)

期末考试时间: 2025.12.29

往年试卷的特征:

  • 上半学期的内容占 15~40 分.
  • 代码填空占 12~15 分.
  • 手写代码占 0~11 分.

第 2 章 线性表

  1. 顺序表
  2. 单链表
    1
    2
    3
    4
    typedef struct LNode {
    ElemType data;
    struct LNode *next;
    } LNode, *LinkList;
  3. 单链表的合并
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void MergeList_L(LinkList &A, LinkList &B, LinkList &C) {
    p = A->next; q = B->next;
    r = C = A;
    while (p != NULL && q != NULL) {
    if (p->data <= q->data) {
    r = r->next = p; p = p->next;
    } else {
    r = r->next = q; q = q->next;
    }
    }
    r->next = p != NULL ? p : q;
    free(B);
    }
  4. 单链表的逆置 (无头节点)
    1
    2
    3
    4
    5
    6
    7
    8
    void ListReverse_L(LinkList &L) {
    p = L->next; q = L; r = NULL;
    while (p != NULL) {
    r = q; q = p; p = p->next;
    q->next = r;
    }
    L->next = NULL; L = q;
    }

第 3 章 栈和队列

  1. 链队列
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    typedef struct QNode {
    QElemType data;
    struct QNode *next;
    } QNode, *QueuePtr;
    typedef struct {
    QueuePtr front, rear;
    } LinkQueue;

    Status InitQueue(LinkQueue &Q) {
    Q.front = Q.rear = (QueuePtr)malloc(sizeof(QNode));
    if (Q.front == NULL) exit(OVERFLOW);
    Q.front->next = NULL;
    return OK;
    }

    Status EnQueue(LinkQueue &Q, QElemType e) {
    p = (QueuePtr)malloc(sizeof(QNode));
    if (p == NULL) exit(OVERFLOW);
    p->data = e; p->next = NULL;
    Q.rear = Q.rear->next = p;
    return OK;
    }

    Status DeQueue(LinkQueue &Q, QElemType &e) {
    if (Q.front == Q.rear) return ERROR;
    p = Q.front->next;
    e = p->data;
    Q.front->next = p->next;
    if (Q.rear == p) Q.rear = Q.front;
    free(p);
    return OK;
    }
  2. 循环队列
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    typedef struct {
    QElemType *base;
    int front, rear;
    } SqQueue;

    Status InitQueue(SqQueue &Q) {
    Q.base = (QElemType *)malloc(MAXQSIZE * sizeof(QElemType));
    if (Q.base == NULL) exit(OVERFLOW);
    Q.front = Q.rear = 0;
    return OK;
    }

    int QueueLength(SqQueue Q) {
    return (Q.rear - Q.front + MAXQSIZE) % MAXQSIZE;
    }

    Status EnQueue(SqQueue &Q, QElemType e) {
    if ((Q.rear + 1) % MAXQSIZE == Q.front) return ERROR;
    Q.base[Q.rear] = e; Q.rear = (Q.rear + 1) % MAXQSIZE;
    return OK;
    }

    Status DeQueue(SqQueue &Q, QElemType &e) {
    if (Q.front == Q.rear) return ERROR;
    e = Q.base[Q.front]; Q.front = (Q.front + 1) % MAXQSIZE;
    return OK;
    }

第 4 章 串

  1. KMP 算法

按教材定义,

其中 的 border 长度.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int Index_KMP(SString S, SString T, int pos) {
i = pos; j = 1;
while (i <= S[0] && j <= T[0]) {
if (j == 0 || S[i] == T[j]) {
i++; j++;
} else j = next[j];
}
return j > T[0] ? (i - T[0]) : 0;
}

void GetNext(SString T, int next[]) {
i = 1; j = 0;
next[1] = 0;
while (i < T[0]) {
if (j == 0 || T[i] == T[j]) next[++i] = ++j;
else j = next[j];
}
}

  1. next 数组的改进: nextval
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void GetNextval(SString T, int nextval[]) {
    i = 1; j = 0;
    nextval[1] = 0;
    while (i < T[0]) {
    if (j == 0 || T[i] == T[j]) {
    ++i; ++j;
    nextval[i] = T[i] != T[j] ? j : nextval[j];
    } else j = nextval[j];
    }
    }

第 5 章 数组和广义表

  1. 矩阵的三元组顺序表存储
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    typedef struct {
    int i, j;
    ElemType e;
    } Triple;
    typedef struct {
    Triple data[MAXSIZE + 1];
    int mu, nu, tu;
    } TSMatrix;

    Status FastTransposeSMatrix(TSMatrix M, TSMatrix &T) {
    T.mu = M.nu; T.nu = M.mu; T.tu = M.Tu;
    num[1..M.nu] = 0;
    for (t = 1; t <= M.tu; t++) num[M.data[t].j]++;
    cpot[1] = 1;
    for (col = 2; col <= M.nu; col++)
    cpot[col] = cpot[col - 1] + num[col - 1];
    for (t = 1; t <= M.tu; t++) {
    col = M.data[t].j;
    T.data[cpot[col]++] = M.data[t];
    }
    return OK;
    }
  2. 矩阵的行逻辑链接顺序表存储: 按行优先顺序存储, 维护每一行在数组里的起始位置 . 做矩阵乘法 时, 按顺序遍历 的每一个非零元, 设其行号为 , 列号为 , 则它和 的第 行中的元素相乘会对矩阵的乘积 (的第 行) 产生贡献. 在目前处理到的 的行号为 时, 暂存 的第 行; 处理完 的第 行后, 把暂存的 的这一行中的非零元填入 的存储结构中. 在这一过程中要记得记录 数组.
  3. 矩阵的十字链表存储
    1
    2
    3
    4
    5
    6
    7
    8
    9
    typedef struct OLNode {
    int i, j;
    ElemType e;
    struct OLNode *right, *down;
    } OLNode, *OLink;
    typedef struct {
    OLink *rhead, *chead;
    int mu, nu, tu;
    } CrossList;
  4. 第一类广义表
    1
    2
    3
    4
    5
    6
    7
    8
    typedef enum { ATOM, LIST } ElemTag;
    typedef struct GLNode {
    ElemTag tag;
    union {
    AtomType atom;
    struct {struct GLNode *hp, *tp; } ptr;
    }
    } *GList;
  5. 第二类广义表
    1
    2
    3
    4
    5
    6
    7
    8
    9
    typedef enum { ATOM, LIST } ElemTag;
    typedef struct GLNode {
    ElemTag tag;
    union {
    AtomType atom;
    struct GLNode *hp;
    }
    struct GLNode *tp;
    } *GList;

第 6 章 树和二叉树

  1. 二叉树的链式存储结构
    1
    2
    3
    4
    typedef struct BiTNode {
    TElemType data;
    struct BiTNode *lchild, *rchild;
    } BiTNode, *BiTree;
  2. 二叉树的线索化
  3. 树的三种存储结构
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    typedef struct PTNode {
    TElemType data;
    int parent;
    } PTNode;
    typedef struct {
    PTNode nodes[MAX_TREE_SIZE];
    int r, n;
    } PTree;

    typedef struct CTNode {
    int child;
    struct CTNode *next;
    } *ChildPtr;
    typedef struct {
    TElemType data;
    ChildPtr firstchild;
    } CTBox;
    typedef struct {
    CTBox nodes[MAX_TREE_SIZE];
    int r, n;
    } CTree;

    typedef struct CSNode {
    ElemType data;
    struct CSNode *firstchild, *nextsibling;
    } CSNode, *CSTree;
  4. 赫夫曼树: 每次取 最小的两个节点.

第 7 章 图

可能考手写完整代码的: 邻接表基础操作, DFS, BFS, Dijkstra, Floyd.

  1. 数组表示法 (邻接矩阵)
  2. 邻接表
    1
    2
    3
    4
    5
    6
    7
    8
    9
    typedef struct ArcNode {
    int adjvex;
    struct ArcNode *nextarc;
    InfoType *info;
    } ArcNode;
    typedef struct {
    VertexType data;
    ArcNode *firstarc;
    } VNode, AdjList[MAX_VERTEX_NUM];
  3. 十字链表: 其实就是在邻接矩阵的对应位置上画弧结点, 弧结点除弧尾 tailvex 与弧头 headvex 外还要加上纵向链 hlink 和横向链 tlink. 然后顶点结点存储纵向链表和横向链表的头指针 firstin, firstout.
  4. DFS 与 BFS; 对应的生成树 (森林)
  5. Kosaraju 算法求强连通分量: 在反图上按 DFS 序的逆序遍历.
  6. Prim 算法求最小生成树: 每次将 之间代价最小的边加入 . 实现 复杂度的方法是: 设置辅助数组 closeedge, 其每个元素都含有 adjvexlowcost 两个域, 在 时, closeedge[i-1].lowcostcloseedge[i-1].adjvex 分别表示连接 中的点与 的最小边的代价与这条边连接到的 中的点.
  7. Kruskal 算法求最小生成树: 每次取未使用的最小边, 若加入当前的生成树中不构成环则加入.
  8. 拓扑排序: 注意用队列还是用栈是无所谓的.
  9. 关键路径: 按拓扑序做简单 DP 就能求出值. 麻烦的是求方案. 记求得的以 结尾的最长路径为 . 令 , 作反向递推 , 则活动 为关键活动的条件是 .
  10. Dijkstra 算法求单源最短路径
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    void ShortestPath(Graph G, int v0, ShortestPathTable &D) {
    final[] = FALSE; final[v0] = TRUE;
    D[] = G.arcs[v0][]; D[v0] = 0;
    for (i = 1; i < G.vexnum; ++i) {
    min = INFINITY;
    for (w = 0; w < G.vexnum; w++)
    if (!final[w] && D[w] < min) {
    min = D[w]; v = w;
    }
    final[v] = TRUE;
    for (w = 0; w < G.vexnum; w++)
    if (!final[w]) D[w] = min(D[w], min + G.arcs[v][w]);
    }
    }
  11. Floyd 算法求全源最短路径: 注意 的意义是只经过 号顶点的路径的最小值.

第 9 章 查找

  1. 折半查找 (最坏情形下查找长度 )

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int Search_Bin(SSTable ST, KeyType key) {
    low = 1; high = ST.length;
    while (low <= high) {
    mid = (low + high) / 2;
    if (EQ(key, ST.elem[mid].key)) return mid;
    if (LT(key, ST.elem[mid].key)) high = mid - 1;
    else low = mid + 1;
    }
    return 0;
    }

  2. 斐波那契查找 (平均性能优于折半查找, 最坏性能不如折半查找)

alt text

  1. 次优查找树: 选择的根节点应使得左右子树的 之差的绝对值最小. 确定根节点后, 递归地构建左右子树.
  2. 分块查找 (索引顺序查找): . 当 时, 取得最小值 .
  3. BST (删除操作应该不会考)
  4. AVL 树

    • 教材中平衡因子的定义是左减右.
    • 四种失衡情形及对应的旋转: LL - R, RR - L, LR - LR, RL - RL.
    • 旋转的代码记一下, 可能会考默写:
      1
      2
      3
      4
      5
      6
      void R_Rotate(BSTree &p) {
      lc = p->lchild;
      p->lchild = lc->rchild;
      lc->rchild = p;
      p = lc;
      }
    • 删除操作不讲.
  5. B 树

    • 控制的变量:
      • 每个结点至多 度.
      • 结点树 时根节点至少 度. (推论: 不存在结点数为 的 B 树.)
      • 非根非叶子结点至少 度.
      • 叶子在同一层.
      • 结点 里存储的 个数将值域分为 个区域, 决定插入的位置.
    • 插入:

      • 根据数值找到对应的叶子结点, 在叶子里加数 (注意不是加叶子).
      • 结点里的数的个数超过 了, 就将这个结点分裂成两个结点. 这个结点的父结点里需要有一个数来隔开分裂成的两个结点表示的区间, 因此将分裂开的结点的中位数提升到父节点里. (如果分裂开的结点是根结点, 则在上面创建一个新的根结点.) 提升可能会导致父结点的数也超过了, 此时就要重复这个过程, 直到所有结点的度数符合要求.
      • 关于分裂后孩子跟谁的问题, 事实上永远有且只有一种能够维持结点里数的个数与孩子的个数的关系的方案.

    • 删除:

      • 如果被删除的数所属结点不是叶子结点, 就把被删除的数换成叶子结点中比它大的最小数, 并试图删除叶子结点中的这个数.
      • 现在要删除叶子结点 中的一个数 . 如果 中数的个数 , 则可以直接删除.
      • 否则, 中数的个数为 . 我们先删除 . 如果 的右 (左) 同胞结点中数的个数 , 则将这些数的最小 (大) 者上移至父结点,并将这个数在父结点中的前驱 (后继) 下移至 中. 如果左右同胞结点中数的个数均为 , 则让 与右 (左) 同胞结点 (记为 ) 以及父结点中隔开 的数 执行分裂过程的反过程 (称为融合). 如果父结点因融合而没有足够的数了, 则认为原本有 个数的父结点被删去了数 , 将父结点视为新的 , 将 视为新的 重复 “从 删除 ” 的过程.

    • 性能分析: 设一棵 阶 B 树深度为 , 含有 个关键字. 由于叶子结点的数量 , 有 $h\le\log{\lceil m/2\rceil}\dfrac{n+1}2+2\le\log{\lceil m/2\rceil}\dfrac{n+1}2+1$.
  6. 哈希表
    • 冲突处理 (设哈希表长度为 ; 以下所说的 “偏移” 都是模 意义下的):
      • 线性探测再散列: 依次尝试在哈希值的基础上偏移 .
      • 二次探测再散列: 依次尝试在哈希值的基础上偏移 .
      • 随机探测再散列: 生成随机数序列作为在哈希值的基础上的偏移.
      • 简单再哈希: 计算另一哈希函数的值.
      • 链地址法: 给哈希表的每一个位置拉一个链表.
    • 性能分析:
      • 定义装填因子 为表中的记录数与表长之比.
      • 二次探测、随机探测与简单再哈希都满足查找成功时的 ASL 为 且查找不成功时的 ASL 为 .

第 10 章 排序

  1. 直接插入排序与折半插入排序
  2. 二路插入排序: 见这里.
  3. 表插入排序: 注意重排算法的写法.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    // 重排算法
    void Arrange(SLinkListType &L) {
    p = L.r[0].next;
    for (i = 1; i < L.length; i++) {
    while (p < i) p = L.r[p].next;
    q = L.r[p].next;
    if (p != i) {
    swap(L.r[p], L.r[i]);
    L.r[i].next = p;
    }
    p = q;
    }
    }
  4. 希尔排序: 每一轮有一个模数, 要对与每一个剩余类, 给属于这个剩余类的位置构成的子序列排序. 逐渐减少模数.
  5. 起泡排序
  6. 快速排序 (平均 , 最坏 )
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    int Partition(SqList &L, int low, int high) {
    L.r[0] = L.r[low];
    pivotkey = L.r[low].key;
    while (low < high) {
    while (low < high && L.r[high].key >= pivotkey) --high;
    L.r[low] = L.r[high];
    while (low < high && L.r[low].key <= pivotkey) ++low;
    L.r[high] = L.r[low];
    }
    L.r[low] = L.r[0];
    return low;
    }
    void QSort(SqList &L, int low, int high) {
    if (low < high) {
    pos = Partition(L, low, high);
    QSort(L, low, pos - 1); QSort(L, pos + 1, high);
    }
    }
  7. 选择排序
  8. 锦标赛排序
  9. 堆排序 (建堆比较次数 , 总比较次数 )
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    typedef SqList HeapType;
    void HeapAdjust(HeapType &H, int s, int m) {
    rc = H.r[s];
    for (j = 2 * s; j <= m; j *= 2) {
    if (j < m && LT(H.r[j].key, H.r[j + 1].key)) ++j;
    if (LQ(H.r[j].key, rc.key)) break;
    H.r[s] = H.r[j]; s = j;
    }
    H.r[s] = rc;
    }
    void HeapSort(HeapType &H) {
    for (i = H.length / 2; i > 0; i--) HeapAdjust(H, i, H.length);
    for (i = H.length; i > 1; i--) {
    swap(H.r[1], H.r[i]);
    HeapAdjust(H, 1, i - 1);
    }
    }
  10. 归并排序 ()
  11. 基数排序 ()
  12. 稳定性: 选择排序、堆排序、快速排序是不稳定的, 其他是稳定的.
  13. 归并排序最坏情况下的比较次数:
1 2 3 4 5 6 7 8 9 10
0 1 3 5 9 11 14 17 25 27
  1. 快速选择算法
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    // 第 k 小
    RcdType QuickSelect(SqList &L, int st, int en, int k) {
    if (st == en) return L.r[st];
    low = st; high = en;
    pivotkey = L.r[st];
    while (low <= high) {
    while (low <= high && L.r[low].key < pivotkey) low++;
    while (low <= high && L.r[high].key > pivotkey) high--;
    if (low <= high) swap(L.r[low++], L.r[high--]);
    }
    if (st + k - 1 <= high) return QuickSelect(L, st, high, k);
    if (st + k - 1 >= low) return QuickSelect(L, low, en, k - (low - st));
    return L.r[high + 1];
    }

很遗憾以这种方式“认识”傅国涌老师。先是在前天看到微信推送的两篇关于与他交往的往事的分享,有些好奇他是怎样一个人。随后,不等我搜索,微信便给我推荐了许多悼念他的文章。你说我被算法捉弄了吧;但要推荐这些文章,它们首先得存在,事实上,它们来自许多不同的人——与他有交集的作家,出版他的书的出版商,他在“国语书塾”的学生,以及许多与他没有交往但敬佩他的人——追忆他的视角也各不相同。可见他的确在许多人心中打下了深刻的烙印。再加上那本讲述 1949 年中国知识分子的抉择的书的名字,我好像听说过,我就愈发对他——他的著作,他的思想,他的为人——感到好奇,仅两天过去,我收藏的纪念他的文章竟达 20 篇之多。

令我印象最深刻的,是他在 7 月 6 日——也就是他突发心脏病逝世的前一天——发的那条朋友圈。K1373 列车停运数小时、小伙砸窗给乘客通风的新闻,配上两个字,“开窗”。没有叹号,也没有额外的评论。从我这两天了解到的信息来看,傅国涌的风格就是这样:平静,但拒绝沉默。他用自己的方式说着他想说的话。“开窗”,说的当然不只是这列火车。他写《笔底波澜:百年中国言论史的一种读法》,写《大商人:影响中国的近代实业家们》,写《主角与配角:近代中国大转型的台前幕后》,讲述着百年前中国人“开窗”的尝试;他办“国语书塾”,提倡“与世界对话”,又何尝不是给孩子们的心灵开一扇“窗”。

他终年不到 59 岁,但在不长的人生中,他做了许多事。一些微信公众号文章和下面的一些评论提到了,在 90 年代,他三度身陷囹圄,原因也不难猜测。到了 00 年代,他以历史学者的身份复出,凭借《1949 年:中国知识分子的私人记录》《金庸传》《主角与配角》收获了大批读者,忽然成了公众人物。到了人们开始用手机看短视频的年代,他说他要办一个“国语书塾”,引领“童子”们阅读、写作、“与世界对话”。很突然,对吧?他的解释是,他 50 岁了,王国维说他“五十之年,只欠一死”,选择投湖自尽,他是“五十之年,只欠一生”,想要做些和之前不太一样的事,让他的人生更加完整。

当然,有人说他另有隐情:在 00 年代,“地北天南,不少机构请他演讲,他一度甚至成为电视台追捧的对象”(丁东语),可是后来他遭到了阻挠,转型其实是无奈之举。但无论如何,他是在用心办教育的。《给教育燃灯》《寻找语文之美》《寻找中国之美》,换作是 00 年代,你很难想象这些书的作者是傅国涌;但对于跟随他的那些和我年龄相仿的学生而言,他们那亲切和蔼、思想深邃的老师写这些书,是再合适不过的事。好的教育是播种——它会在将来生根发芽、开花结果。只可惜这“书塾”的创始人只陪伴了“童子”们八年——希望有人能继承他的“母语教育”事业吧!

出版人“老张”回忆了傅国涌人生中的最后几年——在东京写作和出版的几年。在“老张”的帮助下,傅再版了《1949 年》一书,出版了构思了 16 年的讲述《大公报》、商务印书馆、北京大学的《一报一馆一大学》。近年来,在日华人华侨的数量增加了许多,东京大学出乎意料地成为了中国旅日知识分子开讲的地方,秦晖,傅国涌,办“飞地(NowHere)”书店和“在场”非虚构写作奖学金的张洁平,都来了。(说起来,我知道这“在场”奖学金,还读过一篇获奖作品。这世界真小。)在东京开讲的日子里,他想必十分快活吧!哪怕在病痛缠身的时候,他还写了讲述 19 世纪末 20 世纪初在日本的中国人的《在东京重造中国》。这本今年 5 月出版的书成为了他的最后一部作品。

有人把微信公众号里涌现大量悼念傅国涌的文章称为“傅国涌现象”。这“现象”得以产生,一方面是因为傅国涌交游甚广,另一方面也是因为他代表了我们越来越难找到的一类人——一类拥有理想、有良知,愿意为之说些话、做些事的人。看他发过的那些微博,你会感叹“这也能说!”。当然,世事凶险,他很难逃脱一些人的指责与谩骂,只是倘若有人找上门来骂他是“毒公知”,他还是会一笑而过,转身给孩子们讲那雁荡山的石头

不要把笔记存到 Markdown 编辑器网站上!

不要把笔记存到 Markdown 编辑器网站上!

我昨晚在某个在线 Markdown 编辑器那里记了大约一页半的概率论笔记,按了保存,结果再登录的时候笔记就不见了!

要记 Markdown 笔记,就老老实实用 VSCode 写,本地存储,不然你就可能像我这样要花 50 分钟重写一遍!

说明:为保护隐私,部分人名以字母代替。

说完最后那句“谢谢老师”之后,我走出西部片区 2 号楼 108 教室,示意排在我后面的 CJS——也是我的 XCPC(“ACM”)队友——进来。稳了,我想。

面试中对我最大的考验,是“既然你英语这么好,请你展示一下你的英语水平”。我之前准备了一句英文的可以作为自我介绍的话,于是我用它和一些基本信息拼成了一段简短的英语自我介绍。另外两个问题分别是“在 ACM 队里你的分工是什么”和“动态规划通常使用什么数据结构”。都不难回答——我只需要组织一下语言,描述一下我的经验就好了。而且既然问了这样的问题,那转专业自然是稳了。

大约 27 个小时之后,我看到了名单。我不仅顺利转入计算机科学与技术专业,从名单上看起来,我还是第一名。不过想到我满分的机试成绩,以及从清明假期开始准备的、用 Typst + Touying 精心制作的自我介绍幻灯片,这也并不奇怪。在新消息目不暇接的转专业交流群下面,CJS 已经在和我商讨组建宿舍的事。

虽然这一切都在我的计划之内,我还是感到有些恍惚。我的思绪里飞快地飘过一幕幕不远之前的画面——

我一开始构想的转专业第一志愿,其实不是计科,而是网络空间安全。当然,那是去年的 8 月,一切都只有一些模糊的轮廓,模糊到我连海洋和生态环境专业分别有哪些方向、信息学院大一有哪些课都说不出。当时选择网安的原因也相当现实——我担心转专业竞争太大,为了万无一失,想要在第二志愿填一个其他学院的更好转入的专业,而第一志愿自然要填信息学院比较好转的专业。再加上我长期关注阮行止的博客,对网安专业是做什么的比较有概念,也比较能接受自己像阮老师那样身为曾经的信息学竞赛(OI)选手而进入网安专业,我似乎已经做好了“换一条照样不错的赛道”的准备。

在 9 月和 10 月间,我投入算法竞赛的时间并不多。在 9 月下旬我参加了一个名为“第三届全国大学生算法竞赛”的比赛,获得了二等奖,但那毕竟是一个野鸡比赛。但我不可能忘记的一件事是报名蓝桥杯。这个比赛我在中学期间就有耳闻,我甚至还知道有 A 组 B 组,有提交答案题。我记得从 10 月底到 11 月初,我每天都要去信息学院的网站上查看是否有蓝桥杯的报名通知。11 月 12 日,这通知发出来了。

通知上有一个厦大蓝桥杯交流群的链接。当然,进入交流群有一点小小的困难。你问我你们学院的辅导员叫什么名字,我当然不知道。但既然是要转入信息学院的人,怎么能没有一个信息学院的学生最基本的信息检索能力呢?半小时后,我就在信息学院的一个微信公众号里找到了问题的答案。于是我第一次与厦大信息学院、电子学院和其他学院的这么多同学在网络上连接起来。

这时候,我的想法开始转变了。网安终究是和这么多年来我做的事情截然不同的方向,我真的要为了那点“稳妥”,去放弃我其实早已开始学习的计科吗?特别是当我翻看蓝桥杯、CSP、CCPC 和 ICPC 的题目时,这一切都如此地亲切;而网安于我而言,似乎和我在转专业失败的情形下渴望选择的方向——海洋物理——一样陌生。

2024 年 11 月 19 日的晚上寒风料峭。我从图书馆走出来,在旁边的教学楼的一排楼梯底下坐下。几分钟后,与 XCPC 队教练 Dr D 的约定好的通话开始了。

我确认了我学习算法的经历,以及加入 ACM 队的意愿。Dr D 问我擅长哪些算法,我如实说了。他说,我还要补一下短板,不过,“先来队里训练吧”。

第一次来到训练室——西部片区 4 号楼 104——的时候,我不知道该和队长 ZPC 聊些什么,但我久仰 ZPC 的大名,知道他是从海洋与地球学院转到信息学院的,便说起了转专业的事。他说,转专业考试非常简单,他当时“十分钟就出来了”。

是不是十分钟,我将信将疑;但我知道转专业的考试时长是两小时,即便这是夸张,我这几个月恢复一下手感,应该是能做出全部四道 C 语言编程题目的。那我非报计科不可了。

这个时间加入 XCPC 队,多少有些尴尬;一个赛季刚好进入尾声,而下一个赛季要在八个月之后才开始。但现在没有时间想这么多——每周六下午,尽管是一个人,一台电脑,也要像组好队的同学那样在 Codeforces 上模拟参加(virtually participate in)区域比赛。至少,其他队伍此起彼伏的讨论题目做法的声音,给了我一种家的感觉。

时间过得很快。寒假期间,我向父母告知了我的打算——一志愿计科,二志愿网安。我没说如果转不过去就去学海洋物理;这话听起来不太吉利。开学之后,我终于有了一位队友——CJS。他思维十分敏捷,他向我讲题目的做法时,我往往要请求放慢速度。我们一起想题、验证算法的正确性、互相帮忙调试代码。我总算体验到在一个队里参加算法竞赛的感觉了。

3 月 30 日,星期日,晚上七点。我在肯德基吃完晚饭,带着一些疲惫回到宿舍。

几分钟后,舍友 HY 问道:“你是不是参加了那个信息竞赛?”

我愣了一下:“哪个竞赛?”

“就是那个……CSP。他们在群里发了名单,你考到了一百多名。”

CSP 是认证,不是竞赛;但能排在一百多名,有些出乎我意料。当然,一部分原因是一些强的选手去年 12 月就考了这个认证,满载高分而归,从而把 3 月的位置空了出来;但这场考试毕竟有六千多人参加。我很快确认了消息属实。我那 360 分,虽然我还不是很满意,但已经排在了前 2.1%。

至于我的舍友是从哪个群里拿到 CSP 名单的呢?我立刻就明白了。这时候,转专业的氛围已经形成。前哨战是物理拔尖计划,和我一样作为为数不多的 2024 级选手参加大学生数学竞赛的 CZA 便成功从建筑专业转入物理专业。3 月 19 日,转专业通知发布了。计划转专业的同学发现,通知发布到考试的时间跨度,以及录取的时间窗口,都大幅缩小。虽然海洋与生态环境类学生的生活,已经成为实验报告、预习报告、实验报告、预习报告的循环往复,加上微积分与物理作业的点缀;但在有意离开的同学中间,当然会暗流涌动。这个群一定是转入信院的交流群。

直到加入了交流群,我才知道同学们为转专业做了多少准备。有人在开学初退掉了当前专业的课,退课多者谓之“梭哈”——该词疑似来自扑克牌游戏中的 Show-hand,后来在网络上取其“将筹码全部押上”之意引申到其他领域。群里的学长们举办了一些“萌新赛”,并提供了往年的转专业试题。热心的学长们还做了转专业意愿调查,这样大家都能估计自己将要遭遇的竞争的激烈程度。信息学院实在是有薪火相传的开源精神。

4 月 3 日,信息学院发布了转专业细则。名额缩减了,还增加了报名门槛。细则里有一个歧义,即中学期间在学科竞赛中获奖的选手是同时受 3.0 的 GPA 限制和 30% 的排名限制,还是只受 GPA 限制。后来信息学院答复说只受 GPA 限制,不过我的 GPA 排在前 30% 以内,所以无论如何都能报名。还有一个细节,就是考试时长增加到两个半小时。

接下来的机试备考,无非是打打学长提供的模拟赛,以及熟悉熟悉 C 语言。但以防万一,考前我还是复习了一下算法。面试我反而不那么熟悉——此前我只面试过三次。PPT 自我介绍,我更是没有做过。我的自我介绍,应该用什么 PPT 模板呢?是大学语文课上甲同学的那种风格,还是大学英语课上乙同学的那种风格?

我突然想起一件事。好,现在,那些花里胡哨的 PPT 模板,我都不用。我要用学计算机的人用的东西——LaTeX Beamer 或 Typst + Touying。LaTeX Beamer 有些陈旧,又不好个性化。Typst + Touying 是新东西,连开发它的 Rust 语言都是新东西,我选它。事实证明,我的 PPT 没有动画效果,没有复杂图案,却赏心悦目。

我的幻灯片和自我介绍的稿子都改过很多次。我参考了网络上一些人的简历。幻灯片中“这些年,我学会了……”一节的前半部分,便是一份简历上必定会包含的“技能”板块。我得感谢自己在寒假学了 Java 和 Python,这让我的“编程语言”一栏没有那么贫瘠。

然后就是在图书馆的演示练习室准备面试。接着就是机试——76 分钟获得满分。再接着就是这篇文章开头提到的面试。最后这两天,反而是过得最快的。

于是,4 月 21 日,我在名单上看到了计算机系的自己。

感谢同样要转专业的 YSM 与 CHZ 给我提供 XCPC 队的联系方式。

感谢 XCPC 队教练 Dr D 对大一新生参加训练的支持。

感谢舍友 HY 向我透露转专业群的存在。

感谢队友 CJS 的帮助和配合,尤其感谢你提供转信院交流群的群号。

感谢转信院交流群中所有同学的分享,特别是学长们的无私奉献。

感谢 CZA 分享关于转入物理学院的信息(虽然我很快否决了转入物院的想法)。

感谢父母的陪伴和支持,尤其是母亲在转专业考试前的陪伴、关心和建议。

感谢多年来奋斗的自己。

我最近有一些事要做。我要补回因准备转专业考试而变得有些生疏的微积分和物理。我还要去福州参加大学生英语竞赛的决赛。如果还有时间,那就开始学习信息学院大一的课程——线性代数、概率统计。

至于更长远的计划,我也开始有一些想法了。

前两天闲来无事,看了看新加坡 OI 选手 Ashley Khoo 的博客。我不喜欢新加坡的某些方面,但我很喜欢像他这样的新加坡年轻人。他的博客字里行间洋溢着一种灵性:可以出二十几道题给新国大的的同学做;可以去听一位来访的教授讲组合数学题,尽管当天晚上就要飞去南非参加兵役要求的军事演练;可以尝试学习新的语言;可以去应聘某公司的兼职,然后写文章说他们出尔反尔,劝大家不要去,尽管时薪高达 45 美元;可以撰写长文,“引经据典”地讨论 OI 训练方法;而最近他在考虑要不要跳去剑桥,尽管他已经获得了免修大量新国大课程的资格。当然,这是 IOI 金牌选手,我们的能力很难和他相比;但我很想像他一样,拥有一种对自己现在正在做什么、未来又要做什么的明确想法,拥有对周围的世界的深刻洞察力,而且愿意与他人分享自己的想法。我认为这是中国的年轻人,包括我在内,迫切需要的。我希望,在信息学院,我能找到这种灵性。

总而言之,不知不觉间,我就要离开我暂时的住处,到达更适合我的新环境了。

轻轻的,我来了。

正如我轻轻的走。


[1] “学长”的字面本来不区分性别;我一向反对给“学长”一词带上性别色彩。
[2] 新加坡规定所有年满 18 岁的男性公民都要参加为期两年的国民服役(National Service)。役男依其身体状况和训练状况被安排在新加坡军队和警察的不同岗位上。


我把这个博客的 NexT 主题从 v5.1.4 更新到了 v7.8.0,并增加了 utterances 评论系统。您可以用 GitHub 账号登录并发表评论。评论支持 Markdown。

高考

过完年没几天,高三第二学期就开始了。我的语文和数学都是 100 出头,英语 130+,物理分数取决于难度,预计去高考有 80+,化学和地理都是赋分的,就不估计了,但化学极其差,地理也不好。于是从一开始我每周就会请十来节课的假,在家做语文题数学题什么的。语文非常玄学,通常除作文外能拿到五十几分或六十几分,但有时候能拿到七十几,有时候连五十分都没有。之前定下了一个策略,把那 150 分钟平均分成三块,第一块做语言文字运用、文言文和古诗鉴赏,第二块写作文,第三块写两篇现代文,当然实施起来自然会遇到各种问题,但总体上这个安排比较靠谱,就没改了。数学卷子的结构确定调整了,于是又制定策略,总之就是先把简单的题都做了。其他科目呢,就是各种练习,以及听网课,这里略去不表。

英语听说考试之前每天都在练,一会儿 18 分一会儿 19 分,考完觉得还好,没有什么大失误。一模前两天发烧了,去考试的第一天喉咙还是不舒服的,但一模大概排在 1300/32000+,作文拿到了 49 分,化学和地理考得还不错。这时候我开始专门练习怎么写好语文作文。我的英语考试扣分的地方基本集中在作文,于是就开始看各种好词好句。与此同时还会做那种非常难的物理题,提高熟练度。这时候要报名强基了,我想着强基就是要冲一把,报了个复旦大学信息与计算科学专业。

但是二模考砸了,掉到了两千多名。这时离高考还有一个月,学校的周测也改成了周五和周六测所有科目,于是我和班上的许多同学都是每周在周测和讲评的那几天回校,剩下的时间请假在家学习。英语听说考试的成绩出来了,我 19 分,班上除了三个满分的同学之外都是 19 分。一转眼就到了学校的三模,语文破天荒考到了 123 分,心想这么好的状态得保持住。最后一段时间又把更多时间花在了文科上。

然后就是高考了。

考完估分 [632, 636]。然后去考复旦的机试。没过。

6 月 25 日出分了,624,化学和物理的分数估高了。省排名九千多(共 45 万人),大概和二模成绩差不多,一看,没到去年的中大线。那一天我还在考虑大连理工,结果第二天发现大连理工缩招了,那确实上不了了。接下来就是研究中大、华工和厦大的专业组,纠结了三天报华工的 203 还是 204,把我的直觉和统计与概率知识全都用上了,最终还是觉得报 203 更可能成功。厦大这边呢,想了好久六个专业的顺序,最后一小时还用修改的机会加了一重保险。几天之后去考中大的综评,也没过。

接着便开始了每天上午的微积分学习,以及每天下午的报复性外出游玩。

7 月 19 日投档线出来了,以半分之差没能上中大,进了厦大。两天后的下午,我在琶洲闲逛时(碰上这里办漫展,周围全是 cosplayer),得知我进了海洋与生态环境类,这下心中的石头才落了地。

说来奇怪,我现在连一模、二模和三模的语文作文题目都完全忘记了。遗忘是人类的大脑清理垃圾的表现,只是我遗忘的速度让我自己有些震惊。(事实上,上面的排名数据也不保证准确。)至于这种遗忘是好事还是坏事,就见仁见智了。

不要搞错了:我永远不会赞美、歌颂高三的生活,因为那终究是迫不得已,终究是一种不正常的状态——为了榨出最后一些分数而日复一日地把时间浪费在刷题上。这是在发达的地方;在不发达的地方,高考成为了拘禁和虐待的借口。稍后我还会提这件事。

暑假

2024 年的暑假可谓相当充实。我整个暑假都在练习做饭(虽然一个学期过去又不会做了,哈哈),学习了整个大一第一学期要学的微积分,继续学习算法,继续练习英语,坐地铁到处逛,还搬了家。

被分到了环境与生态学院。在英语分班考中,我以 95.5/100 的成绩顺利进入大学英语(四)课程。扣掉的 4.5 分里有 4 分是听力的分,以后要多练练。

尝试

如果要用一个词来总结我的甲辰龙年,那就是“尝试”。

上半年为了进入一个好大学而尝试各种策略和方法,自不必提。下半年的 9 月,我第一次完整地体验 XCPC 比赛的感觉(虽然那是个单人赛);10 月,我加入了软件学社;11 月,我参加了大学生数学竞赛,并加入了学校的 XCPC 队;12 月,我参加了 CACC 和 CSP 认证,并入围 CACC 决赛。在实验课上,我尝试了许多以前从来没做过的实验操作,从用移液管移取液体,到戴着手套、拿着小刀解剖乌贼(俗称墨鱼);为了完成普通生物学、新生研讨课、宜居地球三门课程的小论文时,我尝试读懂《自然》《科学》《细胞》和各个学科分支的顶级期刊中的论文;为了提高我的英语水平,我试着参加了一些英语比赛,成绩有的很好,有的不那么好,但都收获满满;体育课我选了定向越野,虽然以前从来没接触过这项运动,但在这门课里我获得了非常充实愉快的体验。

将来,当我进入实验室(无论哪一种),为了项目的进度的而焦头烂额,甚至不得不奋战到深夜时,我大概会怀念有时间和精力不断尝试的时光吧。但即便到了那时,到了我知道我要做什么、不再能够——但愿也不再需要——去试各种各样的东西的时候,我也无法与我曾经的尝试切割;因为,我的现在,总是由我过去的一切塑造的。

博客

10 月,我正式启用了 2022 年 9 月注册但从来没用过的 GitHub 账号,并将其改名为 silent-sure。(GitHub 用户名不允许重复,因而很难取;但这个用户名的寓意,相信是很明显的。)12 月 10 日,我用 Github Pages + Hexo + Next 搭建了这个博客。除去 MathJax 测试外,这个博客的第一篇文章是 CACC 与 CSP 的游记,第二篇文章是定积分的定义和性质(很遗憾,这一篇的 MathJax 炸了,到现在都没能恢复)。

我希望,在新的一年里,我能在这个博客中和大家分享更多有意思的东西。

思考

(我忍住了,没给小标题加上“快与慢”,哈哈。当然,我也不按那个写。)

对于一个热爱数学的人来说,思考是经常做的事。例如,11 月学到定积分的时候,我在网上搜到一本 Pete Clark 所著的 Honors Calculus,顺着作者的思路,理解了达布积分和黎曼积分的等价性的证明——而这一切源于我对“闭区间上的连续函数都是可积的”的断言的疑惑。例如,我现在有时候会回顾那些曾经学过的数学知识,例如三角形的面积等于底乘高的一半,然后发现它并不显然的(即使不定义面积,也至少要证明分别取三条边为底算出来的结果是一样的)。

不过,即使不去思考这种“没用”的东西,也有太多东西需要思考。可能是思考自己现在怎么样;可能是思考接下来要做什么;可能是思考周围的世界是怎样运转的,现在又出了什么问题。人活在世界上,是需要思考的。当然,只有思考是不够的,还得有交流,还得有行动。但如果连思考都没有,后面的一切都无从谈起。

这里,我要接着谈前面提到的教育问题。12 月曝光的县中学生的悲惨遭遇令人揪心。17、18 岁的青年,正在风华正茂的年纪,却被监禁在自称为学校的场所,一举一动都受到控制,稍不注意就会受到处罚。在一些“学校”,学生们无法在不违反规定的前提下上厕所或洗头;甚至在一些“学校”里,学生们只有在一周一次的“洗澡课”上才被允许洗澡。关键是,在这些“学校”里,上至校长,下至教师,甚至受害者学生自己,都觉得这一切是为了一个正当的目的,即提高分数;而为了实现这个目的,受害者的亲人往往成为加害者。

这个目的是否正当,以及是否有任何目的能成为虐待学生的理由,暂且不提。一个更基本的事实是,哪怕不考虑手段是否合乎道德与法律,这些手段也无法提高分数;它们只会降低分数。

没错,这是一个系统性问题。越是系统性的问题,就越需要思考。所幸,许多有识之士已经开始思考这些深层次的问题,例如知乎答主“Thoughts Memo”。但愿希望的微光,能有一星半点,到达高墙之内的黑暗中。

许多问题,当我们司空见惯时,我们就不愿意思考了。我们放弃思考之日,就是邪恶宣告胜利之时。然而,一旦我们形成了思考的习惯,这就成为了一股强大的力量。就像哈佛大学教授 Micheal Sandel 在政治哲学课程“公正:该如何做是好?”(Justice: What’s the Right Thing to Do?)的最后一节课上说的那样:

I tried to warn you that once the familiar turns strange, once we begin to reflect on our circumstance, it’s never quite the same again. I hope you have, by now, experienced at least a little of this unease, because this is the tension that animates critical reflection, and political improvement, and maybe even the moral life as well. … Why do these arguments keep going, even if they raise questions that are impossible ever finally to resolve? The reason is that we live some answer to these questions all the time. The aim of this course has been to awaken the restlessness of reason, and to see where it might lead. … And if the restlessness continues to afflict you in the days and years to come, then we together have achieved no small thing.

与诸君共勉。

明天会更好?

唱出你的热情 / 伸出你双手 / 让我拥抱着你的梦
让我拥有你真心的面孔
让我们的笑容 / 充满着青春的骄傲
让我们期待明天会更好
——《明天会更好》(罗大佑,1985)

2024 is the year that half of humanity goes to the polls—and all of humanity will be affected.
I stand before you in this whirlwind convinced of two overriding truths.
First, the state of our world is unsustainable.
We can’t go on like this.
And second, the challenges that we face are solvable.
But that requires us to make sure the mechanisms of international problem-solving actually solve problems.
——联合国秘书长安东尼奥·古特雷斯向联合国大会的报告(2024 年 9 月 24 日)

2024 年必然是世界历史上可圈可点的一年——人类的一半前往投票站(Half of humanity went to the polls;我思前想后还是决定直译)。人们满怀期待地进入这史无前例的一年,带着对更好的明天的憧憬。

这一年,我也更加关心时事了。一方面,是因为高考之后空闲时间变多了;另一方面,是因为这一年太不寻常。

当每个人投下自己的一票时,相信也是带着“明天会更好”的渴望的。于是,反现任(anti-incumbent)情绪高涨,许多国家的民众想换人做做看。不过,与此相伴的,是许多波折,以及许多持续到今天的困惑。现在我们可以说明天会更好了吗?不见得。

我们只好带着今天的一切——憧憬与担忧,兴奋与失落,期待与困惑——走向明天。明天不会太好,但我们仍然要在磕磕绊绊中创造一点一滴的美好。

说着说着,明天就要来了——

在这里祝大家蛇年快乐!

2025 年 1 月 28 日
甲辰除夕

期中考后,微积分课开始讲积分。出于好奇,我阅读了 Pete Clark 所著 Honors Calculus(这个 PDF 版本有许多笔误,似为草稿)的第八章第 1、2、4 节。为了理解部分内容,我还阅读了第六章第 4 节对实数归纳法的正确性的证明。以下为我的笔记,第 1、2、3 节分别对应原书第八章第 1、2、4 节。也可以作为该书这一部分的浓缩版。

第 1 节 微积分基本定理

我们希望 上全体可积函数(可求定积分的函数)组成的集合 满足以下性质:
(I0)
a) 上的所有连续函数属于
b) 上的函数都有界。

我们希望我们定义的定积分满足以下性质:
(I1) 常函数 ,且
(I2) 若 ,且 ,则
(I3) 若 ,则 当且仅当 。若这对等价条件成立,则

现在,我们假设 (I0)、(I1)、(I2)、(I3) 均成立。

定理 1(微积分基本定理) 上的可积函数,,则:
a) 上连续。
b) 若 处连续,则
c) 若 连续,且 的一个反导数,则
由 (I0),存在 使得 。若 ,则 ,于是由 (I1) 知 ,此时定理显然成立。
因此,下面假设
a) 任给 ,取 。由 (I3) 得

再设 ,则对 仍有 ,因此依次应用 (I2) 和 (I1) 可得

于是

现在假设 。应用 ,再对 应用 ,知

b) 由于 $f$ 在 $c$ 处连续,任给 $\epsilon>0$,存在 $\delta>0$,使得 $|x-c|<\delta\implies$ $f(c)-\epsilon<f(x)<f(c)+\epsilon$。故

于是

这表明
c) 已知 连续,由 b) 部分知 的一个反导数。因此 ,故

定理 1 表明,在我们的假设下,若定积分存在,则它是唯一的,即 的在 处取值为 的反导数。

第 2 节 构建定积分

下面,我们将逐步构建满足假设的定积分定义。但为了叙述方便,我们暂时只讨论在包含于定义域 的任意闭区间上都有最大值和最小值的函数

我们先给出划分的定义:若实数 满足

我们将可积定义为:存在唯一的 ,使得对 的每一个划分 ,都有
这一定义没有很好地形式化,它对最重要的部分—— 的唯一性——轻描淡写,同时使证明 的存在性十分困难。

例 1 显然函数 可积。

例 2 设函数 上除内部一点 处之外都等于 ,而 。证明: 上可积。
首先注意到,对 的任意划分 ,都有 。另一方面,设划分中 所在区间的长度为 ,则 可以任意小,且该区间的下和为 ,而其他区间的下和仍为 ,因此 。(对于 刚好是划分点的情形,可以类似地得到 ,其中 分别为 左侧和右侧的划分区间的长度,此时 也可以任意小。)至此,我们证明了唯一一个不小于所有 又不大于所有 的实数是 ,故 可积。

例 3 上的函数 在无理点取值为 ,在有理点取值为 。证明: 不可积。

由于每一个子区间都既包含有理点,又包含无理点,对 的任意划分 ,都有 。因此 的差距无法任意小, 不可积。
此例可能提示了解决 的存在性和唯一性问题的一种方法,至少对 19 世纪的数学家达布(Jean-Gaston Darboux)而言是这样的,他想到了一种优美的方法,可以判断下和与上和之间是否有不可弥合的鸿沟。

接下来,我们将给出达布积分的定义。

上的任意函数, 的一个划分。定义关于 下和

引理 4 上的函数, 的两个划分,则
,则由超划分引理知,故

上的函数 ,定义下积分 取遍 的所有划分时 的上确界(可以为 ),上积分 取遍 的所有划分时 的下确界(可以为 )。最后,若 ,称 上是达布可积的,且达布积分

引理 5 上的函数,则
由引理 4,若 均为 的划分,则 。因此 取遍 的所有划分时的上确界小于或等于 取遍 的所有划分时的下确界,即

命题 6 为定义在 上的函数。
a) 当且仅当 无下界。
b) 当且仅当 无上界。

a) 由 无下界知 ,故
b) 与 a) 同理。

定理 7(达布可积性判定) 上的有界函数 ,下列命题等价:
(i) 上是达布可积的。
(ii) 任给 ,存在 的一个划分 ,使得
(iii) 存在唯一的实数 ,使得对 上的任意划分 都有

(i)(ii):
任给 。由下积分的定义知存在 的一个划分 ,使得 。又由于 上是达布可积的,,故 。同理,存在 的一个划分 ,使得 。令 ,由超划分引理知
(ii)(i):
已知对任意 ,存在 的一个划分 ,使得 ,而由上、下积分的定义知 ,故 的任意性知 。但由引理 5 知 ,故 ,因此 上是达布可积的。
(i)(iii):
由于 上是达布可积的,。对 的任意划分 ,有下面证明 只能取 。若 ,则 ,即 小于 取遍 的划分时 的上确界,故存在 的一个划分 ,使得 ,这样的 不符合条件。若 ,则 ,类似地可以证明这样的 不符合条件。因此, 只能取 ,是唯一的。
(iii)(i):
反证法。假设 上不是达布可积的,则 。对 的任意划分 ,有故任意 都满足对 的任意划分 ,且这样的 有无穷多个,与 (iii) 矛盾。得证。

接下来,我们证明达布积分满足假设 (I0)、(I1)、(I2)、(I3)。证明达布积分满足 (I0) 的 a) 部分需要用到实数归纳法。

定理 8(实数归纳法),集合 。若: (RI1) 。 (RI2) 对任意 ,有:
(RI3) 对任意 ,有:

反证法。记 ,假设 有下界 ,故有下确界。显然
(I) 时:
由 (RI2) 知存在 ,使得 ,故 (其中 ),与 的定义矛盾。
(II) 时:
。又由 。由 (RI3),有 ,与 矛盾。
综上,假设不成立,

定理 9(积分主定理) 达布积分满足假设 (I0)、(I1)、(I2)、(I3)。

(I0) 时显然成立。下面假设 。 a) 设 上的任一连续函数。由达布可积性判定,只需证对任意 ,存在 的一个划分 ,使得
任给 。设 为满足存在 的一个划分 $\mathcal Px使U(f,\mathcal P_x)-L(f,\mathcal P_x)<\epsilonxb\in Sa\in S[a,x]\subset S\,(x\in[a,b))x\in S[a,x]\mathcal P_x使U(f,\mathcal P_x)-L(f,\mathcal P_x)<(x-a)\epsilonfx\delta_0>0使\displaystyle\max{t\in[x,x+\delta0]}f(t)-\min{t\in[x,x+\delta0]}f(t)<\epsilon\delta\in(0,\delta_0]\displaystyle\max{t\in[x,x+\delta]}f(t)-\min{t\in[x,x+\delta]}f(t)<\epsilon\mathcal P’={x,x+\delta}\displaystyle U(f,\mathcal P’)-L(f,\mathcal P’)=$$(x+\delta-x)\left(\max{t\in[x,x+\delta]}f(t)-\min{t\in[x,x+\delta]}f(t)\right)<\delta\epsilon\mathcal P{x+\delta}=\mathcal Px+\mathcal P’$U(f,\mathcal P{x+\delta})-L(f,\mathcal P_{x+\delta})\=(U(f,\mathcal P_x)+U(f,\mathcal P’))-(L(f,\mathcal P_x)+L(f,\mathcal P’))\=(U(f,\mathcal P_x)-L(f,\mathcal P_x))+(U(f,\mathcal P’)-L(f,\mathcal P’))\<(x-a)\epsilon+\delta\epsilon=(x+\delta-a)\epsilon\int_a^b f_1\le\int_a^b f_2L(f,\mathcal P’)\ge L(f,\mathcal P),\,U(f,\mathcal P’)\le U(f,\mathcal P)(U(f,\mathcal P_1)-L(f,\mathcal P_1))+(U(f,\mathcal P_2)-L(f,\mathcal P_2))\=(U(f,\mathcal P_1)+U(f,\mathcal P_2))-(L(f,\mathcal P_1)+L(f,\mathcal P_2))\=U(f,\mathcal P’)-L(f,\mathcal P’)\<\epsilonU(f,\mathcal P_1)-L(f,\mathcal P_1)<\frac\epsilon2U(f,\mathcal P_2)-L(f,\mathcal P_2)<\frac\epsilon2U(f,\mathcal P)-L(f,\mathcal P)\=(U(f,\mathcal P_1)+U(f,\mathcal P_2))-(L(f,\mathcal P_1)+L(f,\mathcal P_2))\=(U(f,\mathcal P_1)-L(f,\mathcal P_1))+(U(f,\mathcal P_2)-L(f,\mathcal P_2))\<\frac\epsilon2+\frac\epsilon2=\epsilonP_2=P’∩[c,b]$,则故对 的任一划分 ,都有 。而 上是达布可积的,故 上的积分值

第 3 节 黎曼和、细划分、黎曼积分

最后,我们给出黎曼(Riemann)积分的定义,并证明达布积分与黎曼积分等价。

设 $\mathcal P={x0,\,x_1,\,\dots,\,x_n}[a,b][x_i,x{i+1}]R(f,\mathcal P,\tau)=\sum{i=0}^{n-1}f(x_i^*)(x{i+1}-x_i)L(f,\mathcal P)\le R(f,\mathcal P,\tau)\le U(f,\mathcal P)$$还可以进一步得出,若 上的有界函数, 的一个划分,则 取遍 的各组标签时 下确界为 ,上确界为 。此外,若 上无上界,则 ,且 取遍 的各组标签时 的上确界也为 ;若 上无下界,则 ,且 取遍 的各组标签时 的下确界也为 。因此,上面的结论对无界函数也成立。

定理 10 上的函数 上是达布可积的的充要条件是对任意 ,存在实数 的一个划分 ,使得对 的任意超划分 的任意一组标签 ,都有

必要性:
假设 上是达布可积的,则存在 的一个划分 ,使得 。设 的任一超划分,则 $U(f,\mathcal P)\le U(f,\mathcal P_0),L(f,\mathcal P)\le\int_a^b f\le U(f,\mathcal P)L(f,\mathcal P)\le R(f,\mathcal P,\tau)\le U(f,\mathcal P)$$因此 均不小于 且不大于 ,故 。取 即可。
充分性:
假设任取 上的划分 (与 有关)的超划分 的标签 ,都有 。由 取遍 的各组标签时 下确界为 、上确界为 ,可知任取 的超划分 ,都有 。这等价于,任取 的超划分 ,都有 。显然 存在,故 上是达布可积的。
定理 10 给出了达布可积性的一种全新的判定,使我们离给出与达布积分等价却截然不同的另一种积分定义——黎曼积分——更近一步。我们还需要做两件事:一是证明定理 10 给出的判定条件中的 可以与 无关,二是将定理 10 中的不等式的成立范围由“与 有关的某个特定的划分的任意超划分”扩大到“任何足够密集的划分”。

称划分 的各划分区间的长度的最大值为 网格,记作 。显然,一个划分的超划分的网格不大于这个划分本身的网格。

引理 11(细划分引理) 上的有界函数,则对任意 ,存在 ,使得对 的任何网格小于 的划分 ,有 任给 。由上、下积分的定义,存在 的一个划分 $\mathcal P0$,使得,又设 个划分区间。取 ,并设 的一个网格小于 的划分。令 ,由超划分引理知 $L(f,\mathcal P’)\ge L(f,\mathcal P_0),\underline{\int_a^b}f-L(f,\mathcal P’)\le\underline{\int_a^b}f-L(f,\mathcal P_0)<\frac\epsilon2\U(f,\mathcal P’)-\overline{\int_a^b}f\le U(f,\mathcal P_0)-\overline{\int_a^b}f<\frac\epsilon2$$设 $\mathcal P={x_0,\,x_1,\,\dots,\,x_n},\,\mathcal P’_i=\mathcal P’∩[x_i,x{i+1}]\,(0\le i<n)\mathcal P’=\mathcal P∪\mathcal P0\mathcal P’_i[x_i,x{i+1}]\mathcal P\mathcal P’[a,b]\mathcal P’=\mathcal P’0+\mathcal P’_1+\dots+\mathcal P’{n-1}$,于是这就是要证的。

有了细划分引理,我们终于可以完成剩下的任务了。

上的函数。若存在实数 ,使得对任意 ,存在 ,使得对 的任何网格小于 的划分 的任意一组标签 ,都有 ,则称 上是黎曼可积的,并称 上的黎曼积分。显然黎曼积分是唯一的。

定理 12(达布积分与黎曼积分的等价性) 上的函数。
a) 下列命题等价:
(i) 上是黎曼可积的。
(ii) 上是达布可积的。
b) 在 a) 的等价条件成立时, 上的黎曼积分等于 上的达布积分 $\inta^b f$。

a)
(i)(ii):
反证法。假设 上不是达布可积的。
(I) 上无界时:
的任一划分。由 上无界,知 取遍 的各组标签时 无界,从而对任意 都不满足对 的任意一组标签 都有 。这里的 的任意性表明 上无法满足黎曼可积的条件,与 (i) 矛盾。
(II) 上有界时:
设 $n\in\mathbb N
+\mathcal Pn[a,b]nU(f,\mathcal P_n)R(f,\mathcal P_n,\tau)\tau\mathcal P_nP_nT_n使U(f,\mathcal P_n)\ge R(f,\mathcal P_n,T_n)>U(f,\mathcal P_n)-\frac1{n}P_nt_n使L(f,\mathcal P_n)\le R(f,\mathcal P_n,t_n)<L(f,\mathcal P_n)+\frac1{n}$\lim{n\rightarrow∞}L(f,\mathcal Pn)=\underline{\int_a^b}f,\,\lim{n\rightarrow∞}U(f,\mathcal Pn)=\overline{\int_a^b}f\lim{n\rightarrow∞}R(f,\mathcal Pn,t_n)=\underline{\int_a^b}f,\,\lim{n\rightarrow∞}R(f,\mathcal Pn,T_n)=\overline{\int_a^b}f$$由 上不是达布可积的,知 ,故 $\displaystyle\lim{n\rightarrow∞}R(f,\mathcal Pn,t_n)\ne\lim{n\rightarrow∞}R(f,\mathcal P_n,T_n)\tau_nnt_nnT_n{R(f,\mathcal P_n,\tau_n)}f[a,b]{R(f,\mathcal P_n,\tau_n)}\implies\epsilon>0f[a,b]\underline{\int_a^b}f=\overline{\int_a^b}f=\int_a^bf\delta>0使[a,b]\delta\mathcal P$,有而对这两个不等式中 的任意一组标签 ,有 ,于是 。因此 上是黎曼可积的。
b) 由 a) 的 (ii)(i) 证明的末尾可以看出, 上的黎曼积分等于

推论 13 黎曼积分满足性质 (I0)、(I1)、(I2)、(I3)。

推论 14 黎曼积分满足微积分基本定理。

我们终于大功告成。