知识焦点
先建立概念地图
- countability
- uncountable sets
- set operations
- finite and infinite graphs
- graph isomorphism
- fixed points
- uncomputability
- halting problem
CS70 · 作业 06
CS 70 第六份作业,涵盖可数性理论(并与交、有限与无限图、函数空间的可数性)、不可计算性(不动点问题、柯尔莫哥洛夫复杂度)以及计数(排列组合、星与条、费马小定理)。
知识焦点
建议顺序
先完整作答,再按需展开提示;最后才展开官方参考解答并逐步核对证明与计算。
本地来源
题面与解答均由本地一手资料整理:homework/hw06.pdf、solutions/homework/hw06-sol.pdf
本地一手资料完整提取 · 作业
本节按本地一手资料完整整理,共 8 道大题。本地官方解答已收录 7/8 道并默认折叠;其余题目会明确标注无本地官方解答。
homework/hw06.pdf、solutions/homework/hw06-sol.pdf在开始撰写最终作业提交之前,请简要说明你是如何完成这份作业的。你还与谁一起完成?请列出姓名和电子邮件地址。(如果是在作业讨论会中协作,只需描述该小组即可。)
如实记录协作对象与协作方式;每位同学仍应独立组织并撰写自己的最终答案。
本地资料未提供这道题的官方解答;页面只保留题面与非答案式提示。
题面来源:homework/hw06.pdf · 1 · confidence: high
已知:
\(X\) 是一个可数(countable)的非空集合。对所有 \(i \in X\),\(A_i\) 是不可数(uncountable)集合。
\(Y\) 是一个不可数集合。对所有 \(i \in Y\),\(B_i\) 是可数集合。
对下列每个表达式,判断它属于「Always countable」(总是可数)、「Always uncountable」(总是不可数)、「Sometimes countable, Sometimes uncountable」(有时可数,有时不可数)中的哪一种。
对于「Always」情形,证明你的结论。对于「Sometimes」情形,给出两个例子——一个使表达式可数,一个使表达式不可数。
(a) \(X \cap Y\) (b) \(X \cup Y\) (c) \(\bigcup_{i\in X} A_i\) (d) \(\bigcap_{i\in X} A_i\) (e) \(\bigcup_{i\in Y} B_i\) (f) \(\bigcap_{i\in Y} B_i\)
可数集的子集仍是可数集;不可数集的母集(superset)仍是不可数集。对于交与并的极端情形,考虑集合之间是否相同或不相交(disjoint)。
(a) Always countable(总是可数)。\(X \cap Y\) 是 \(X\) 的子集,而 \(X\) 是可数集,因此 \(X \cap Y\) 也是可数集。
(b) Always uncountable(总是不可数)。\(X \cup Y\) 是 \(Y\) 的母集,而 \(Y\) 是不可数集,因此 \(X \cup Y\) 也是不可数集。
(c) Always uncountable(总是不可数)。任取 \(X\) 中的一个元素 \(x\)。\(A_x\) 是不可数集。因此 \(\bigcup_{i\in X} A_i\)(\(A_x\) 的母集)也是不可数集。
(d) Sometimes countable, sometimes uncountable(有时可数,有时不可数)。
可数情形:当 \(A_i\) 两两不相交时,交集为空集,从而是可数的。例如,令 \(X = \mathbb{N}\),\(A_i = \{i\} \times \mathbb{R} = \{(i, x) \mid x \in \mathbb{R}\}\)。此时 \(\bigcap_{i\in X} A_i = \emptyset\)。
不可数情形:当所有 \(A_i\) 都相同时,交集是不可数的。例如,令 \(X = \mathbb{N}\),对所有 \(i\) 令 \(A_i = \mathbb{R}\)。此时 \(\bigcap_{i\in X} A_i = \mathbb{R}\),是不可数集。
(e) Sometimes countable, sometimes uncountable(有时可数,有时不可数)。
可数情形:令所有 \(B_i\) 相同。例如,令 \(Y = \mathbb{R}\),\(B_i = \mathbb{N}\)。此时 \(\bigcup_{i\in Y} B_i = \mathbb{N}\),是可数集。
不可数情形:令 \(Y = \mathbb{R}\),\(B_i = \{i\}\)。此时 \(\bigcup_{i\in Y} B_i = \mathbb{R}\),是不可数集。
(f) Always countable(总是可数)。任取 \(Y\) 中的一个元素 \(y\)。\(B_y\) 是可数集。因此 \(\bigcap_{i\in Y} B_i\)(\(B_y\) 的子集)也是可数集。
解答来源:solutions/homework/hw06-sol.pdf · 1 · confidence: high
题面来源:homework/hw06.pdf · 1 · confidence: high
若一个图的顶点集是无限的,则我们在课堂上学过的图论知识仍然适用。因此我们区分有限图与无限图:图 \(G = (V, E)\) 是有限图,当且仅当 \(V\) 和 \(E\) 都是有限集;否则该图是无限图。作为示例,考虑下列无限图:
\(G_1 = (V = \mathbb{N}, E = \{(i, j) \in \mathbb{N} \times \mathbb{N} \mid |i - j| = 1\})\)
\(G_2 = (V = \mathbb{Z}, E = \{(i, j) \in \mathbb{Z} \times \mathbb{Z} \mid |i - j| = 1\})\)
\(G_3 = (V = \mathbb{Z}, E = \{(i, j) \in \mathbb{Z} \times \mathbb{Z} \mid i < j\})\)
\(G_4 = (V = \mathbb{Z}^2, E = \{((i, j), (k, l)) \in \mathbb{Z}^2 \times \mathbb{Z}^2 \mid (i = k \land |j - l| = 1) \lor (j = l \land |i - k| = 1)\})\)
注意:\(G_1\) 是自然数构成的线,\(G_2\) 是整数构成的线,\(G_3\) 是所有整数上的完全图,\(G_4\) 是整数格点图。
证明下列图集合是可数还是不可数。
(a) 所有有限图 \(G = (V, E)\) 构成的集合,其中 \(V \subseteq \mathbb{N}\)。
(b) 在固定的可数无限顶点集上,所有每个顶点的度(degree)恰好为 2 的图构成的集合。例如,\(G_2\)(上面定义的)中每个顶点的度都是 2。
(c) 我们称图 \(G = (V, E)\) 与 \(G' = (V', E')\) 同构(isomorphic),如果存在某个双射 \(f : V \to V'\),使得 \((u, v) \in E\) 当且仅当 \((f(u), f(v)) \in E'\)。这样的双射 \(f\) 称为图同构(graph isomorphism)。假设我们认为两个图等价当且仅当它们同构。其思想是:如果重新标记图的顶点,仍然是同一个图。
利用这个「相同图」的定义,证明:在可数无限顶点集上的所有树构成的集合是不可数的。
(提示:构造一个从无限比特串集合到无限树集合的单射(injection);\(G_1\) 可能是一个好的起点。证明:对任意图同构 \(f\) 和任意顶点 \(v\),\(f(v)\) 与 \(v\) 的度相同,这可能会有所帮助。)
G1: 顶点集 N,边连接满足 |i-j|=1 的相邻自然数,呈向右无限延伸的链状。 G2: 顶点集 Z,边连接满足 |i-j|=1 的相邻整数,呈向左右双向无限延伸的链状。 G3: 顶点集 Z,边连接所有满足 i<j 的整数对,呈完全图(每对顶点间都有边)。 G4: 顶点集 Z²,边连接水平或垂直方向上相邻的格点(|i-k|+|j-l|=1),呈无限方格网。
来源:homework/hw06.pdf · 1
对于 (a),考虑按顶点数逐步枚举。对于 (b) 和 (c),尝试从无限二进制串集合构造单射:用比特值控制图中的局部结构(例如环的长度或叶子的有无),并利用度序列来区分不同构的图。
(a) 可数(Countable)。令 \(A\) 为我们计数的图集合。令 \(A_k\) 为所有满足 \(V \subseteq \{1, 2, \ldots, k\}\) 的图 \(G = (V, E)\) 构成的集合。注意 \(A = A_1 \cup A_2 \cup A_3 \cup \cdots\)。
每个特定的 \(A_k\) 是有限集,因为在具有 \(k\) 个顶点的图中,只有有限多条可能的边可以被包含。这意味着我们可以通过枚举每个 \(A_k\) 来枚举 \(A\);因此 \(A\) 是可数集。
(b) 不可数(Uncountable)。
回顾课堂知识:无限长的二进制串集合是不可数无限的。我们将从该集合向给定的图集合构造一个单射。
首先注意到,由于顶点集是可数的,我们可以用正整数标记它们:\(V = \{v_i \mid i \in \{1, 2, 3, \ldots\}\}\)。现在考虑一个无限二进制串 \(s = b_1 b_2 b_3 \cdots \in \{0,1\}^\infty\),其中 \(b_i \in \{0,1\}\) 是串的第 \(i\) 位。我们可以用如下方式编码第一位:用顶点 \(v_1, v_2, \ldots, v_{b_1+2}\) 构造一个长度为 \(b_1 + 3\) 的简单环(即构造链 \(v_1 \to v_2 \to \cdots \to v_{b_1+2} \to v_1\))。类似地,用顶点 \(v_{b_1+3}, v_{b_1+4}, \ldots, v_{b_1+b_2+5}\) 构造一个长度为 \(b_2 + 3\) 的简单环来编码 \(b_2\)。以此类推,我们通过用顶点 \(v_{f_s(i)}\) 到 \(v_{f_s(i)+b_i+1}\) 构造一个长度为 \(b_i + 3\) 的简单环来编码第 \(i\) 位,其中 \(f_s(i) = 3(i-1) + \sum_{j=1}^{i-1} b_j\)。\(V\) 中的每个顶点恰好属于这样一个环,因此每个顶点的度都恰好为 2。
为了说明这是一个单射,考虑两个不同的串 \(s = b_1 b_2 b_3 \cdots\) 和 \(s' = b'_1 b'_2 b'_3 \cdots\),它们在第 \(i\) 位首次不同。根据构造,前 \(f_s(i-1)\) 个顶点形成的子图在两个图中是相同的。然而,接下来的 \(b_i + 3\) 个顶点在 \(s\) 对应的图中属于一个长度为 \(b_i + 3\) 的简单环,而在 \(s'\) 对应的图中接下来的 \(b'_i + 3\) 个顶点属于一个长度为 \(b'_i + 3\) 的简单环,其中 \(b'_i + 3 \neq b_i + 3\)。这对所有 \(s, s' \in \{0,1\}^\infty\) 成立,因此我们得到了一个单射。
(c) 不可数(Uncountable)。首先证明:若 \(f\) 是图同构,则 \(v\) 与 \(f(v)\) 的度相同。假设它们度不同。那么要么存在 \(v\) 的某个邻居 \(w\) 使得 \((f(v), f(w)) \notin E'\),要么存在 \(f(v)\) 的某个邻居 \(w'\) 使得 \((v, f^{-1}(w')) \notin E\)。无论哪种情况,\(f\) 都不是同构。
我们将从无限比特串集合向无限树集合构造一个单射。具体来说,我们通过在无限线图 \(G = (V, E)\) 上添加叶子来构造这些树,其中 \(V = \{v_0, v_1, v_2, \ldots\}\),\(E = \{(v_i, v_{i+1}) \mid i \in \mathbb{N}\}\)。
对每个比特串 \(b\),其中 \(b(i)\) 是 \(b\) 的第 \(i\) 位,如下构造无限树 \(G_b\)。首先给 \(v_0\) 添加 10 个叶子。然后对每个 \(i\),若 \(b(i) = 1\),则给 \(v_i\) 添加一个叶子。我们将 \(G_b\) 中的每个 \(v_i\) 记为 \(v^b_i\)。
显然,所得的图是一棵树,因为添加叶子永远不会使图断开或产生环。该图也有可数个顶点,因为我们只添加了可数个顶点。
为了说明这个构造是从无限比特串集合到无限树集合的单射,我们首先注意到任何图同构必须将顶点映射到相同度的顶点。现在假设矛盾地,\(b \neq b'\) 但存在一个同构 \(f\) 从 \(G_b\) 到 \(G_{b'}\)。根据构造,每个 \(G_b\) 恰好有一个度 \(\geq 10\) 的顶点。因此,从 \(G_b\) 的顶点到 \(G_{b'}\) 的顶点的任何同构必须将 \(v^b_0\) 映射到 \(v^{b'}_0\)。因此,对每个 \(i\),它必须将 \(v^b_i\) 映射到 \(v^{b'}_i\)。然而,由于存在某个 \(i\) 使得 \(b(i) \neq b'(i)\),因此存在某个 \(i\) 使得 \(f(v^b_i)\) 与 \(v^{b'}_i\) 的度不同。
解答来源:solutions/homework/hw06-sol.pdf · 2-3 · confidence: high
题面来源:homework/hw06.pdf · 1-2 · confidence: high
(a) 一个圆盘(disk)是 \(\mathbb{R}^2\) 中形如 \(\{(x, y) \in \mathbb{R}^2 : (x - x_0)^2 + (y - y_0)^2 \leq r^2\}\) 的二维区域,其中 \(x_0, y_0, r \in \mathbb{R}\),\(r > 0\)。假设你有一组 \(\mathbb{R}^2\) 中的圆盘,其中任意两个圆盘都不重叠。这组圆盘一定是可数的,还是可能不可数的?
(提示:尝试将其与我们已知的某个可数集合联系起来,例如 \(\mathbb{Q} \times \mathbb{Q}\)。)
(b) 一个圆(circle)是平面上形如 \(\{(x, y) \in \mathbb{R}^2 : (x - x_0)^2 + (y - y_0)^2 = r^2\}\) 的子集,其中 \(x_0, y_0, r \in \mathbb{R}\),\(r > 0\)。现在假设你有一组 \(\mathbb{R}^2\) 中的圆,其中任意两个圆都不重叠。这组圆一定是可数的,还是可能不可数的?
(提示:圆与圆盘的区别在于,圆盘包含其内部的所有点,而圆不包含。)
(c) 所有增函数 \(f : \mathbb{N} \to \mathbb{N}\)(即若 \(x \geq y\),则 \(f(x) \geq f(y)\))构成的集合是可数的还是不可数的?证明你的结论。
(d) 所有减函数 \(f : \mathbb{N} \to \mathbb{N}\)(即若 \(x \geq y\),则 \(f(x) \leq f(y)\))构成的集合是可数的还是不可数的?证明你的结论。
(a)(b) 圆盘内部包含有理点,而圆只包含边界点。考虑能否在每个图形中唯一地选出一个有理点来建立到 \(\mathbb{Q} \times \mathbb{Q}\) 的单射。 (c)(d) 对于增函数,尝试康托对角线法;对于减函数,注意减函数的值域中必有最小元,且下降次数有限。
(a) 可数(Countable)。每个圆盘内部必须至少包含一个有理点(即横纵坐标都属于 \(\mathbb{Q}\) 的 \((x, y)\) 坐标点)。由于任意两个圆盘都不重叠,圆盘集合的基数不会超过 \(\mathbb{Q} \times \mathbb{Q}\) 的基数,而 \(\mathbb{Q} \times \mathbb{Q}\) 是可数集。
(b) 可能不可数(Possibly uncountable)。考虑圆 \(C_r = \{(x, y) \in \mathbb{R}^2 : x^2 + y^2 = r\}\),其中 \(r \in \mathbb{R}\)。当 \(r_1 \neq r_2\) 时,\(C_{r_1}\) 与 \(C_{r_2}\) 不重叠,而这样的圆有不可数个(每个实数对应一个)。
(c) 不可数(Uncountable)。假设存在一个双射,将 \(\mathbb{N}\) 映到所有增函数 \(\mathbb{N} \to \mathbb{N}\) 的集合: \[0 \mapsto (f_0(0), f_0(1), f_0(2), \ldots)\] \[1 \mapsto (f_1(0), f_1(1), f_1(2), \ldots)\] \[2 \mapsto (f_2(0), f_2(1), f_2(2), \ldots)\] \[\vdots\]
我们将用对角线论证法证明存在一个不在上述列表中的函数 \(f\)。定义 \[f(n) = 1 + \sum_{i=0}^{n} f_i(n).\]
首先证明 \(f\) 是增函数。事实上,若 \(m \leq n\),则 \[f(m) = 1 + \sum_{i=0}^{m} f_i(m) \leq 1 + \sum_{i=0}^{n} f_i(m) \leq 1 + \sum_{i=0}^{n} f_i(n) = f(n).\] 第一个不等式是因为每个函数值非负;第二个不等式是因为 \(f_i\) 都是增函数。
为证明 \(f\) 不在列表中,注意 \[f(n) = 1 + \sum_{i=0}^{n} f_i(n) \geq 1 + f_n(n) > f_n(n).\] 由于对每个 \(n \in \mathbb{N}\) 都有 \(f(n) > f_n(n)\),\(f\) 不可能是列表中的任何一个函数。因此,增函数 \(f : \mathbb{N} \to \mathbb{N}\) 的集合是不可数的。
(d) 可数(Countable)。对任意满足 \(f(0) = n\) 的函数,考虑函数值下降的下标个数:即满足 \(f(i) < f(i-1)\) 的 \(i\) 构成的集合。\(f\) 的值域是 \(\mathbb{N}\) 的子集,因此由良序原理(well-ordering principle)可知必存在最小元,记为 \(a\)。那么至多有 \(n - a\) 个转换点(transition points)。我们可以将任意满足 \(f(0) = n\) 的函数与一个记录函数值下降位置的「字」(word)建立双射。因此,减函数 \(\mathbb{N} \to \mathbb{N}\) 的集合与可数字母表上的有限比特串集合具有相同的基数,而后者是可数的。因此,所有减函数的集合是可数的。
解答来源:solutions/homework/hw06-sol.pdf · 4 · confidence: high
题面来源:homework/hw06.pdf · 2 · confidence: high
考虑判断程序 \(P\) 是否存在不动点的问题。给定任意程序 \(P\),不动点(fixed point)是指满足 \(P(x)\) 输出 \(x\) 的输入 \(x\)。
(a) 证明:判断一个程序是否有不动点的问题是不可计算的(uncomputable)。
(b) 考虑如下问题:如果程序有不动点,则输出一个不动点;否则输出 "Null"。证明这个问题是不可计算的。
(c) 考虑如下问题:如果程序 \(F\) 存在不动点且该不动点是一个自然数,则输出该不动点;否则输出 "Null"。
证明:如果这个问题可以求解,则 (b) 中的问题可以求解。这对该问题的可计算性意味着什么?(你可以假设程序所有可能输入的集合是可数的,就像在你的计算机上一样。)
(a)(b) 从停机问题(Halting Problem)出发做归约:构造一个新程序,使其行为依赖于原程序是否停机,从而将不动点存在性与停机性联系起来。 (c) 利用所有输入与自然数之间的双射,把任意输入的不动点问题转化为自然数上的不动点问题。
(a) 我们可以通过从停机问题归约来证明这一点。假设存在某个程序 FixedPoint(F) 能解决不动点问题。我们可以如下定义 TestHalt(F, x):
def TestHalt(F, x):
def F'(y):
F(x)
return y
return FixedPoint(F')
如果 \(F(x)\) 停机,则 \(F'(y)\) 总是返回 \(y\),因此每个输入都是不动点。另一方面,如果 \(F(x)\) 不停机,则 \(F'\) 对任何输入 \(y\) 都不会返回任何值,因此不可能有不动点。因此,我们对 TestHalt 的定义必须总是有效,这是一个矛盾;这告诉我们 FixedPoint 不可能存在。
(b) 如果这个问题可解,则 (a) 中的问题可解:如果 (b) 中的程序返回 "Null",我们就输出「否」(\(F\) 没有不动点),否则输出「是」。
(c) 直觉是所有输入的集合与 \(\mathbb{N}\) 之间存在双射,因此我们可以将 (b) 中的问题归约到这个问题。具体来说,由于所有输入的集合是可数无限的,存在一个双射函数 \(g\),将自然数 \(n\) 映射到唯一的输入字符串 \(g(n)\)。此外,我们可以稍微扩展 \(g\) 的定义,使得 \(g(\text{"Null"}) = \text{"Null"}\),从而它仍然是双射。
考虑以下程序:
def FindFixedPoint(F):
def F'(n):
if n not in N:
error
x = g(n)
if F(x) == x:
return n
else:
return n + 1
return g(FindFixedPointInN(F'))
由于 \(g\) 是双射,\(g^{-1}\) 存在,且若 \(g(n) = x\),则 \(n = g^{-1}(x)\)。如果存在某个 \(x\) 使得 \(F(x) = x\),则 \(n = g^{-1}(x)\) 将是 \(F'\) 的一个不动点。因此,如果 \(F\) 有不动点,FindFixedPointInN(F') 将返回某个 \(n\),其中 \(g(n)\) 是 \(F\) 的不动点。
另一方面,如果对所有输入 \(x\) 都有 \(F(x) \neq x\),则对所有 \(n\) 都有 \(F'(n) = n + 1 \neq n\),这意味着 \(F'\) 也没有不动点。因此,我们的程序解决了 (b) 中的问题,而 (b) 已被证明是不可计算的。这意味着这个问题也是不可计算的。
解答来源:solutions/homework/hw06-sol.pdf · 5 · confidence: high
题面来源:homework/hw06.pdf · 3 · confidence: high
压缩一个长度为 \(n\) 的比特串 \(x\) 可以解释为:构造一个长度少于 \(n\) 比特且返回 \(x\) 的程序。一个串的柯尔莫哥洛夫复杂度(Kolmogorov complexity)\(K(x)\) 是 \(x\) 的最优压缩副本的长度;也就是说,\(K(x)\) 是返回 \(x\) 的最短程序的长度。
(a) 解释为什么「不能用 280 个字符以内定义的最小正整数」这一概念是悖论性的。
(b) 证明:对于任意长度 \(n\),至少存在一个不能被压缩到少于 \(n\) 比特的比特串。
(c) 假设你有一个程序 \(K\),它能输出任意输入串的柯尔莫哥洛夫复杂度。在你可以将这样的程序 \(K\) 作为子程序使用的假设下,设计另一个程序 \(P\),它接受整数 \(n\) 作为输入,并输出具有最高柯尔莫哥洛夫复杂度的长度为 \(n\) 的二进制串。如果有多个串具有相同的最高复杂度,则输出字典序最小的那个。
(d) 假设你将刚才编写的程序 \(P\) 编译,得到一个 \(m\) 比特的可执行文件,其中 \(m \in \mathbb{N}\)(即程序 \(P\) 可以用 \(m\) 比特表示)。证明:程序 \(P\)(以及程序 \(K\))不可能存在。
(提示:考虑当 \(P\) 接受非常大的输入 \(n\) 时会发生什么。)
(a) 注意「280 个字符以内可定义」只有有限种可能,再用良序原理考虑最小元。 (b) 比较长度为 \(n\) 的串的数量与长度小于 \(n\) 的串的数量(二进制的计数论证)。 (d) 当 \(n\) 远大于 \(m\) 时,程序 \(P\) 本身构成了一个长度小于 \(n\) 但输出复杂度 \(\geq n\) 的串的程序,产生矛盾。
(a) 由于字符数量有限,因此在 280 个字符以内可定义的正整数只有有限个。因此,必然存在不能在 280 个字符内定义的正整数,而由良序原理可知,该集合中存在最小元。然而,语句「不能在 280 个字符以内定义的最小正整数」仅用 67 个字符(含空格)就定义了这个最小整数。因此,我们得到了一个悖论(称为 Berry 悖论,Berry Paradox)。
(b) 长度为 \(n\) 的串的数量是 \(2^n\)。长度小于 \(n\) 的串的数量是 \(\sum_{i=0}^{n-1} 2^i\)。我们知道这个和等于 \(2^n - 1\)(回忆二进制的原理)。因此,长度小于 \(n\) 的串集合的基数小于长度为 \(n\) 的串集合的基数。因此,必然存在长度为 \(n\) 且不能被压缩到更短串的串。
(c) 我们将这样的程序编写如下:
def P(n):
complex_string = "0" * n
for j in range(1, 2 ** n):
# 将 j 转换为二进制的 Python 代码
bit_string = "{0:b}".format(j)
# 长度现在应为 n 个字符
bit_string = (n - len(bit_string)) * "0" + bit_string
if K(bit_string) > K(complex_string):
complex_string = bit_string
return complex_string
这个程序本质上是遍历所有长度为 \(n\) 的比特串,跟踪复杂度最高的串。
(d) 我们知道,对每个 \(n\) 的值,必然存在一个不可压缩的串。这样的不可压缩串的柯尔莫哥洛夫复杂度大于或等于其实际长度。因此,我们的程序 \(P\) 必须返回一个不可压缩的串。然而,假设我们选择大小 \(n_k\) 使得 \(n_k \gg m\)。我们的程序 \(P(n_k)\) 将输出一个长度为 \(n_k\) 的串 \(x\),该串不可压缩,即 \(K(x) \geq n_k\)。然而,我们设计了一个用少于 \(n_k\) 比特就能输出 \(x\) 的程序。这是一个矛盾。因此,\(K\) 不可能存在。
解答来源:solutions/homework/hw06-sol.pdf · 6-7 · confidence: high
题面来源:homework/hw06.pdf · 4 · confidence: high
学习计数的唯一方法是练习、练习、再练习,因此这里是你练习的机会。虽然有许多小问,但每个小问都相当简短,因此这道题不应该花费比正常 CS70 作业题更长的时间。你不需要展示计算过程,答案请以表达式形式留下(而不是尝试计算得到具体数字)。
(a) 将 \(n\) 个 1 和 \(k\) 个 0 排成一个序列,有多少种方法?
(b) 有多少个 19 位的三进制(0,1,2)比特串,使得任意两个相邻数字都不相等?
(c) 桥牌手牌(bridge hand)是从标准 52 张牌中选出 13 张牌得到的。桥牌手牌中牌的顺序无关紧要。 i. 有多少种不同的 13 张桥牌手牌? ii. 有多少种不同的 13 张桥牌手牌不包含任何 A? iii. 有多少种不同的 13 张桥牌手牌包含全部四张 A? iv. 有多少种不同的 13 张桥牌手牌恰好包含 4 张黑桃?
(d) 两副相同的 52 张牌混合在一起,得到一叠 104 张牌。这叠 104 张牌有多少种不同的排列方式?
(e) 有多少个 99 位比特串包含的 1 比 0 多?
(f) ALABAMA 的异位词(anagram)是指对 ALABAMA 的字母重新排序得到的任意字符串,即由字母 A, L, A, B, A, M, A 以任意顺序组成的任意字符串。异位词不必是英文单词。 i. ALABAMA 有多少种不同的异位词? ii. MONTANA 有多少种不同的异位词?
(g) 在下列条件下,ABCDEF 有多少种不同的异位词? i. C 是 E 的左邻(left neighbor) ii. C 在 E 的左边(不一定是 E 的邻)
(h) 我们有 8 个球,编号从 1 到 8,以及 25 个格子(bin)。将这 8 个球分配到 25 个格子中,有多少种不同的方法?假设格子是可区分的(例如,编号从 1 到 25)。
(i) 将 8 个相同的球扔进 25 个格子,有多少种不同的方法?假设格子是可区分的(例如,编号从 1 到 25)。
(j) 将 8 个相同的球扔进 6 个格子。将这 8 个球分配到 6 个格子中且每个格子非空,有多少种不同的方法?假设格子是可区分的(例如,编号从 1 到 6)。
(k) 某班级恰好有 20 名在读学生。将这 20 名学生两两配对,使得每名学生与另一名学生配对,有多少种不同的方法?请用至少 2 种不同的方法求解。你的最终答案必须由两个不同的表达式组成。
(l) 方程 \(x_0 + x_1 + \cdots + x_k = n\) 有多少个解,其中每个 \(x\) 必须是非负整数?
(m) 方程 \(x_0 + x_1 = n\) 有多少个解,其中每个 \(x\) 必须是严格正整数?
(n) 方程 \(x_0 + x_1 + \cdots + x_k = n\) 有多少个解,其中每个 \(x\) 必须是严格正整数?
(a)(l) 经典「星与条」(stars and bars)模型。(b) 首位有 3 种选择,之后每位只有 2 种。(c) 组合数的基本应用,注意「恰好」「全部」「没有」的补集与交集处理。(d) 处理相同元素的重复排列。(e)(g.ii) 利用对称性。(f) 处理重复字母的排列。(h)(i)(j)(k) 区分球是否相同以及格子是否可区分。
(a) \(\displaystyle\binom{n+k}{k}\)
(b) 首位有 3 种选择。对之后的每位,由于不能等于前一位,只有 2 种选择。因此为 \(3 \cdot 2^{18}\)。
(c) i. 从 52 张牌中选 13 张,即 \(\displaystyle\binom{52}{13}\)。 ii. 从 48 张非 A 牌中选 13 张,即 \(\displaystyle\binom{48}{13}\)。 iii. 必须包含四张 A,因此从 48 张非 A 牌中选剩下的 9 张,即 \(\displaystyle\binom{48}{9}\)。 iv. 手牌需包含 13 张黑桃中的 4 张,以及 39 张非黑桃中的 9 张,这两个选择相互独立。因此有 \(\displaystyle\binom{13}{4}\binom{39}{9}\) 种方式。
(d) 若考虑 104! 种重排,由于每张牌出现两次,每种不同的重排被重复计数。考虑两副相同牌组的任意一种不同重排,看看它在 104 张牌各不相同的重排中出现多少次。对每一对相同的牌(如两张黑桃 A),它们之间有 2 种互换方式(因为 \(2! = 2\))。这对 52 对相同牌都成立。因此 104! 将两副相同牌组的实际重排数多计了 \(2^{52}\) 倍。因此,两副相同牌组的实际重排数为 \(\dfrac{104!}{2^{52}}\)。
(e) 解法一:包含 \(k\) 个 1 和 \(99-k\) 个 0 的 99 位比特串有 \(\displaystyle\binom{99}{k}\) 个。我们需要 \(k > 99 - k\),即 \(k \geq 50\)。因此所求总数为 \(\displaystyle\sum_{k=50}^{99}\binom{99}{k}\)。
该表达式可以进一步简化。由于 \(\displaystyle\binom{99}{k} = \binom{99}{99-k}\),我们有 \[\sum_{k=50}^{99}\binom{99}{k} = \sum_{k=50}^{99}\binom{99}{99-k} = \sum_{l=0}^{49}\binom{99}{l}\] (代换 \(l = 99 - k\))。
现在 \(\displaystyle\sum_{k=50}^{99}\binom{99}{k} + \sum_{l=0}^{49}\binom{99}{l} = \sum_{m=0}^{99}\binom{99}{m} = 2^{99}\)。因此 \(\displaystyle\sum_{k=50}^{99}\binom{99}{k} = \frac{1}{2} \cdot 2^{99} = 2^{98}\)。
解法二(对称性):由于上面的答案如此简洁,必然存在更优雅的方法。因为 99 是奇数,没有哪个 99 位比特串的 0 和 1 数量相等。令 \(A\) 为 1 比 0 多的 99 位比特串集合,\(B\) 为 0 比 1 多的 99 位比特串集合。对任意 \(x \in A\)(1 比 0 多),将 \(x\) 的所有位翻转,得到串 \(y\)(0 比 1 多),即 \(y \in B\)。这个位翻转操作建立了 \(A\) 与 \(B\) 之间的一一对应(双射)。因此 \(|A| = |B|\)。每个 99 位比特串要么在 \(A\) 中,要么在 \(B\) 中,而 99 位比特串共有 \(2^{99}\) 个,因此 \(|A| = |B| = \frac{1}{2} \cdot 2^{99}\)。所求即为 \(|A| = 2^{98}\)。
(f) i. ALABAMA:7 个不同字母的重排数为 \(7!\)。在这个 7 字母单词中,字母 A 重复了 4 次,其他字母各出现一次。因此 \(7!\) 将不同异位词的数量多计了 \(4!\) 倍(即 4 个 A 之间互换的方式数)。因此有 \(\dfrac{7!}{4!}\) 个异位词。 ii. MONTANA:在这个 7 字母单词中,字母 A 和 N 各重复了 2 次,其他字母各出现一次。因此 \(7!\) 将不同异位词的数量多计了 \(2! \times 2!\) 倍(一个 \(2!\) 来自 2 个 A 之间的互换,另一个 \(2!\) 来自 2 个 N 之间的互换)。因此有 \(\dfrac{7!}{(2!)^2}\) 个不同的异位词。
(g) i. 将 CE 视为一个新字母 X,问题转化为 5 个不同字母的重排,即 \(5!\)。 ii. 对称性:令 \(A\) 为所有 C 在 E 左侧的 ABCDEF 重排集合,\(B\) 为所有 C 在 E 右侧的 ABCDEF 重排集合。\(|A \cup B| = 6!\),\(|A \cap B| = 0\)。通过交换 C 和 E 的位置可建立 \(A\) 与 \(B\) 之间的双射。因此 \(|A| = |B| = \dfrac{6!}{2}\)。
(h) 每个球都有选择去哪个格子的自由。因此每个球有 25 种选择,8 个球可以独立做出选择。因此有 \(25^8\) 种方式。
(i) 由于对每个格子能放多少球没有限制,这就是将 \(k\) 个相同球放入 \(n\) 个可区分格子的经典问题,有 \(\displaystyle\binom{n+k-1}{k}\) 种方式。这里 \(k = 8\),\(n = 25\),因此有 \(\displaystyle\binom{32}{8}\) 种方式。
(j) 解法一:由于每个格子必须非空,先往每个格子各放一个球。此时还剩 2 个相同的球要放入 6 个可区分的格子。有两种情况:
情况 1:2 个球落入同一格子。有 6 种方式。
情况 2:2 个球落入不同格子。有 \(\displaystyle\binom{6}{2}\) 种方式选择哪两个格子。注意不是 \(6 \times 5\),因为球是相同的,没有顺序。
将两种情况的方式数相加,得到 \(\displaystyle 6 + \binom{6}{2}\) 种方式。
解法二:由于每个格子必须非空,先往每个格子各放一个球。此时还剩 2 个相同的球要放入 6 个可区分的格子。根据课堂知识(参见 Note 10),将 \(k\) 个相同球放入 \(n\) 个可区分格子的方式数为 \(\displaystyle\binom{n+k-1}{k}\)。取 \(k = 2\),\(n = 6\),得到 \(\displaystyle\binom{7}{2}\) 种方式。
练习:你能给出将 \(k\) 个相同球放入 \(n\) 个可区分格子且每个格子非空的方式数的表达式吗?
(k) 解法一:将学生从 1 到 20 编号。学生 1 有 19 种选择来确定她的搭档。令 \(i\) 为尚未被分配搭档的学生中编号最小者。那么无论 \(i\) 取何值(特别地,\(i\) 可以是 2 或 3),学生 \(i\) 有 17 种选择来确定她的搭档。下一个尚无搭档的最小编号学生有 15 种选择。以此类推,配对方式数为 \(19 \times 17 \times 15 \times \cdots \times 1 = \prod_{i=1}^{10}(2i - 1)\)。
解法二:将编号 1 到 20 的学生排成一行。共有 \(20!\) 种排列。我们将位置 \(2i-1\) 和 \(2i\) 上的学生配对,\(i\) 从 1 到 10。你应该能看到,\(20!\) 种排列没有遗漏任何可能的配对。然而,它对每种不同的配对重复计数了多次。固定任意一种特定的配对。在这种配对中,第一对在生成它的任何排列中有 10 个位置的自由,第二对有 9 个位置的自由,依此类推。此外,每对内部也有自由度:即在学生配对 \((x, y)\) 中,学生 \(x\) 可以出现在位置 \(2i-1\) 且学生 \(y\) 出现在位置 \(2i\),反之亦然。这给每对提供了 2 种方式。因此,总共这些自由度导致 \(10! \times 2^{10}\) 个 \(20!\) 中的排列产生这种特定的配对。这对每种不同的配对都成立。因此,\(20!\) 将不同配对数多计了 \(10! \times 2^{10}\) 倍。因此有 \(\dfrac{20!}{10! \cdot 2^{10}}\) 种配对。
解法三:第一步,从 20 名学生中选出一对。有 \(\displaystyle\binom{20}{2}\) 种方式。第二步,从剩下的 18 名学生中选出一对。有 \(\displaystyle\binom{18}{2}\) 种方式。继续这样选对,直到第十步,从剩下的 2 名学生中选出一对。有 \(\displaystyle\binom{2}{2}\) 种方式。将这些相乘,得到 \(\displaystyle\binom{20}{2}\binom{18}{2}\cdots\binom{2}{2}\)。然而,在 20 名学生的任意一种特定配对中,该配对可以通过上述程序以 \(10!\) 种方式生成,具体取决于哪些对在第一、第二、……、第十步被选中。因此,我们必须将上述数字除以 \(10!\) 以得到不同的配对数。因此有 \(\displaystyle\binom{20}{2}\binom{18}{2}\cdots\binom{2}{2}/10!\) 种不同的 20 名学生配对方式。
你可能想自己验证一下,这三种方法产生的整数相同,尽管它们的表达式看起来非常不同。
(l) \(\displaystyle\binom{n+k}{k}\)。这就是将 \(n\) 个不可区分的球放入 \(k+1\) 个可区分格子的问题(星与条)。方程的解与由 \(n\) 个 1 和 \(k\) 个加号组成的序列之间存在双射:\(x_0\) 是第一个加号之前的 1 的个数,\(x_1\) 是第一个和第二个加号之间的 1 的个数,依此类推。关键思想是:如果两个集合之间存在双射,它们的大小必须相同,因此计数其中一个的元素个数就能告诉我们另一个有多少个。注意这与 (a) 的答案完全相同——确保你理解为什么!
(m) \(n - 1\)。这里最容易直接列举解。\(x_0\) 可以取值 \(1, 2, \ldots, n-1\),这唯一确定了 \(x_1\) 的值。因此有 \(n - 1\) 种方式。但这只是下面更一般问题的一个特例。
(n) \(\displaystyle\binom{(n-(k+1))+k}{k} = \binom{n-1}{k}\)。这就是将 \(n-(k+1)\) 个不可区分的球放入 \(k+1\) 个可区分格子的问题。通过从所有 \(k+1\) 个变量中减去 1,并从所需总数中减去 \(k+1\),我们将其转化为与前一个问题同形式的问题。一旦得到该问题的解,逆向操作,给所有非负变量加 1,就得到了正变量。
解答来源:solutions/homework/hw06-sol.pdf · 8-11 · confidence: high
题面来源:homework/hw06.pdf · 5 · confidence: high
设 \(p\) 为素数,\(n\) 为正整数。我们有 \(n\) 种不同颜色的珠子,其中任意两个同色珠子不可区分。
(a) 将 \(p\) 个珠子穿到一根线上。用至多 \(n\) 种不同颜色构造这样一个 \(p\) 珠序列,有多少种不同的方法?
(b) 线上有多少个 \(p\) 珠序列使用了至少两种颜色?
(c) 现在将线的两端系在一起,形成一个手链(wristband)。如果一条手链上的颜色序列可以通过旋转另一条手链上的珠子得到,则认为这两条手链等价。(例如,若有 \(n = 3\) 种颜色,红(R)、绿(G)、蓝(B),则长度为 \(p = 5\) 的项链 RGGBG、GGBGR、GBGRG、BGRGG 和 GRGGB 都是等价的,因为它们都是彼此的旋转版本。)
现在有多少个不等价的手链?同样,这 \(p\) 个珠子不能全是同一种颜色。(答案应是 \(n\) 和 \(p\) 的简单函数。)
[提示:思考将手链上的所有珠子旋转到另一个位置会产生相同的手链这一事实。]
(d) 利用 (c) 的结论证明费马小定理(Fermat's little theorem)。
(c) 由于 \(p\) 是素数,旋转少于 \(p\) 位总会产生一个新的序列(没有非平凡的旋转对称性)。每个非单色模式在旋转下恰好产生 \(p\) 个等价序列。 (d) (c) 的答案必须是整数,因为它计数了某种对象的数量。由此推出整除性。
(a) \(n^p\)。对每个珠子,其颜色有 \(n\) 种可能。因此,由第一计数原理,有 \(n^p\) 个不同的序列。
(b) \(n^p - n\)。单色序列有 \(n\) 个。
(c) 由于 \(p\) 是素数,将任何序列旋转少于 \(p\) 位都会产生一个新序列。也就是说,不存在小于 \(p\) 的数 \(x\),使得将珠子旋转 \(x\) 位后图案看起来相同。因此,每个具有多于一种颜色的图案都可以旋转形成 \(p-1\) 个其他图案。因此,与某个珠序列等价的模式总数为 \(p\)。因此,不等价模式的总数为 \((n^p - n)/p\)。
(d) \((n^p - n)/p\) 必须是整数,因为根据前一部分,它是某个计数对象的数量。因此 \(n^p - n\) 必须能被 \(p\) 整除,即 \(n^p \equiv n \pmod{p}\),这就是费马小定理。
解答来源:solutions/homework/hw06-sol.pdf · 12-13 · confidence: high
题面来源:homework/hw06.pdf · 6 · confidence: high
homework/hw06.pdfsolutions/homework/hw06-sol.pdf