<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>离散数学 on 方糖猫Blog</title>
    <link>https://ftmao.com/blog/tags/%E7%A6%BB%E6%95%A3%E6%95%B0%E5%AD%A6/</link>
    <description>AI 视频、AI Agent 与工程实践笔记</description>
    <generator>Hugo</generator>
    <language>zh-CN</language>
    <lastBuildDate>Fri, 17 Jul 2020 09:00:00 +0800</lastBuildDate><atom:link href="https://ftmao.com/blog/tags/%E7%A6%BB%E6%95%A3%E6%95%B0%E5%AD%A6/index.xml" rel="self" type="application/rss+xml" /><item>
      <title>大学数学学习总结之离散数学：新人能看懂的核心脉络与避坑指南</title>
      <link>https://ftmao.com/blog/posts/discrete-math-study-notes/</link>
      <pubDate>Fri, 17 Jul 2020 09:00:00 +0800</pubDate>
      <guid>https://ftmao.com/blog/posts/discrete-math-study-notes/</guid>
      <description>&lt;h1 id=&#34;大学数学学习总结之离散数学新人能看懂的核心脉络与避坑指南&#34;&gt;大学数学学习总结之离散数学：新人能看懂的核心脉络与避坑指南&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;目标读者&lt;/strong&gt;：刚接触离散数学、看到 $\forall \exists$ 和哈斯图就发懵的大一同学；也适合想补计算机理论基础的自学者。不需要任何先修知识，高中数学就够了。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;阅读目标&lt;/strong&gt;：不追求证明的严格性，而是帮你建立整条知识主线——每个概念&amp;quot;是什么、为什么需要它、什么时候用它&amp;quot;。读完你应该能看懂教材目录背后的逻辑，知道每种题型对应哪件&amp;quot;工具&amp;quot;，并且明白这门课为什么被称为&amp;quot;计算机科学的数学&amp;quot;。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;0-先看全局离散数学到底在研究什么&#34;&gt;0. 先看全局：离散数学到底在研究什么&lt;/h2&gt;
&lt;p&gt;高等数学（微积分）研究的是&lt;strong&gt;连续&lt;/strong&gt;的世界：光滑的曲线、连续变化的速度与面积。而离散数学研究的是&lt;strong&gt;离散&lt;/strong&gt;的世界：一个个可数的、不连续的对象——真或假的命题、有限集合里的元素、图里的点和边、算法的步数。&lt;/p&gt;
&lt;p&gt;为什么计算机专业把它列为核心基础课？因为计算机本身就是一台离散机器：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;内存里只有 0 和 1，没有&amp;quot;连续&amp;quot;；&lt;/li&gt;
&lt;li&gt;程序一步一步执行，步数可以数；&lt;/li&gt;
&lt;li&gt;数据结构是集合、序列、树、图——全是离散对象。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所以这门课的全部内容，可以概括为一句话：&lt;strong&gt;学会用数学语言精确地描述和推理离散的、可数的结构&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;下面的知识地图展示了本门课的主线结构，也是本文的目录：&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart TD
    A[&amp;#34;离散数学&amp;#34;] --&amp;gt; B[&amp;#34;逻辑&amp;lt;br&amp;gt;推理的语言&amp;#34;]
    A --&amp;gt; C[&amp;#34;集合与关系&amp;lt;br&amp;gt;组织的语言&amp;#34;]
    A --&amp;gt; D[&amp;#34;函数&amp;lt;br&amp;gt;对应关系&amp;#34;]
    A --&amp;gt; E[&amp;#34;计数&amp;lt;br&amp;gt;数数的技术&amp;#34;]
    A --&amp;gt; F[&amp;#34;数论初步&amp;lt;br&amp;gt;整数的性质&amp;#34;]
    A --&amp;gt; G[&amp;#34;图论&amp;lt;br&amp;gt;结构与连接&amp;#34;]
    A --&amp;gt; H[&amp;#34;递推关系&amp;lt;br&amp;gt;算法分析入门&amp;#34;]
    B --&amp;gt; B1[&amp;#34;命题逻辑&amp;#34;]
    B --&amp;gt; B2[&amp;#34;谓词逻辑&amp;#34;]
    C --&amp;gt; C1[&amp;#34;集合运算&amp;#34;]
    C --&amp;gt; C2[&amp;#34;等价关系与划分&amp;#34;]
    C --&amp;gt; C3[&amp;#34;偏序关系与哈斯图&amp;#34;]
    E --&amp;gt; E1[&amp;#34;加法与乘法原理&amp;#34;]
    E --&amp;gt; E2[&amp;#34;排列组合&amp;#34;]
    E --&amp;gt; E3[&amp;#34;鸽笼原理&amp;#34;]
    E --&amp;gt; E4[&amp;#34;容斥原理&amp;#34;]
    F --&amp;gt; F1[&amp;#34;整除与同余&amp;#34;]
    F --&amp;gt; F2[&amp;#34;欧几里得算法&amp;#34;]
    F --&amp;gt; F3[&amp;#34;模运算与 RSA&amp;#34;]
    G --&amp;gt; G1[&amp;#34;基本概念与握手定理&amp;#34;]
    G --&amp;gt; G2[&amp;#34;欧拉图与哈密顿图&amp;#34;]
    G --&amp;gt; G3[&amp;#34;树与生成树&amp;#34;]
    H --&amp;gt; H1[&amp;#34;斐波那契数列&amp;#34;]
    H --&amp;gt; H2[&amp;#34;汉诺塔&amp;#34;]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;注意各章之间的依赖关系：&lt;strong&gt;逻辑是全书的语言&lt;/strong&gt;（后面每章的定义和证明都用它写），&lt;strong&gt;集合与关系是骨架&lt;/strong&gt;（函数、图都用它来定义），而计数、数论、图论是三大应用板块，递推关系则是通向《算法分析》的桥梁。建议按本文顺序学习，不要跳章。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;1-命题逻辑与谓词逻辑推理的语言&#34;&gt;1. 命题逻辑与谓词逻辑：推理的语言&lt;/h2&gt;
&lt;h3 id=&#34;11-命题与联结词&#34;&gt;1.1 命题与联结词&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;命题&lt;/strong&gt;（proposition）是能判断真假的陈述句。&amp;ldquo;2 是偶数&amp;quot;是命题（真），&amp;ldquo;π 是无理数&amp;quot;是命题（真），&amp;ldquo;今天会下雨吗&amp;quot;不是命题（疑问句），&amp;ldquo;x 大于 3&amp;quot;也不是命题（真假取决于 x）。&lt;/p&gt;
&lt;p&gt;用小写字母 $p, q, r$ 表示命题，它们只有两种取值：真（T / 1）或假（F / 0）。把简单命题用&lt;strong&gt;联结词&lt;/strong&gt;粘起来，就得到复合命题。五个基本联结词的真值表是这一章的&amp;quot;乘法口诀表&amp;rdquo;，必须背熟：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;$p$&lt;/th&gt;
					&lt;th&gt;$q$&lt;/th&gt;
					&lt;th&gt;$\neg p$（非）&lt;/th&gt;
					&lt;th&gt;$p \land q$（与）&lt;/th&gt;
					&lt;th&gt;$p \lor q$（或）&lt;/th&gt;
					&lt;th&gt;$p \to q$（蕴含）&lt;/th&gt;
					&lt;th&gt;$p \leftrightarrow q$（等价）&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;T&lt;/td&gt;
					&lt;td&gt;T&lt;/td&gt;
					&lt;td&gt;F&lt;/td&gt;
					&lt;td&gt;T&lt;/td&gt;
					&lt;td&gt;T&lt;/td&gt;
					&lt;td&gt;T&lt;/td&gt;
					&lt;td&gt;T&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;T&lt;/td&gt;
					&lt;td&gt;F&lt;/td&gt;
					&lt;td&gt;F&lt;/td&gt;
					&lt;td&gt;F&lt;/td&gt;
					&lt;td&gt;T&lt;/td&gt;
					&lt;td&gt;F&lt;/td&gt;
					&lt;td&gt;F&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;F&lt;/td&gt;
					&lt;td&gt;T&lt;/td&gt;
					&lt;td&gt;T&lt;/td&gt;
					&lt;td&gt;F&lt;/td&gt;
					&lt;td&gt;T&lt;/td&gt;
					&lt;td&gt;T&lt;/td&gt;
					&lt;td&gt;F&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;F&lt;/td&gt;
					&lt;td&gt;F&lt;/td&gt;
					&lt;td&gt;T&lt;/td&gt;
					&lt;td&gt;F&lt;/td&gt;
					&lt;td&gt;F&lt;/td&gt;
					&lt;td&gt;T&lt;/td&gt;
					&lt;td&gt;T&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;这张表的用途：当你想验证一个复合命题&amp;quot;什么时候为真、什么时候为假&amp;rdquo;，就把所有变量的取值组合列出来逐行算——这叫&lt;strong&gt;真值表法&lt;/strong&gt;，是验证命题公式最笨也最可靠的方法。&lt;/p&gt;
&lt;p&gt;其中最容易踩坑的是&lt;strong&gt;蕴含&lt;/strong&gt; $p \to q$。它读作&amp;quot;如果 p 那么 q&amp;rdquo;，只有当 $p$ 真而 $q$ 假时才算假，其余三种情况都为真。特别是 $p$ 为假时，无论 $q$ 是真是假，整个蕴含都算真——这叫&amp;rdquo;&lt;strong&gt;虚真&lt;/strong&gt;&amp;quot;（vacuously true）。比如&amp;quot;如果太阳从西边出来，我就把作业抄十遍&amp;quot;，前提永远为假，所以这句话在逻辑上永远成立（你别想靠它赖账）。&lt;/p&gt;
&lt;p&gt;等值演算里第一条要记的公式就是这个：&lt;/p&gt;
&lt;p&gt;$$p \to q ;\equiv; \neg p \lor q$$&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;白话解释&lt;/strong&gt;：蕴含式可以无条件翻译成&amp;quot;非 p 或 q&amp;quot;。凡是不会处理蕴含的地方，先套这条公式把箭头消掉，再往下算。&lt;/p&gt;
&lt;h3 id=&#34;12-等值演算&#34;&gt;1.2 等值演算&lt;/h3&gt;
&lt;p&gt;两个公式在所有取值下真假完全一致，就叫&lt;strong&gt;等值&lt;/strong&gt;（记作 $\equiv$）。等值演算就是&amp;quot;逻辑版的代数变形&amp;quot;，常用定律如下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;德摩根律：&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;$$\neg (p \land q) ;\equiv; \neg p \lor \neg q, \qquad \neg (p \lor q) ;\equiv; \neg p \land \neg q$$&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;白话解释&lt;/strong&gt;：否定穿过括号时，&amp;ldquo;与&amp;quot;变&amp;quot;或&amp;rdquo;、&amp;ldquo;或&amp;quot;变&amp;quot;与&amp;rdquo;。&amp;ldquo;并非（既高又帅）&amp;ldquo;等于&amp;quot;不高或者不帅&amp;rdquo;，而不是&amp;quot;不高且不帅&amp;rdquo;。写代码时 &lt;code&gt;!(a &amp;amp;&amp;amp; b)&lt;/code&gt; 和 &lt;code&gt;!a || !b&lt;/code&gt; 等价，用的就是它。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;分配律：$p \land (q \lor r) \equiv (p \land q) \lor (p \land r)$，以及 $\lor$ 对 $\land$ 的分配律。&lt;/li&gt;
&lt;li&gt;吸收律：$p \lor (p \land q) \equiv p$，$p \land (p \lor q) \equiv p$。&lt;/li&gt;
&lt;li&gt;双重否定：$\neg \neg p \equiv p$。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;什么时候用&lt;/strong&gt;：化简程序里的复杂 if 条件、证明两个逻辑表达式等价、以及数字电路设计里化简逻辑门——都用这套演算。&lt;/p&gt;
&lt;h3 id=&#34;13-谓词逻辑与量词&#34;&gt;1.3 谓词逻辑与量词&lt;/h3&gt;
&lt;p&gt;命题逻辑的颗粒度太粗：&amp;ldquo;所有人都会死，苏格拉底是人，所以苏格拉底会死&amp;quot;这种推理，命题逻辑表达不了，因为它拆不开&amp;quot;所有人都会死&amp;quot;这句话。谓词逻辑把命题拆成&lt;strong&gt;个体 + 谓词&lt;/strong&gt;：$P(x)$ 表示&amp;quot;x 具有性质 P&amp;rdquo;，再用&lt;strong&gt;量词&lt;/strong&gt;限定范围：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;全称量词 $\forall$：$\forall x \, P(x)$ 表示&amp;quot;对论域中所有 x，P(x) 成立&amp;quot;；&lt;/li&gt;
&lt;li&gt;存在量词 $\exists$：$\exists x \, P(x)$ 表示&amp;quot;论域中至少存在一个 x 使 P(x) 成立&amp;quot;。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;量词最重要的规则是&lt;strong&gt;带否定时如何翻转&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;$$\neg \forall x \, P(x) ;\equiv; \exists x \, \neg P(x), \qquad \neg \exists x \, P(x) ;\equiv; \forall x \, \neg P(x)$$&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;白话解释&lt;/strong&gt;：否定&amp;quot;所有人都及格&amp;quot;，等于说&amp;quot;存在至少一个人不及格&amp;quot;；否定&amp;quot;存在满分的人&amp;quot;，等于说&amp;quot;所有人都没满分&amp;quot;。否定穿过量词时，$\forall$ 变 $\exists$、$\exists$ 变 $\forall$，谓词本身加否定。这是写&amp;quot;反例&amp;quot;和&amp;quot;证否命题&amp;quot;的基本功。&lt;/p&gt;
&lt;p&gt;下面这张图总结了本章的概念关系：&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart LR
    P[&amp;#34;命题&amp;lt;br&amp;gt;可真可假的陈述&amp;#34;] --&amp;gt; CL[&amp;#34;五个联结词&amp;lt;br&amp;gt;非 与 或 蕴含 等价&amp;#34;]
    CL --&amp;gt; TT[&amp;#34;真值表&amp;lt;br&amp;gt;枚举所有取值&amp;#34;]
    CL --&amp;gt; EQ[&amp;#34;等值演算&amp;lt;br&amp;gt;逻辑代数变形&amp;#34;]
    P --&amp;gt; PL[&amp;#34;谓词逻辑&amp;lt;br&amp;gt;拆开命题内部结构&amp;#34;]
    PL --&amp;gt; Q[&amp;#34;量词&amp;lt;br&amp;gt;全称 与 存在&amp;#34;]
    Q --&amp;gt; NQ[&amp;#34;量词否定规则&amp;lt;br&amp;gt;否定穿过量词要翻转&amp;#34;]
    TT --&amp;gt; APP[&amp;#34;应用&amp;lt;br&amp;gt;电路验证 条件化简&amp;#34;]
    EQ --&amp;gt; APP
    NQ --&amp;gt; APP&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;h3 id=&#34;应用场景逻辑电路与程序条件&#34;&gt;应用场景：逻辑电路与程序条件&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;数字电路&lt;/strong&gt;：一个与门就是 $\land$，或门就是 $\lor$，非门就是 $\neg$。整个 CPU 的运算器，本质上是海量的命题公式在同时求值。用等值演算化简逻辑表达式，就能减少芯片上的门数量，省钱省电。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;程序设计&lt;/strong&gt;：复杂的 &lt;code&gt;if&lt;/code&gt; 条件就是复合命题，德摩根律是重构布尔表达式的日常工具；&amp;ldquo;循环不变式&amp;quot;的断言和验证，用的是谓词逻辑。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据库&lt;/strong&gt;：SQL 的 &lt;code&gt;WHERE&lt;/code&gt; 子句就是谓词，&lt;code&gt;AND&lt;/code&gt;/&lt;code&gt;OR&lt;/code&gt;/&lt;code&gt;NOT&lt;/code&gt; 直接对应三个联结词；&lt;code&gt;EXISTS&lt;/code&gt; 子查询就是存在量词。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;2-集合与关系组织的语言&#34;&gt;2. 集合与关系：组织的语言&lt;/h2&gt;
&lt;h3 id=&#34;21-集合运算&#34;&gt;2.1 集合运算&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;集合&lt;/strong&gt;（set）是若干对象的汇集，无序、不重复。属于记作 $x \in A$，不属于记作 $x \notin A$。集合的四大运算：&lt;/p&gt;
&lt;p&gt;$$A \cup B = \{x \mid x \in A \lor x \in B\}, \qquad A \cap B = \{x \mid x \in A \land x \in B\}$$&lt;/p&gt;
&lt;p&gt;$$\bar{A} = \{x \in U \mid x \notin A\}, \qquad A - B = \{x \mid x \in A \land x \notin B\}$$&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;白话解释&lt;/strong&gt;：并集是&amp;quot;两边只要沾边就进来&amp;rdquo;，交集是&amp;quot;两边都在才进来&amp;quot;，补集是&amp;quot;全集里不要你的那部分&amp;quot;，差集是&amp;quot;在 A 里但不在 B 里&amp;quot;。画文氏图（Venn 图）是理解这些运算最快的办法。&lt;/p&gt;
&lt;p&gt;集合运算也满足德摩根律，和逻辑里的形式完全平行：&lt;/p&gt;
&lt;p&gt;$$\overline{A \cup B} = \bar{A} \cap \bar{B}, \qquad \overline{A \cap B} = \bar{A} \cup \bar{B}$$&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;白话解释&lt;/strong&gt;：这和 1.2 节的逻辑德摩根律是同一条定律的两种写法——因为集合运算本来就是用 $\lor$、$\land$、$\neg$ 定义的。体会到这一点，你就理解了离散数学&amp;quot;各章相通&amp;quot;的感觉。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;幂集&lt;/strong&gt;（power set）：集合 A 的所有子集构成的集合，记作 $\mathcal{P}(A)$。若 A 有 n 个元素，则&lt;/p&gt;
&lt;p&gt;$$|\mathcal{P}(A)| = 2^n$$&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;白话解释&lt;/strong&gt;：每个元素都有&amp;quot;选 / 不选&amp;quot;两种自由，n 个元素就是 $2^n$ 种组合。这个公式在&amp;quot;枚举所有子集&amp;quot;的算法题里天天见。&lt;/p&gt;
&lt;h3 id=&#34;22-笛卡尔积与二元关系&#34;&gt;2.2 笛卡尔积与二元关系&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;有序对&lt;/strong&gt; $(a, b)$ 讲究顺序，$(a, b) \neq (b, a)$。&lt;strong&gt;笛卡尔积&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;$$A \times B = \{(a, b) \mid a \in A, \, b \in B\}$$&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;白话解释&lt;/strong&gt;：把 A 的每个元素和 B 的每个元素配对，得到所有&amp;quot;搭配方案&amp;quot;的集合。坐标平面就是 $\mathbb{R} \times \mathbb{R}$；数据库表的多列取值组合也是笛卡尔积。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;二元关系&lt;/strong&gt; R 就是 $A \times B$ 的一个子集：$(a, b) \in R$ 表示&amp;quot;a 和 b 有关系 R&amp;quot;。比如&amp;quot;小于关系&amp;quot;是 $\mathbb{R} \times \mathbb{R}$ 中满足 $a &amp;lt; b$ 的所有有序对。有限集合上的关系可以用&lt;strong&gt;关系矩阵&lt;/strong&gt;（0-1 矩阵）或&lt;strong&gt;关系图&lt;/strong&gt;（有向图）表示——这是图论登场的伏笔。&lt;/p&gt;
&lt;h3 id=&#34;23-等价关系与划分&#34;&gt;2.3 等价关系与划分&lt;/h3&gt;
&lt;p&gt;定义在集合 A 上的关系 R 若满足三条性质：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;自反&lt;/strong&gt;：对任意 $x \in A$，都有 $x R x$；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;对称&lt;/strong&gt;：若 $x R y$ 则 $y R x$；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;传递&lt;/strong&gt;：若 $x R y$ 且 $y R z$ 则 $x R z$；&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;就叫&lt;strong&gt;等价关系&lt;/strong&gt;。典型例子：&amp;ldquo;同余&amp;rdquo;（mod m 意义下）、&amp;ldquo;同班&amp;rdquo;、&amp;ldquo;图里两点互相可达&amp;rdquo;。&lt;/p&gt;
&lt;p&gt;等价关系把集合切成若干互不相交的&lt;strong&gt;等价类&lt;/strong&gt;，所有等价类合起来叫 A 的一个&lt;strong&gt;划分&lt;/strong&gt;（partition）。核心定理：&lt;/p&gt;
&lt;p&gt;$$\text{“等价关系”} ;\longleftrightarrow; \text{“集合的划分”}$$&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;白话解释&lt;/strong&gt;：给了一个等价关系，就能按&amp;quot;谁和谁等价&amp;quot;把集合切成一堆小格子；反过来给了一种切法，&amp;ldquo;同格&amp;quot;就是一个等价关系。两者是一回事的两个视角。&lt;/p&gt;
&lt;h3 id=&#34;24-偏序关系与哈斯图&#34;&gt;2.4 偏序关系与哈斯图&lt;/h3&gt;
&lt;p&gt;把上面三性中的&amp;quot;对称&amp;quot;换成&amp;rdquo;&lt;strong&gt;反对称&lt;/strong&gt;&amp;quot;（若 $x R y$ 且 $y R x$ 则 $x = y$），得到的就是&lt;strong&gt;偏序关系&lt;/strong&gt;（partial order），记作 $\preceq$。典型例子：整除关系、集合包含关系 $\subseteq$、实数的 $\le$。&lt;/p&gt;
&lt;p&gt;&amp;ldquo;偏&amp;quot;的意思是：不要求任意两个元素都能比大小。比如在整除关系下，3 和 5 互不整除，不可比。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;哈斯图&lt;/strong&gt;（Hasse diagram）是偏序关系的简化画法：小的画下面、大的画上面，只画&amp;quot;紧挨着的覆盖关系&amp;rdquo;，自反环和传递边全省略。比如集合 $\{a, b\}$ 的幂集在包含关系下的哈斯图就是一个菱形。&lt;/p&gt;
&lt;p&gt;下面用 mermaid 画这个哈斯图（菱形结构）：&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart BT
    E[&amp;#34;空集&amp;#34;] --&amp;gt; A[&amp;#34;单元素集 a&amp;#34;]
    E --&amp;gt; B[&amp;#34;单元素集 b&amp;#34;]
    A --&amp;gt; U[&amp;#34;全集 ab&amp;#34;]
    B --&amp;gt; U&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;&lt;strong&gt;白话解释&lt;/strong&gt;：从下往上读就是&amp;quot;被包含 → 包含&amp;quot;。空集最小、全集最大，两个单元素集在中间且互相不可比——所以中间一层是&amp;quot;横着排&amp;quot;而不是上下排。&lt;/p&gt;
&lt;h3 id=&#34;应用场景数据库与分类系统&#34;&gt;应用场景：数据库与分类系统&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;关系数据库&lt;/strong&gt;：一张表就是元组的集合，表本身就是&amp;quot;关系&amp;quot;（relation 一词由此而来）；&lt;code&gt;SELECT ... WHERE&lt;/code&gt; 是取子集，&lt;code&gt;JOIN&lt;/code&gt; 基于笛卡尔积再筛选。关系代数的整套理论就是本章内容的直接应用。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;等价类划分&lt;/strong&gt;：软件测试里的&amp;quot;等价类划分法&amp;quot;，就是把无穷的输入空间按等价关系切成有限个类，每类挑一个代表测试。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;偏序与拓扑排序&lt;/strong&gt;：任务调度（先修课关系、编译依赖、Maven 依赖）都是偏序关系，拓扑排序就是给偏序找一个兼容的全序。&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;📜 历史故事：罗素悖论与第三次数学危机&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;19 世纪末，数学家们满怀信心地想用集合论给全部数学打地基。但 1901 年罗素发现了一个致命漏洞：考虑&amp;quot;所有不包含自身的集合所组成的集合&amp;quot;R，问 R 是否包含自身？若 R 包含自身，按定义它不该被收进来；若 R 不包含自身，按定义它又该被收进来——两头都矛盾。1902 年罗素把这个悖论写信告诉弗雷格，后者刚完成的著作地基瞬间崩塌，他只得在书末补记中写道：一位科学家完工之日，恰是地基坍塌之时，没有比这更不幸的了。这场危机史称&amp;quot;第三次数学危机&amp;quot;，后来人们用公理化集合论（ZFC）限制&amp;quot;什么样的总体算集合&amp;quot;，才把地基重新夯实。它提醒我们：&lt;strong&gt;&amp;ldquo;随便把一些东西凑成一个集合&amp;quot;这句话并不是永远合法的&lt;/strong&gt;，这正是教材上定义集合时小心翼翼的深层原因。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;3-函数对应关系&#34;&gt;3. 函数：对应关系&lt;/h2&gt;
&lt;h3 id=&#34;31-函数的定义&#34;&gt;3.1 函数的定义&lt;/h3&gt;
&lt;p&gt;函数 $f: A \to B$ 是一种特殊的二元关系：&lt;strong&gt;A 中每个元素都恰好对应 B 中一个元素&lt;/strong&gt;。两个要点缺一不可：每个输入都要有输出（处处有定义），且一个输入不能有两个输出（单值性）。&lt;/p&gt;
&lt;p&gt;A 叫定义域，B 叫陪域，实际取到的值构成&lt;strong&gt;值域&lt;/strong&gt;（image），值域是 B 的子集。&lt;/p&gt;
&lt;h3 id=&#34;32-单射满射双射&#34;&gt;3.2 单射、满射、双射&lt;/h3&gt;
&lt;p&gt;这一节是考试和面试的高频考点，三种性质用一句话区分：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;单射&lt;/strong&gt;（injective，一对一）：不同输入必得不同输出，即 $f(x_1) = f(x_2) \Rightarrow x_1 = x_2$。B 中没有&amp;quot;被抢座&amp;quot;的冲突。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;满射&lt;/strong&gt;（surjective，映上）：B 中每个元素都被击中，即 $\forall y \in B, \, \exists x \in A, \, f(x) = y$。值域填满整个陪域。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;双射&lt;/strong&gt;（bijective，一一对应）：既是单射又是满射，A 和 B 的元素严丝合缝一一配对。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;白话解释&lt;/strong&gt;：把 A 想成学生、B 想成座位。单射 = 没有两人抢一座；满射 = 没有空座；双射 = 人人有座、座座有人。&lt;/p&gt;
&lt;p&gt;有限集合上有个常用推论：若 $f: A \to B$ 是双射，则 $|A| = |B|$。这是计数里&amp;rdquo;&lt;strong&gt;一一对应法&lt;/strong&gt;&amp;ldquo;的原理——要数一个难数的集合，就找一个好数的集合和它建立双射。&lt;/p&gt;
&lt;h3 id=&#34;33-复合函数与逆函数&#34;&gt;3.3 复合函数与逆函数&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;复合&lt;/strong&gt;：先 f 后 g，记作 $g \circ f$，定义为&lt;/p&gt;
&lt;p&gt;$$(g \circ f)(x) = g(f(x))$$&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;白话解释&lt;/strong&gt;：注意书写顺序和执行顺序相反，$g \circ f$ 是先做 f 再做 g。函数复合一般&lt;strong&gt;不满足交换律&lt;/strong&gt;——&amp;ldquo;先穿袜子再穿鞋&amp;quot;和&amp;quot;先穿鞋再穿袜子&amp;quot;显然不是一回事。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;逆函数&lt;/strong&gt;：只有双射才有逆函数 $f^{-1}: B \to A$，满足&lt;/p&gt;
&lt;p&gt;$$f^{-1}(f(x)) = x, \qquad f(f^{-1}(y)) = y$$&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;白话解释&lt;/strong&gt;：逆函数就是&amp;quot;完美撤销&amp;rdquo;。只有双射能撤销，因为单射保证撤销时不会&amp;quot;一个输出对应回多个输入&amp;rdquo;，满射保证每个输出都撤得回去。这就是为什么密码学里加密函数必须设计成双射——否则密文解不回明文。&lt;/p&gt;
&lt;h3 id=&#34;应用场景哈希函数与数据结构&#34;&gt;应用场景：哈希函数与数据结构&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;哈希表&lt;/strong&gt;：哈希函数把无限的 key 空间映射到有限的桶地址空间，它天然&lt;strong&gt;不是单射&lt;/strong&gt;——不同 key 撞同一桶叫&amp;quot;哈希冲突&amp;quot;，拉链法、开放寻址法都是在给&amp;quot;非单射&amp;quot;擦屁股。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;加密&lt;/strong&gt;：对称加密的加密函数必须是双射（否则无法解密）；公钥加密则利用&amp;quot;正向容易、逆向极难&amp;quot;的单向函数。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;类型系统与序列化&lt;/strong&gt;：序列化（serialize）和反序列化（deserialize）理想情况下互为逆函数。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;4-计数数数的技术&#34;&gt;4. 计数：数数的技术&lt;/h2&gt;
&lt;p&gt;计数这一章回答的问题是：&amp;quot;&lt;strong&gt;满足某条件的方案一共有多少种？&lt;/strong&gt;&amp;quot;——不枚举，用公式算。&lt;/p&gt;
&lt;h3 id=&#34;41-加法原理与乘法原理&#34;&gt;4.1 加法原理与乘法原理&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;加法原理&lt;/strong&gt;：做一件事有 m 类互斥办法，第 i 类有 $n_i$ 种做法，则总做法数为&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;$$N = n_1 + n_2 + \cdots + n_m$$&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;乘法原理&lt;/strong&gt;：做一件事分 m 步，第 i 步有 $n_i$ 种做法，则总做法数为&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;$$N = n_1 \cdot n_2 \cdot \cdots \cdot n_m$$&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;白话解释&lt;/strong&gt;：&lt;strong&gt;分类用加法，分步用乘法&lt;/strong&gt;。&amp;ldquo;从北京去上海，高铁 3 班或飞机 5 班&amp;quot;是分类（选一类就行），$3 + 5 = 8$ 种；&amp;ldquo;先选上衣 4 件再选裤子 3 条&amp;quot;是分步（两步都要做），$4 \times 3 = 12$ 种。做题时先问自己：这些方案是&amp;quot;或&amp;quot;的关系还是&amp;quot;先…再…&amp;ldquo;的关系？&lt;/p&gt;
&lt;h3 id=&#34;42-排列与组合&#34;&gt;4.2 排列与组合&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;排列&lt;/strong&gt;（讲顺序）：从 n 个不同元素取 k 个排成一列，&lt;/p&gt;
&lt;p&gt;$$P(n, k) = \frac{n!}{(n-k)!}$$&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;组合&lt;/strong&gt;（不讲顺序）：从 n 个不同元素取 k 个成一组，&lt;/p&gt;
&lt;p&gt;$$\binom{n}{k} = \frac{n!}{k!(n-k)!}$$&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;白话解释&lt;/strong&gt;：两者的唯一区别是&amp;quot;顺序算不算数&amp;rdquo;。选 3 个人当班长、学委、体委，职位不同所以讲顺序，是排列；选 3 个人去参加同一个会议，不讲顺序，是组合。组合数 $\binom{n}{k}$ 读作&amp;quot;n 选 k&amp;rdquo;，就是二项式系数。&lt;/p&gt;
&lt;p&gt;组合数的常用性质：$\binom{n}{k} = \binom{n}{n-k}$（选 k 个留下，等于选 n-k 个扔掉），以及帕斯卡恒等式 $\binom{n}{k} = \binom{n-1}{k} + \binom{n-1}{k-1}$（杨辉三角的递推式）。&lt;/p&gt;
&lt;p&gt;下面这张流程图帮你判断一道计数题该用哪个工具：&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart TD
    Q[&amp;#34;要数的问题&amp;#34;] --&amp;gt; S1{&amp;#34;是分类还是分步?&amp;#34;}
    S1 -- &amp;#34;分类 互斥&amp;#34; --&amp;gt; ADD[&amp;#34;用加法原理&amp;#34;]
    S1 -- &amp;#34;分步 连贯&amp;#34; --&amp;gt; MUL[&amp;#34;用乘法原理&amp;#34;]
    MUL --&amp;gt; S2{&amp;#34;顺序算不算数?&amp;#34;}
    S2 -- &amp;#34;算&amp;#34; --&amp;gt; PERM[&amp;#34;排列 P n k&amp;#34;]
    S2 -- &amp;#34;不算&amp;#34; --&amp;gt; COMB[&amp;#34;组合 C n k&amp;#34;]
    Q --&amp;gt; S3{&amp;#34;是否出现 至少 至多?&amp;#34;}
    S3 -- &amp;#34;是&amp;#34; --&amp;gt; COMP[&amp;#34;考虑反面 或 容斥原理&amp;#34;]
    Q --&amp;gt; S4{&amp;#34;是否要求 必有...发生?&amp;#34;}
    S4 -- &amp;#34;是&amp;#34; --&amp;gt; PIG[&amp;#34;想想鸽笼原理&amp;#34;]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;h3 id=&#34;43-鸽笼原理&#34;&gt;4.3 鸽笼原理&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;鸽笼原理&lt;/strong&gt;（抽屉原理）：把 n 只鸽子放进 k 个鸽笼，若 $n &amp;gt; k$，则至少有一个笼子里有不少于两只鸽子。加强版：&lt;/p&gt;
&lt;p&gt;$$\text{至少有一个笼子里有不少于 } \left\lceil \frac{n}{k} \right\rceil \text{ 只鸽子}$$&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;白话解释&lt;/strong&gt;：$\lceil x \rceil$ 是向上取整。367 个人里至少有两人同一天生日（n=367，k=366）；13 个人里至少 $\lceil 13/12 \rceil = 2$ 人同月出生。鸽笼原理的用法不是&amp;quot;计算&amp;rdquo;，而是&amp;quot;&lt;strong&gt;证明存在性&lt;/strong&gt;&amp;quot;——它告诉你某种现象必然发生，虽然指不出具体是谁。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;📜 历史故事：狄利克雷与抽屉原理&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;鸽笼原理由德国数学家狄利克雷（Dirichlet）在 1834 年明确提出，德语叫 Schubfachprinzip（抽屉原理）。他并不是把它当成智力趣题，而是用它严肃地证明了数论中&amp;quot;用有理数逼近无理数&amp;quot;的深刻结果（狄利克雷逼近定理）。一个看起来&amp;quot;显然得不能再显然&amp;quot;的原理能推出不显然的定理，这件事本身就很数学：&lt;strong&gt;伟大的工具往往长得朴素&lt;/strong&gt;。后人为了纪念他，也把这个原理称为狄利克雷原理。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;44-容斥原理&#34;&gt;4.4 容斥原理&lt;/h3&gt;
&lt;p&gt;两个集合的容斥：&lt;/p&gt;
&lt;p&gt;$$|A \cup B| = |A| + |B| - |A \cap B|$$&lt;/p&gt;
&lt;p&gt;三个集合的容斥：&lt;/p&gt;
&lt;p&gt;$$|A \cup B \cup C| = |A| + |B| + |C| - |A \cap B| - |A \cap C| - |B \cap C| + |A \cap B \cap C|$$&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;白话解释&lt;/strong&gt;：直接加会重复计算重叠部分，所以要减掉交集；但三个集合时，减掉两两交集又把三者公共部分减过头了，要再加回来。&lt;strong&gt;奇加偶减&lt;/strong&gt;，交替进行。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;什么时候用&lt;/strong&gt;：凡是&amp;quot;&lt;strong&gt;至少&lt;/strong&gt;满足一个条件&amp;quot;的计数（并集），当交集比并集好算时用容斥；配合&amp;quot;反面计数&amp;quot;（总数减去反面）更是解决&amp;quot;至少/至多&amp;quot;问题的黄金搭档。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;例题&lt;/strong&gt;：1 – 100 中能被 2 或 3 整除的数有多少个？能被 2 整除的有 50 个，被 3 整除的有 33 个，被 6 整除的有 16 个，容斥得 $50 + 33 - 16 = 67$ 个。&lt;/p&gt;
&lt;h3 id=&#34;应用场景算法分析与概率&#34;&gt;应用场景：算法分析与概率&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;算法复杂度&lt;/strong&gt;：估算循环执行次数、递归调用次数，本质都是计数；乘法原理告诉你两层嵌套循环是 $O(n^2)$。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;概率论基础&lt;/strong&gt;：古典概型就是&amp;quot;有利方案数 ÷ 总方案数&amp;quot;，分子分母都是排列组合问题。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;密码与碰撞&lt;/strong&gt;：生日悖论（23 人中两人同天生日的概率就超过 50%）是计数 + 鸽笼思想的结果，直接决定了哈希值需要多长才安全。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;5-数论初步整数的性质&#34;&gt;5. 数论初步：整数的性质&lt;/h2&gt;
&lt;p&gt;数论研究整数的整除结构，是离散数学里最&amp;quot;古老又最新潮&amp;quot;的一章——两千多年的老学问，如今撑着整个互联网的安全体系。&lt;/p&gt;
&lt;h3 id=&#34;51-整除与最大公约数&#34;&gt;5.1 整除与最大公约数&lt;/h3&gt;
&lt;p&gt;若存在整数 k 使 $a = bk$（$b \neq 0$），称 &lt;strong&gt;b 整除 a&lt;/strong&gt;，记作 $b \mid a$。否则记作 $b \nmid a$。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;最大公约数&lt;/strong&gt; $\gcd(a, b)$：能同时整除 a 和 b 的最大整数。若 $\gcd(a, b) = 1$，称 a 与 b &lt;strong&gt;互质&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;求最大公约数用&lt;strong&gt;欧几里得算法&lt;/strong&gt;（辗转相除法），核心递推就一行：&lt;/p&gt;
&lt;p&gt;$$\gcd(a, b) = \gcd(b, \, a \bmod b)$$&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;白话解释&lt;/strong&gt;：不断用&amp;quot;较小数&amp;quot;和&amp;quot;余数&amp;quot;替换原来的两个数，直到余数为 0，此时另一个数就是最大公约数。比如 $\gcd(48, 18) = \gcd(18, 12) = \gcd(12, 6) = \gcd(6, 0) = 6$。这是人类历史上最早的非平凡算法之一，两千年后仍是标准库里的实现。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;扩展欧几里得算法&lt;/strong&gt;还能顺手求出整数 s, t 使：&lt;/p&gt;
&lt;p&gt;$$\gcd(a, b) = s \, a + t \, b$$&lt;/p&gt;
&lt;p&gt;这叫&lt;strong&gt;裴蜀定理&lt;/strong&gt;（Bézout&amp;rsquo;s identity）。&lt;strong&gt;干什么用&lt;/strong&gt;：它是求&amp;quot;模逆元&amp;quot;的工具——而模逆元是 RSA 生成密钥的核心步骤。&lt;/p&gt;
&lt;h3 id=&#34;52-同余与模运算&#34;&gt;5.2 同余与模运算&lt;/h3&gt;
&lt;p&gt;若 $m \mid (a - b)$，称 &lt;strong&gt;a 与 b 模 m 同余&lt;/strong&gt;，记作&lt;/p&gt;
&lt;p&gt;$$a \equiv b \pmod{m}$$&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;白话解释&lt;/strong&gt;：a 和 b 除以 m 余数相同，在&amp;quot;模 m 的世界&amp;quot;里它们就是同一个数。时钟就是最直观的模运算：15 点 $\equiv$ 3 点（mod 12）。&lt;/p&gt;
&lt;p&gt;同余的妙处在于它对加、减、乘都&amp;quot;兼容&amp;quot;：&lt;/p&gt;
&lt;p&gt;$$(a + b) \bmod m = \big((a \bmod m) + (b \bmod m)\big) \bmod m$$&lt;/p&gt;
&lt;p&gt;$$(a \cdot b) \bmod m = \big((a \bmod m) \cdot (b \bmod m)\big) \bmod m$$&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;白话解释&lt;/strong&gt;：可以先取余再运算，结果一样。这让你能计算天文数字的个位：$7^{100}$ 的末位，只需看 $7^4 \equiv 1 \pmod{10}$，于是 $7^{100} = (7^4)^{25} \equiv 1 \pmod{10}$，末位是 1。完全不用算出那个 85 位数。&lt;/p&gt;
&lt;p&gt;模运算下的&lt;strong&gt;快速幂&lt;/strong&gt;（反复平方法）把 $a^n$ 的计算量从 n 次乘法降到 $O(\log n)$ 次，是密码学能落地的前提。&lt;/p&gt;
&lt;h3 id=&#34;53-素数与-rsa-的思想&#34;&gt;5.3 素数与 RSA 的思想&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;素数&lt;/strong&gt;（质数）是大于 1 且只有 1 和自身两个正因子的整数。&lt;strong&gt;算术基本定理&lt;/strong&gt;：每个大于 1 的整数都能唯一分解为素数的乘积。&lt;/p&gt;
&lt;p&gt;RSA 的安全基石是下面的不对称性：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;正向容易&lt;/strong&gt;：给你两个大素数 p 和 q，算 $n = p \, q$ 只要一次乘法；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;逆向极难&lt;/strong&gt;：只给你 n，分解出 p 和 q 在计算上不可行（大整数分解难题）。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;密钥生成用欧拉函数：$\varphi(n) = (p-1)(q-1)$，再选 e 满足 $\gcd(e, \, \varphi(n)) = 1$，用扩展欧几里得算法求 d 使&lt;/p&gt;
&lt;p&gt;$$e \, d \equiv 1 \pmod{\varphi(n)}$$&lt;/p&gt;
&lt;p&gt;公钥是 $(n, e)$，私钥是 $(n, d)$。加密是 $c \equiv m^e \pmod{n}$，解密是 $m \equiv c^d \pmod{n}$。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;📜 历史故事：1977 年，密码学走出保密室&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在 1970 年代之前，加密双方必须事先偷偷约好同一把钥匙，密钥分发本身就是死结。1977 年，MIT 的三位年轻研究者 Rivest、Shamir、Adleman 发表了一种全新的方案：加密用公开的钥匙，解密用私有的钥匙，即使敌人知道加密方法也解不开。取三人姓氏首字母，这就是 RSA。同年，科普作家马丁·加德纳在《科学美国人》专栏介绍了这个算法，并悬赏破解一个 129 位的 RSA 密文——该挑战直到 1994 年才被一个分布式计算项目攻破。RSA 让&amp;quot;素数&amp;quot;&amp;ldquo;同余&amp;quot;这些古老的纯数学概念，一夜之间变成了电子商务的看门人。如今你浏览器地址栏的小锁头背后，跑的就是 5.2 节的同余运算。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;应用场景密码学与校验码&#34;&gt;应用场景：密码学与校验码&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;RSA 与 TLS&lt;/strong&gt;：上面讲过，不重复。重点是理解为什么离散数学的&amp;quot;数论初步&amp;quot;不是屠龙之技。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;哈希与校验&lt;/strong&gt;：身份证最后一位、ISBN 书号、CRC 校验，都是模运算（mod 11、mod 10 等）的应用。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;负载均衡与分库分表&lt;/strong&gt;：&lt;code&gt;hash(key) mod N&lt;/code&gt; 决定数据落到哪台机器，模运算每天都在分布式系统里被执行亿万次。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;6-图论结构与连接&#34;&gt;6. 图论：结构与连接&lt;/h2&gt;
&lt;h3 id=&#34;61-图的基本概念&#34;&gt;6.1 图的基本概念&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;图&lt;/strong&gt;（graph）由&lt;strong&gt;顶点集&lt;/strong&gt; V 和&lt;strong&gt;边集&lt;/strong&gt; E 组成，记作 $G = (V, E)$。边是顶点的无序对（无向图）或有序对（有向图）。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;度&lt;/strong&gt; $\deg(v)$：顶点 v 关联的边数（有向图分出度、入度）；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;路径&lt;/strong&gt;（path）：顶点依次相连、边不重复（严格定义教材略有差异，做题时以课本为准）；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;连通&lt;/strong&gt;：任意两点间都有路径可达；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;完全图&lt;/strong&gt; $K_n$：n 个顶点两两之间都有边，共 $\binom{n}{2}$ 条边。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;图论第一定理——握手定理&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;$$\sum_{v \in V} \deg(v) = 2|E|$$&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;白话解释&lt;/strong&gt;：所有顶点的度数之和等于边数的两倍，因为每条边给两端各贡献 1 度。推论：&lt;strong&gt;奇数度的顶点必有偶数个&lt;/strong&gt;（总和是偶数，奇数度顶点若为奇数个，总和就成奇数了）。这个推论常用来秒杀选择题。&lt;/p&gt;
&lt;h3 id=&#34;62-欧拉图与哈密顿图&#34;&gt;6.2 欧拉图与哈密顿图&lt;/h3&gt;
&lt;p&gt;这是最容易混淆的一对概念，先给判别法再给故事。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;欧拉回路&lt;/strong&gt;：经过&lt;strong&gt;每条边恰好一次&lt;/strong&gt;并回到起点的回路。无向连通图存在欧拉回路的充要条件：&lt;strong&gt;所有顶点度数为偶数&lt;/strong&gt;。存在欧拉通路（不回到起点）的条件是恰有两个奇度顶点。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;哈密顿回路&lt;/strong&gt;：经过&lt;strong&gt;每个顶点恰好一次&lt;/strong&gt;并回到起点的回路。&lt;strong&gt;没有简单的充要条件&lt;/strong&gt;，判定一般图的哈密顿回路是 NP 完全问题——这正是它难的地方。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart TD
    Q[&amp;#34;一笔画 / 遍历问题&amp;#34;] --&amp;gt; A{&amp;#34;要求是什么?&amp;#34;}
    A -- &amp;#34;每条边恰好一次&amp;#34; --&amp;gt; E[&amp;#34;欧拉图问题&amp;#34;]
    A -- &amp;#34;每个顶点恰好一次&amp;#34; --&amp;gt; H[&amp;#34;哈密顿图问题&amp;#34;]
    E --&amp;gt; E1{&amp;#34;所有顶点度数为偶数?&amp;#34;}
    E1 -- &amp;#34;是&amp;#34; --&amp;gt; E2[&amp;#34;存在欧拉回路 可一笔画回起点&amp;#34;]
    E1 -- &amp;#34;恰两个奇度点&amp;#34; --&amp;gt; E3[&amp;#34;存在欧拉通路 从奇点起到奇点止&amp;#34;]
    E1 -- &amp;#34;奇度点超过两个&amp;#34; --&amp;gt; E4[&amp;#34;不存在 无法一笔画&amp;#34;]
    H --&amp;gt; H1[&amp;#34;无通用判别法&amp;lt;br&amp;gt;靠经验定理或搜索&amp;#34;]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;📜 历史故事：哥尼斯堡七桥，一门学科的诞生&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;18 世纪的哥尼斯堡（今俄罗斯加里宁格勒）有条河穿城而过，河中有两座岛，七座桥把岛和两岸连起来。市民们有个消遣：能不能散步时把每座桥恰好走一次，最后回到出发点？1736 年，欧拉解决了这个问题。他的关键一步是&lt;strong&gt;抽象&lt;/strong&gt;：把陆地缩成点、把桥画成线，地理问题瞬间变成&amp;quot;一笔画&amp;quot;问题。然后他注意到一个朴素的事实：除了起点和终点，每进入一个顶点就要离开一次，所以中间顶点的度数必须是偶数。而七桥图中四个顶点全是奇数度——答案是不可能。这篇论文被公认为图论的开端，也是拓扑学思想的萌芽。欧拉示范了数学建模的完整流程：&lt;strong&gt;舍弃无关细节（岛的大小、桥的长短），只保留连接关系&lt;/strong&gt;——这正是今天我们用图建模社交网络、路网的思维方式。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;63-树与生成树&#34;&gt;6.3 树与生成树&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;树&lt;/strong&gt;（tree）：连通且无回路的图。n 个顶点的树有一堆等价的刻画，最常用的一条：&lt;/p&gt;
&lt;p&gt;$$|E| = |V| - 1$$&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;白话解释&lt;/strong&gt;：n 个顶点的树恰好有 n-1 条边——多一条必出环，少一条必不连通。&amp;ldquo;恰好&amp;quot;两个字说明树是&lt;strong&gt;最省的连通结构&lt;/strong&gt;：用最少的边把所有点连起来。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;生成树&lt;/strong&gt;（spanning tree）：包含图 G 所有顶点的、用 G 的边构成的树。带权图中边权和最小的生成树叫&lt;strong&gt;最小生成树&lt;/strong&gt;（MST），用 Kruskal 或 Prim 算法求——这两个算法属于贪心算法的经典教材案例。&lt;/p&gt;
&lt;p&gt;树的重要性质（都能用 $|E| = |V| - 1$ 和&amp;quot;无环&amp;quot;推出来）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;任意两点间有&lt;strong&gt;唯一&lt;/strong&gt;路径；&lt;/li&gt;
&lt;li&gt;删去任一条边，树就断开；&lt;/li&gt;
&lt;li&gt;添上任一条新边，恰好出现一个环。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;应用场景网络路由与编译器&#34;&gt;应用场景：网络路由与编译器&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;网络路由&lt;/strong&gt;：互联网的骨干网路由要避免环路，生成树协议（STP）就是在交换网络里动态维护一棵生成树；OSPF 的最短路径计算基于 Dijkstra 算法。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;编译器&lt;/strong&gt;：源代码被解析成抽象语法树（AST）；表达式求值、作用域管理都在树上进行。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;社交网络与推荐&lt;/strong&gt;：好友关系是无向图，&amp;ldquo;你可能认识的人&amp;quot;是图上的二度邻居查询；社区发现、 PageRank 都是图算法。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;路径规划&lt;/strong&gt;：地图 App 的导航就是带权图上的最短路问题；旅行商问题（TSP）是哈密顿回路的加权版，NP 难，催生了整个近似算法领域。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;7-递推关系初步算法分析入门&#34;&gt;7. 递推关系初步：算法分析入门&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;递推关系&lt;/strong&gt;（recurrence）用数列前面的项定义后面的项，配上&lt;strong&gt;初始条件&lt;/strong&gt;就能唯一确定整个数列。它是&amp;quot;用数学语言描述递归&amp;quot;的工具，也是《算法导论》分析递归算法复杂度的起点。&lt;/p&gt;
&lt;h3 id=&#34;71-斐波那契数列&#34;&gt;7.1 斐波那契数列&lt;/h3&gt;
&lt;p&gt;$$F_n = F_{n-1} + F_{n-2}, \qquad F_0 = 0, \; F_1 = 1$$&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;白话解释&lt;/strong&gt;：从第三项起，每一项是前两项之和：0, 1, 1, 2, 3, 5, 8, 13, …。它有两个经典用途：一是演示&amp;quot;递归定义&amp;rdquo;（函数自己调用自己）；二是演示&lt;strong&gt;朴素递归的指数级浪费&lt;/strong&gt;与&lt;strong&gt;动态规划的改进&lt;/strong&gt;——直接递归算 $F_n$ 要重复计算大量子问题，改成自底向上填表后只需 $O(n)$。&lt;/p&gt;
&lt;p&gt;斐波那契还有封闭形式的通项公式（比内公式），涉及无理数 $\sqrt{5}$，本科阶段知道它存在即可：递推式理论上可以解出显式公式，但大多数场合用递推式本身更方便。&lt;/p&gt;
&lt;h3 id=&#34;72-汉诺塔&#34;&gt;7.2 汉诺塔&lt;/h3&gt;
&lt;p&gt;n 个盘子从 A 柱借助 B 柱移到 C 柱，大盘不能压小盘，最少移动次数记为 $H(n)$。把上面的 n-1 个盘子先挪到 B（$H(n-1)$ 步），大盘挪到 C（1 步），再把 n-1 个盘子挪回 C（$H(n-1)$ 步），于是：&lt;/p&gt;
&lt;p&gt;$$H(n) = 2 \, H(n-1) + 1, \qquad H(1) = 1$$&lt;/p&gt;
&lt;p&gt;展开迭代几轮找规律：&lt;/p&gt;
&lt;p&gt;$$H(n) = 2 \, H(n-1) + 1 = 2^2 H(n-2) + 2 + 1 = \cdots = 2^n - 1$$&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;白话解释&lt;/strong&gt;：每多一个盘子，步数翻倍还多一。64 个盘子要 $2^{64} - 1$ 步——传说是僧侣搬完世界就毁灭的那个数字，约 5800 多亿年（每秒一步）。这个例子让你直观感受&lt;strong&gt;指数增长的恐怖&lt;/strong&gt;，也是理解&amp;quot;为什么指数复杂度算法不能用&amp;quot;的第一课。&lt;/p&gt;
&lt;h3 id=&#34;应用场景递归算法的时间复杂度&#34;&gt;应用场景：递归算法的时间复杂度&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;分治算法&lt;/strong&gt;：归并排序的复杂度满足 $T(n) = 2T(n/2) + O(n)$，解出来是 $O(n \log n)$——解递推关系就是给算法&amp;quot;算工资&amp;rdquo;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;动态规划&lt;/strong&gt;：状态转移方程（如背包问题、编辑距离）全是递推关系，写 DP 代码就是把数学递推式翻译成填表循环。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据结构分析&lt;/strong&gt;：二叉树高度与节点数的关系、哈希表扩容的均摊分析，都用递推刻画。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;8-避坑技巧新人最容易犯的-10-个错误&#34;&gt;8. 避坑技巧：新人最容易犯的 10 个错误&lt;/h2&gt;
&lt;p&gt;下面 10 条几乎每条都有人挂过科。按&amp;quot;错误说法 → 正确理解 → 简短例子&amp;quot;自查。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;坑 1：把 $\to$ 当成&amp;quot;因为所以&amp;rdquo;&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;错误说法：$p \to q$ 表示 p 是 q 的原因。&lt;/li&gt;
&lt;li&gt;正确理解：蕴含只描述真值关系，不描述因果。只要&amp;quot;前件真且后件假&amp;quot;不出现，蕴含就成立。&lt;/li&gt;
&lt;li&gt;例子：&amp;ldquo;如果 2 是偶数，那么雪是白的&amp;quot;是真命题，尽管两者毫无因果。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;坑 2：忘记&amp;quot;虚真&amp;rdquo;，觉得 p 假时 $p \to q$ 无意义&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;错误说法：前提不成立时，蕴含式&amp;quot;不成立&amp;quot;。&lt;/li&gt;
&lt;li&gt;正确理解：前件为假时蕴含式&lt;strong&gt;为真&lt;/strong&gt;（虚真）。&lt;/li&gt;
&lt;li&gt;例子：&amp;ldquo;所有会飞的猪都戴眼镜&amp;quot;是真的——因为不存在会飞的猪，找不到反例。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;坑 3：把 $p \to q$ 和它的逆命题 $q \to p$ 混为一谈&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;错误说法：&amp;ldquo;若 p 则 q&amp;quot;成立，所以&amp;quot;若 q 则 p&amp;quot;也成立。&lt;/li&gt;
&lt;li&gt;正确理解：与原命题等价的是&lt;strong&gt;逆否命题&lt;/strong&gt; $\neg q \to \neg p$；逆命题和否命题都不等价。&lt;/li&gt;
&lt;li&gt;例子：&amp;ldquo;下雨则地湿&amp;quot;为真，推不出&amp;quot;地湿则下雨&amp;rdquo;（可能是洒水车），但能推出&amp;quot;地没湿则没下雨&amp;rdquo;。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;坑 4：量词否定只否一半&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;错误说法：$\neg \forall x \, P(x)$ 等于 $\forall x \, \neg P(x)$。&lt;/li&gt;
&lt;li&gt;正确理解：否定穿过量词必须翻转量词：$\neg \forall x \, P(x) \equiv \exists x \, \neg P(x)$。&lt;/li&gt;
&lt;li&gt;例子：&amp;ldquo;并非所有人都及格&amp;rdquo;≠&amp;ldquo;所有人都不及格&amp;rdquo;，正确是&amp;quot;存在至少一个人不及格&amp;rdquo;。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;坑 5：把 $\subseteq$ 和 $\in$ 用混&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;错误说法：$\{1\} \in \{1, 2, 3\}$。&lt;/li&gt;
&lt;li&gt;正确理解：$\in$ 连接&amp;quot;元素和集合&amp;quot;，$\subseteq$ 连接&amp;quot;集合和集合&amp;quot;。&lt;/li&gt;
&lt;li&gt;例子：$1 \in \{1, 2, 3\}$，$\{1\} \subseteq \{1, 2, 3\}$，两者各安其位。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;坑 6：以为任意关系都有&amp;quot;三性&amp;quot;&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;错误说法：自反、对称、传递是绑定的，证明一条就行。&lt;/li&gt;
&lt;li&gt;正确理解：三条性质互相独立，必须分别验证；而且等价关系要三条全占，偏序要自反 + 反对称 + 传递。&lt;/li&gt;
&lt;li&gt;例子：&amp;ldquo;整除&amp;quot;在正整数上自反、传递但&lt;strong&gt;不对称&lt;/strong&gt;，所以它不是等价关系而是偏序关系。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;坑 7：把&amp;quot;满射&amp;quot;理解成&amp;quot;每个输入都有输出&amp;rdquo;&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;错误说法：函数每个 x 都有 f(x)，所以是满射。&lt;/li&gt;
&lt;li&gt;正确理解：&amp;ldquo;每个输入有输出&amp;quot;是函数定义的基本要求，跟满射无关；满射要求&lt;strong&gt;陪域&lt;/strong&gt;里每个 y 都被击中。&lt;/li&gt;
&lt;li&gt;例子：$f: \mathbb{R} \to \mathbb{R}$，$f(x) = x^2$ 不是满射（负数没被击中），但若陪域改成 $[0, +\infty)$ 就是满射——&lt;strong&gt;满不满射取决于你声明的陪域&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;坑 8：排列组合不分，看到&amp;quot;取 k 个&amp;quot;就套 $P(n, k)$&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;错误说法：从 10 人里选 3 人参赛，有 $P(10, 3) = 720$ 种选法。&lt;/li&gt;
&lt;li&gt;正确理解：先问&amp;quot;选出来的 3 人内部排不排名次&amp;rdquo;。不排就是组合 $\binom{10}{3} = 120$。&lt;/li&gt;
&lt;li&gt;例子：选 3 人当不同职务用排列（职务即顺序），选 3 人做同一件事用组合。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;坑 9：容斥原理里忘了&amp;quot;奇加偶减&amp;quot;，减完就停&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;错误说法：$|A \cup B \cup C| = |A| + |B| + |C| - |A \cap B| - |A \cap C| - |B \cap C|$。&lt;/li&gt;
&lt;li&gt;正确理解：三集合时还要&lt;strong&gt;加回&lt;/strong&gt;三者交集 $|A \cap B \cap C|$，因为它被减过头了。&lt;/li&gt;
&lt;li&gt;例子：三班都报兴趣班的 5 人，在单班人数里被算了 3 次、在两两交集里被减了 3 次，净算 0 次，必须加回。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;坑 10：握手定理数错边，或者以为奇度点可以是奇数个&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;错误说法：一个图可以有 3 个度数为 3 的顶点，其余顶点度数为偶数。&lt;/li&gt;
&lt;li&gt;正确理解：度数总和 $= 2|E|$ 必为偶数，所以奇度顶点必有&lt;strong&gt;偶数&lt;/strong&gt;个。&lt;/li&gt;
&lt;li&gt;例子：想构造&amp;quot;恰有 3 个奇度点&amp;quot;的图是徒劳的，这在动笔前就能排除。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;9-应用全景离散数学与计算机科学的对应表&#34;&gt;9. 应用全景：离散数学与计算机科学的对应表&lt;/h2&gt;
&lt;p&gt;最后把整门课映射到计算机科学，方便你日后&amp;quot;按图索骥&amp;quot;：&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart LR
    subgraph DM[&amp;#34;离散数学&amp;#34;]
        L[&amp;#34;命题与谓词逻辑&amp;#34;]
        S[&amp;#34;集合与关系&amp;#34;]
        F[&amp;#34;函数&amp;#34;]
        C[&amp;#34;计数&amp;#34;]
        N[&amp;#34;数论&amp;#34;]
        G[&amp;#34;图论&amp;#34;]
        R[&amp;#34;递推关系&amp;#34;]
    end
    subgraph CS[&amp;#34;计算机科学&amp;#34;]
        HW[&amp;#34;数字电路 芯片设计&amp;#34;]
        DB[&amp;#34;关系数据库 SQL&amp;#34;]
        AI[&amp;#34;人工智能 知识推理&amp;#34;]
        AL[&amp;#34;算法复杂度分析&amp;#34;]
        CR[&amp;#34;密码学 RSA 区块链&amp;#34;]
        NET[&amp;#34;网络路由 社交网络&amp;#34;]
        PL[&amp;#34;编译器 程序验证&amp;#34;]
    end
    L --&amp;gt; HW
    L --&amp;gt; AI
    L --&amp;gt; PL
    S --&amp;gt; DB
    S --&amp;gt; PL
    F --&amp;gt; DB
    F --&amp;gt; CR
    C --&amp;gt; AL
    C --&amp;gt; CR
    N --&amp;gt; CR
    G --&amp;gt; NET
    G --&amp;gt; AL
    R --&amp;gt; AL&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;一句话总结这张全景图：&lt;strong&gt;离散数学不是一门课，而是计算机科学的&amp;quot;语法书&amp;quot;&lt;/strong&gt;——你以后学的每一门专业课，都在用这里的符号说话。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;10-学习建议与资源建议&#34;&gt;10. 学习建议与资源建议&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;学习建议：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;先建立&amp;quot;定义直觉&amp;quot;，再背定理&lt;/strong&gt;。每个概念先找一个生活例子（等价关系→分班，偏序→先修课，双射→对号入座），例子记住了，定义就忘不掉。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;真值表和文氏图是底线工具&lt;/strong&gt;。等值式证明不出来就列真值表，集合等式证不出来就画文氏图——笨办法永远兜底。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;做题先问&amp;quot;这题考哪个工具&amp;quot;&lt;/strong&gt;。离散数学的题目套路化程度高：出现&amp;quot;至少/至多&amp;quot;想容斥或反面计数，出现&amp;quot;必然存在&amp;quot;想鸽笼，出现&amp;quot;一笔画&amp;quot;想度数奇偶，出现&amp;quot;递归式&amp;quot;想展开迭代。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;亲手推一遍经典结论&lt;/strong&gt;。欧几里得算法、$H(n) = 2^n - 1$ 的展开、握手定理的证明，都不超过五行，亲手推一遍胜过读十遍。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;用代码验证数学&lt;/strong&gt;。学排列组合就写个 &lt;code&gt;itertools.permutations&lt;/code&gt; 数数对不对，学欧几里得算法就自己实现一遍——离散数学是少数能&amp;quot;当场编程验证&amp;quot;的数学课，别浪费这个福利。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;资源建议：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;教材：屈婉玲、耿素云、张立昂《离散数学》（高等教育出版社），国内高校主流教材，习题经典；国外可配 Rosen 的 &lt;em&gt;Discrete Mathematics and Its Applications&lt;/em&gt;（《离散数学及其应用》），例子极多、应用导向。&lt;/li&gt;
&lt;li&gt;课程：MIT 6.042 &lt;em&gt;Mathematics for Computer Science&lt;/em&gt;（有公开讲义和公开课），计算机视角讲离散数学，非常对胃口。&lt;/li&gt;
&lt;li&gt;工具：纸上画哈斯图和文氏图；代码验证用 Python（&lt;code&gt;itertools&lt;/code&gt;、&lt;code&gt;sympy&lt;/code&gt; 足够）。&lt;/li&gt;
&lt;li&gt;练习顺序建议：每章先做教材课后基础题，概念题（判断对错、举例）优先于计算题——离散数学挂科往往挂在概念混淆，而不是算错数。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;祝学习顺利。这门课一旦&amp;quot;通了&amp;quot;，你再看算法、数据库、密码学的教材，会发现满篇都是老朋友。&lt;/p&gt;
</description>
    </item>
    
  </channel>
</rss>
