知识焦点
先建立概念地图
- polynomials
- GF(p)
- Fermat's Little Theorem
- Lagrange interpolation
- Chinese Remainder Theorem
- secret sharing
- error-correcting codes
- Berlekamp-Welch
CS70 · 作业 05
本课程作业涵盖有限域 GF(p) 上的多项式等价性与费马小定理、拉格朗日插值与单点插值、中国剩余定理(CRT)及其与拉格朗日插值的关系、秘密共享方案(含分层秘密共享与含间谍场景)、纠错码(擦除错误与一般错误)以及多项式编码中的错误纠正(Berlekamp-Welch 算法)。
知识焦点
建议顺序
先完整作答,再按需展开提示;最后才展开官方参考解答并逐步核对证明与计算。
本地来源
题面与解答均由本地一手资料整理:homework/hw05.pdf、solutions/homework/hw05-sol.pdf
本地一手资料完整提取 · 作业
本节按本地一手资料完整整理,共 8 道大题。本地官方解答已收录 7/8 道并默认折叠;其余题目会明确标注无本地官方解答。
homework/hw05.pdf、solutions/homework/hw05-sol.pdf在开始撰写最终作业提交之前,简要说明你是如何完成这份作业的。你还与谁一起完成了作业?列出姓名和邮箱地址。(如果是 homework party,只需描述小组情况即可。)
本题无数学内容,仅要求你在提交时说明协作情况。请如实填写合作人员的姓名与邮箱,或描述小组分工。
本地资料未提供这道题的官方解答;页面只保留题面与非答案式提示。
题面来源:homework/hw05.pdf · 1 · confidence: high
本题是关于系数在 \(\mathrm{GF}(p)\) 中(其中 p 为某个自然数中的素数)的多项式。我们称两个这样的多项式 f 和 g 是等价的(equivalent),如果对于每个 \(x \in \mathrm{GF}(p)\),都有 \(f(x)=g(x)\)。
Note 7 Note 8
(a) 利用费马小定理(Fermat's Little Theorem),找出一个次数严格小于 5 的多项式,使其在 \(\mathrm{GF}(5)\) 上等价于 \(f(x)=x^5\);然后找出一个次数严格小于 11 的多项式,使其在 \(\mathrm{GF}(11)\) 上等价于 \(g(x)=4x^{70}+9x^{11}+70\)。
(b) 在 \(\mathrm{GF}(p)\) 中,证明:当 f(x) 的次数 ≥ p 时,它等价于某个次数小于 p 的多项式 f̃(x)。
(a) 回顾费马小定理的另一种形式:对任意整数 a,有 aᵖ ≡ a (mod p)。考虑如何将高次项降次。
(b) 思路一:对每个指数 ≥ p 的项反复应用费马小定理降次,直到所有指数都小于 p。思路二:考虑拉格朗日插值,构造一个次数至多为 p−1 的多项式经过 (0,f(0)), (1,f(1)), …, (p−1,f(p−1)) 这些点。
(a) 费马小定理指出,对于任意非零整数 a 和任意素数 p,有 aᵖ⁻¹ ≡ 1 (mod p)。我们可以在两边同乘以 a,因此该定理等价于说 aᵖ ≡ a (mod p);注意即使当 a = 0 时也成立,因为此时我们有 0ᵖ ≡ 0 (mod p)。
题目要求找一个多项式 f̃(x),不同于 f(x),但满足对任意整数 a 都有 f̃(a) ≡ a⁵ (mod 5)。直接应用定理,f̃(x) = x 即可。
对于 g(x) = 4x⁷⁰ + 9x¹¹ + 70 模 11,由于 x¹¹ ≡ x (mod 11),我们可以设 ḡ(x) = 4x¹⁰ + 9x + 4。
(b) 证明一(使用费马小定理):作为热身,设 d ≥ p;我们来找一个等价于 xᵈ 的多项式。对于任意整数 a,我们知道
aᵈ = aᵈ⁻ᵖ · aᵖ ≡ aᵈ⁻ᵖ · a ≡ aᵈ⁻ᵖ⁺¹ (mod p)
换句话说,xᵈ 等价于多项式 xᵈ⁻⁽ᵖ⁻¹⁾。如果 d − (p−1) ≥ p,我们可以用同样的方法证明 xᵈ 等价于 xᵈ⁻²⁽ᵖ⁻¹⁾。由于每次减去 p−1,序列 d, d−(p−1), d−2(p−1), … 最终必然小于 p。现在,如果 f(x) 是任意次数 ≥ p 的多项式,我们可以对每个出现的 xᵏ(其中 k ≥ p)应用同样的技巧。
证明二(使用拉格朗日插值):设 f(x) 的次数 ≥ p。由拉格朗日插值,存在唯一的次数至多为 p−1 的多项式 f̃(x) 经过点 (0, f(0)), (1, f(1)), (2, f(2)), …, (p−1, f(p−1)),我们这样设计它恰好使其等价于 f(x)。
解答来源:solutions/homework/hw05-sol.pdf · 1 · confidence: high
题面来源:homework/hw05.pdf · 1 · confidence: high
假设我们有一个多项式 \(f(x) = x^k + c_{k-1}x^{k-1} + \cdots + c_2x^2 + c_1x + c_0\)。
(a) 能否通过 \(k\) 个点确定 \(f(x)\)?如果可以,给出一组输入 \(x_0, x_1, \ldots, x_{k-1}\),使得知道点 \((x_0, f(x_0)), (x_1, f(x_1)), \ldots, (x_{k-1}, f(x_{k-1}))\) 能够唯一确定 \(f(x)\),并说明如何从这些点确定 \(f(x)\)。如果不能,请证明为什么不可能。
(b) 现在假设每个系数都是满足 \(0 \leq c_i < 100\)(对所有 \(i \in [0, k-1]\))的整数。能否通过一个点确定 \(f(x)\)?如果可以,给出一个输入 \(x^*\),使得知道点 \((x^*, f(x^*))\) 能够唯一确定 \(f(x)\),并说明如何从该点确定 \(f(x)\)。如果不能,请证明为什么不可能。
(a) 注意首项系数为 1,因此只需确定其余 \(k\) 个系数。考虑如何利用已知点构造一个次数更低的多项式。
(b) 将每个系数表示为两位十进制数的形式,思考在哪个基数下求值可以分离出各个数位。
(a) 可以。由于首项系数为 1,我们只需找到剩下的 \(k\) 个系数 \(c_0, c_1, \ldots, c_{k-1}\) 即可确定 \(f(x)\)。这可以通过任意 \(k\) 个不同的点来完成。
例如,假设我们知道点 \((0, f(0)), (1, f(1)), \ldots, (k-1, f(k-1))\)。然后我们可以写出次数为 \(k-1\) 的多项式 \[g(x) = c_{k-1}x^{k-1} + \cdots + c_2x^2 + c_1x + c_0 = f(x) - x^k\] 该多项式可以通过对点 \((0, f(0)), (1, f(1) - 1), (2, f(2) - 2^k), \ldots, (k-1, f(k-1) - (k-1)^k)\) 进行拉格朗日插值来确定,从而唯一地得到我们想要的系数 \(c_0, c_1, \ldots, c_{k-1}\)。
(b) 可以。我们可以将每个非负的两位整数 \(c_i\) 表示为 \(c_i = 10d_{2i+1} + d_{2i}\),其中数字 \(d_i \in [0,9]\)。
取 \(x^* = 100\), \[f(100) = 100^k + c_{k-1}100^{k-1} + \cdots + c_2 \cdot 100^2 + c_1 \cdot 100 + c_0\] \[= 10^{2k} + (10d_{2k-1} + d_{2k-2})10^{2k-2} + \cdots + (10d_5 + d_4)10^4 + (10d_3 + d_2)10^2 + (10d_1 + d_0)\] \[= 10^{2k} + 10^{2k-1}d_{2k-1} + 10^{2k-2}d_{2k-2} + \cdots + 10^5d_5 + 10^4d_4 + 10^3d_3 + 10^2d_2 + 10d_1 + d_0\]
因此,\(f(100)\) 的最右边 \(2k-1\) 个数字,从右到左依次是 \(d_0, d_1, \ldots, d_{2k-1}\);然后我们可以确定想要的系数 \(c_i = 10d_{2i+1} + d_{2i}\)。
解答来源:solutions/homework/hw05-sol.pdf · 2 · confidence: high
题面来源:homework/hw05.pdf · 1-2 · confidence: high
设 \(n_1, \ldots, n_k\) 两两互素,即对所有 \(i \neq j\),\(n_i\) 与 \(n_j\) 互素。中国剩余定理(CRT,Chinese Remainder Theorem)告诉我们,以下同余方程组: \[x \equiv a_1 \pmod{n_1} \tag{1}\] \[x \equiv a_2 \pmod{n_2} \tag{2}\] \[\cdots\] \[x \equiv a_k \pmod{n_k} \tag{k}\] 存在解,且所有解在模 \(n_1n_2\cdots n_k\) 下等价。在本题中,(a)-(c) 部分将引导我们证明中国剩余定理。然后我们将使用 CRT 重新审视拉格朗日插值。
(a) 我们从证明 \(k=2\) 的情况开始:证明我们总能找到一个整数 \(x_1\) 满足 (1) 和 (2),其中 \(a_1 = 1, a_2 = 0\)。类似地,证明我们总能找到一个整数 \(x_2\) 满足 (1) 和 (2),其中 \(a_1 = 0, a_2 = 1\)。
(b) 利用 (a) 证明:对于任意的 \(a_1, a_2\),我们总能找到 (1) 和 (2) 的至少一个解。此外,证明所有可能的解在模 \(n_1n_2\) 下等价。
(c) 现在我们可以处理任意 \(k\) 的情况:利用 (b) 证明 (1)-(k) 存在解 \(x\),且该解在模 \(n_1n_2\cdots n_k\) 下唯一。
(d) 对于多项式 \(p_1(x), p_2(x)\) 和 \(q(x)\),如果 \(p_1(x) - p_2(x)\) 具有 \(q(x) \times m(x)\) 的形式(其中 \(m(x)\) 是某个多项式),则称 \(p_1(x) \equiv p_2(x) \pmod{q(x)}\)。
定义多项式 \(x-a\) 和 \(x-b\) 互素,如果它们没有次数为 1 的公因式。假设在用多项式替换 \(x, a_i\) 和 \(n_i\) 后(使用刚才给出的互素多项式的定义),CRT 仍然成立,证明同余方程组 \[p(x) \equiv y_1 \pmod{(x - x_1)} \tag{1'}\] \[p(x) \equiv y_2 \pmod{(x - x_2)} \tag{2'}\] \[\cdots\] \[p(x) \equiv y_k \pmod{(x - x_k)} \tag{k'}\] 在 \(x_i\) 两两不同时,有唯一解(模 \((x-x_1)\cdots(x-x_k)\))。这与拉格朗日插值有什么联系?
提示:为了证明唯一解的存在性,你可以利用 CRT 在满足某些性质时有唯一解这一事实。
(a) 利用贝祖等式(Bézout's identity):由于 \(\gcd(n_1, n_2) = 1\),存在整数 \(k_1, k_2\) 使得 \(k_1n_1 + k_2n_2 = 1\)。
(d) 验证当 \(x_i \neq x_j\) 时,\((x-x_i)\) 与 \((x-x_j)\) 没有次数为 1 的公因式,从而它们互素。然后思考同余式 \(p(x) \equiv y_i \pmod{(x-x_i)}\) 实际上意味着什么。
(a) 由于 \(\gcd(n_1, n_2) = 1\),存在整数 \(k_1, k_2\) 使得 \(1 = k_1n_1 + k_2n_2\)。令 \(x_1 = k_2n_2 = 1 - k_1n_1\) 且 \(x_2 = k_1n_1 = 1 - k_2n_2\),我们得到两个想要的解。
(b) 利用我们在 (a) 中找到的 \(x_1\) 和 \(x_2\),我们证明 \(a_1x_1 + a_2x_2\)(模 \(n_1n_2\))是想要的同余式的解: \[a_1x_1 + a_2x_2 \equiv a_1 \cdot 1 + a_2 \cdot 0 \equiv a_1 \pmod{n_1}\] \[a_1x_1 + a_2x_2 \equiv a_1 \cdot 0 + a_2 \cdot 1 \equiv a_2 \pmod{n_2}\] 该解也是唯一的。假设有两个不同的解 \(x = c\) 和 \(x = c'\),它们都满足 \(x \equiv a_1 \pmod{n_1}\) 和 \(x \equiv a_2 \pmod{n_2}\)。这将给出 \(c \equiv c' \pmod{n_1}\) 和 \(c \equiv c' \pmod{n_2}\),说明 \((c - c')\) 能被 \(n_1\) 和 \(n_2\) 整除。由于 \(n_1\) 和 \(n_2\) 互素,\(\gcd(n_1, n_2) = 1\),所以 \((c - c')\) 能被 \(n_1n_2\) 整除。用模形式写出即得 \(c \equiv c' \pmod{n_1n_2}\)。因此,所有解在模 \(n_1n_2\) 下是唯一的。
(c) 我们对 \(k\) 使用归纳法。(b) 处理了基础情况 \(k=2\)。对于归纳假设,假设对于 \(k \leq l\),方程组 (1)-(k) 有唯一解 \(a\)(模 \(n_1\cdots n_k\))。现在考虑 \(k = l+1\),我们将方程 \(x \equiv a_{l+1} \pmod{n_{l+1}}\) 加入方程组,得到 \[x \equiv a \pmod{n_1\cdots n_l}\] \[x \equiv a_{l+1} \pmod{n_{l+1}}\] 由于 \(n_i\) 两两互素,\(n_1n_2\cdots n_l\) 和 \(n_{l+1}\) 互素。(b) 告诉我们存在唯一解 \(a'\)(模 \(n_1\cdots n_l n_{l+1}\))。我们得出结论:\(a'\) 是 (1)-(l+1) 的唯一解(模 \(n_1n_2\cdots n_l n_{l+1}\))。
(d) 我们只需验证当 \(x_i \neq x_j\) 时,\(q_i(x) = (x - x_i)\) 和 \(q_j(x) = (x - x_j)\) 互素,即它们没有次数为 1 的公因式。如果 \(d_i(x) = a_ix + b_i\) 是 \(q_i(x)\) 的因式,则 \(q_i(x) = q'(x)(a_ix + b_i)\) 对某个多项式 \(q'(x)\) 成立。但由于 \(q_i(x)\) 次数为 1,\(q'(x)\) 必须次数为 0 从而为常数,所以 \(d_i(x)\) 必须是 \(q_i(x)\) 的常数倍。类似地,\(q_j(x)\) 的任何次数为 1 的因式 \(d_j\) 必须是 \(q_j(x)\) 的常数倍,且如果 \(x_i \neq x_j\),则这些常数倍没有重叠,所以 \(q_i(x)\) 和 \(q_j(x)\) 互素。
由 (d) 的结果,同余式 (1')-(k') 表明我们正在寻找一个多项式 \(p(x)\) 使得 \(p(x_i) = y_i\)。然后 CRT 建立了 \(p(x)\) 的存在性,且它在模一个次数为 \(k\) 的多项式下唯一。也就是说,如果 \(p(x)\) 的次数至多为 \(k-1\),则 \(p(x)\) 唯一。拉格朗日插值找到了 \(p(x)\)。
解答来源:solutions/homework/hw05-sol.pdf · 3-4 · confidence: high
题面来源:homework/hw05.pdf · 2-3 · confidence: high
Trust No One
甘道夫(Gandalf)召集了一支由九名成员组成的护戒远征队,负责将至尊魔戒运往末日火山的烈焰中毁灭:五名人类(humans)、两名霍比特人(hobbits)、一名精灵(elf)和一名矮人(dwarf)。这枚魔戒拥有强大的力量,在漫长而危险的旅途中或许能为远征队所用。然而,不幸的是,使用其巨大的力量最终会腐蚀使用者,因此除非在最危急的情况下,绝不能使用它。为了防止这种可能性,甘道夫希望将使用说明作为秘密对远征队成员保密。只有当远征队中有足够多的成员在场并同意使用时,该秘密才能被揭示。
甘道夫聘请你设计一个能够实现此目标的秘密共享(secret sharing)方案,要点如下:
有一支队伍,由五名人类、两名霍比特人、一名精灵和一名矮人组成,以及一条秘密信息;若没有足够多的成员达成一致,则该秘密信息必须对所有人保密。
如果一个群体满足以下两个条件,则可以解锁魔戒的秘密: 1. 至少包含来自两个不同种族(people classes)的成员; 2. 至少有一个种族被完全代表(fully represented,即该种族的所有成员都在场)。
示例:仅五名人类同意使用魔戒不足以获知使用说明;一名霍比特人和四名人类也不够。然而,全部五名人类外加一名霍比特人同意就足够了。两名霍比特人和矮人同意也足够。
请你帮助甘道夫设计这样一个秘密共享方案。
本题需要设计一个满足双重条件(跨种族 + 至少一个种族全员到场)的访问结构。可以思考如何将秘密拆分为两个独立的子秘密:一个要求某个种族全员达成(unanimity),另一个要求至少两个不同种族达成(multi-people),再通过一个一次多项式将这两个子秘密组合回最终秘密。另一种思路是考虑单多项式方案下各成员持有的点数分配,使得任何不满足条件的群体持有的点数不足以完成插值。
(以下为官方解答的翻译,保留两种解法。)
解法一(分层秘密共享)
该秘密由两部分组成:一个全体一致秘密 \(U\) 和一个多种族秘密 \(M\)。\(U\) 确保至少有一个种族的所有成员同意,而 \(M\) 确保至少有两个不同种族的成员同意。
整体思路是:魔戒的秘密只有在全体一致条件和多种族条件均被满足时才能获得。我们将原始秘密编码在一个一次多项式 \(R(x)\) 中,该多项式由两个值 \(U\) 和 \(M\) 唯一确定;\(U\) 和 \(M\) 各自又分别被编码为独立的多项式秘密,分别在满足全体一致条件和多种族条件时才能被恢复。一旦 \(U\) 和 \(M\) 都被恢复,就可以组合它们来揭示原始秘密,因为它们分别是该一次多项式 \(R(x)\) 上的两个点,而 \(R(x)\) 在 \(y\) 轴上的截距包含魔戒的秘密。
下面分别详述 \(U\) 和 \(M\)。
全体一致秘密 \(U\):为每个种族分别创建一个独立的秘密,要求该种族的所有成员齐心协力才能揭示该秘密。例如,每个人类持有一个四次多项式(degree-4 polynomial)上的不同点,每个霍比特人持有一个一次多项式上的不同点。当一个种族的所有成员聚集在一起时,他们将揭示 \(U\)(例如编码为这些多项式中每一个的 \(y\) 轴截距)。注意,精灵和矮人由于各自是所属种族的唯一成员,因此他们已经知道 \(U\)。
多种族秘密 \(M\):创建一个一次多项式 \(P_m(x)\),并将一个点发给每个种族的成员。例如,每个霍比特人得到 \(P_m(1)\),精灵得到 \(P_m(2)\),每个人类得到 \(P_m(3)\),矮人得到 \(P_m(4)\)。这样,只要来自任意两个不同种族的成员达成一致,就可以揭示 \(M\)(例如编码为 \(P_m(x)\) 的 \(y\) 轴截距)。
一旦 \(U\) 和 \(M\) 各自已知,就可以组合它们来确定最终秘密。\(U\) 和 \(M\) 允许我们唯一地确定 \(R(x)\),从而得到 \(R(0)\),即魔戒的秘密。
该方案是分层秘密共享(hierarchical secret sharing)的一个示例。下面给出一个具体实例。
示例:假设秘密 \(s = 4\),\(M = 3\),\(U = 2\)。此后可以在 \(\mathrm{GF}(7)\) 中运算,因为 \(s < 7\) 且 \(n < 7\)(\(n\) 为持有秘密份额的人数)。
首先需要构造一个一次多项式 \(R(x)\),使得 \(R(0) = s = 4\),\(R(1) = M = 3\),\(R(2) = U = 2\)。通过观察可得 \(R(x) = 6x + 4\) 满足这些性质(例如 \(R(1) = 6 \cdot 1 + 4 = 10 \equiv 3 \pmod{7}\))。
接下来创建多种族秘密 \(M\)。选择一次多项式 \(P_m(x) = x + 3\),并告知每个霍比特人 \(P_m(1) = 4\),精灵 \(P_m(2) = 5\),每个人类 \(P_m(3) = 6\),矮人 \(P_m(4) = 7 \equiv 0\)。现在,来自任意两个不同种族的任意两名成员可以通过插值确定 \(P_m(x)\) 从而得到 \(P_m(0)\)。
在创建全体一致秘密 \(U\) 时,首先注意到矮人和精灵将直接被告知 \(U\),因为他们是各自种族的唯一成员。另一方面,霍比特人各自持有一次多项式 \(P_{\text{hobbits}}(x)\) 上的一个点。假设 \(P_{\text{hobbits}}(x) = 2x + 2\),则第一个霍比特人收到 \(P_{\text{hobbits}}(1) = 4\),第二个霍比特人收到 \(P_{\text{hobbits}}(2) = 4 + 2 = 6\)。当他们用这些值进行插值时,将发现原始多项式,从而得到 \(P_{\text{hobbits}}(0) = U = 2\)。人类将拥有一个类似的秘密,但使用一个四次多项式。
现在假设两名霍比特人和一名人类聚集在一起。两名霍比特人协作,如上所述确定 \(U\)。他们三人还知道 \(P_m(3) = 6\) 和 \(P_m(1) = 4\),从中可以求出 \(P_m(x)\) 从而得到 \(P_m(0) = M = 3\)。现在他们已经掌握了 \(U\) 和 \(M\),可以通过插值求出 \(R(x)\) 从而得到 \(R(0) = s = 4\)。
解法二(单多项式方案)
或者,可以构造一个八次多项式(需要 9 个点进行插值),并向每个人类分发 1 个点、向每个霍比特人分发 4 个点、向精灵分发 8 个点、向矮人分发 8 个点。可以看到,如果所有人类达成一致,他们还需要另外 4 个点才能成功插值,而所有其他种族的成员每人至少被分配了 4 个点。此外,其他每个种族合计拥有 8 个点,这意味着如果所有霍比特人、精灵或矮人达成一致,他们只需要额外一个点,而队伍中来自其他种族的任何成员都可以提供该点。另一方面,不满足条件的群体所能获得的最大点数为 8,即来自一名霍比特人和除一人之外的所有人类组成的群体。这不足以完成插值,因此该方案满足要求。
解答来源:solutions/homework/hw05-sol.pdf · 4-6 · confidence: high
题面来源:homework/hw05.pdf · 2-3 · confidence: high
一位军官把一封信(密码是一个数字)锁在她的保险箱里。以防她在战斗中失联,她决定把密码分享给她的部队。然而,所有人都知道部队里有 3 个间谍,但除了这三个间谍自己之外,没有人知道他们是谁。这 3 个间谍可以互相串通,他们要么撒谎使得人们无法打开保险箱,要么如果可能的话就自己去打开保险箱。因此,军官希望设计一个分享密码的方案,满足以下条件:
当任意 \(N\) 个人聚在一起时,即使其中有间谍,也保证能打开保险箱。
仅凭 3 个间谍自己,一定无法打开保险箱。
请帮助军官设计一个分享密码的方案。方案是什么?最小的 \(N\) 是多少?展示你的推理,论证为什么你的方案可行,以及为什么任何更小的 \(N\) 都不行。(部队只有一次打开保险箱的机会;如果失败,保险箱会自毁。)
设 \(P(x)\) 为 \(\mathrm{GF}(p)\) 上的三次多项式(\(p\) 为足够大的素数)。10 个人编号 \(i = 1, \dots, 10\),每人持有 \((i, P(i))\)。任选 3 个作为间谍,其值被替换为错误值;其余 7 个点保持正确。由 Berlekamp-Welch 算法可唯一恢复 \(P(x)\)。
来源:solutions/homework/hw05-sol.pdf · 7
思考多项式秘密共享(基于多项式求值)与纠错码(基于多项式求值后再恢复该多项式)在结构上有多么相似——它们可以自然地结合起来。
把 \(3\) 个间谍视作 \(3\) 个一般错误(general errors)。回忆:对于次数为 \(d\) 的多项式,要纠正 \(k\) 个一般错误,一共需要多少个符号(即多少人)?同时注意:若多项式次数太低,\(3\) 个间谍自己手中的点就可能唯一确定该多项式,从而直接得到 \(P(0)\)。
关键洞察是:基于多项式的秘密共享和基于多项式的纠错码,都建立在“对一个底层多项式在许多点上求值,再试图恢复该多项式”这一共同基础之上,因此可以自然地结合起来。
设密码为 \(s\)。军官可以构造一个多项式 \(P(x)\) 使得 \(s = P(0)\),并把 \((i, P(i))\) 分享给部队里的第 \(i\) 个人。接下来问题是:\(P(x)\) 的次数应该是多少,以及最小的 \(N\) 是多少?
首先,多项式次数 \(d\) 不能小于 \(3\)。因为当 \(d < 3\) 时,\(3\) 个间谍手中的 \(3\) 个点就足以唯一确定 \(P(x)\)(次数 \(< 3\) 的多项式至多有 \(2\) 次,\(3\) 个点可唯一确定它),从而直接得到 \(P(0) = s\)。因此 \(n\)(码字长度,即人数)至少为 \(4\)。
取一个次数为 \(3\) 的多项式 \(P(x)\) 满足 \(s = P(0)\)。现在把 \(3\) 个间谍视作 \(3\) 个一般错误。此时最小的 \(N = 10\),因为 \(n\)(消息长度,即多项式次数加一)至少为 \(4\),而一般错误个数 \(k = 3\),于是“码字”长度为 \(n + 2k = 4 + 2 \cdot 3 = 10\)(在我们的场景里就是人数)。即使这 \(3\) 个间谍就在那 \(10\) 个人当中,并且在自己对应的数值上撒谎,这 \(10\) 个人仍然可以通过 Berlekamp-Welch 算法纠正 \(k = 3\) 个一般错误,从而求出正确的 \(P(x)\),进而得到 \(P(0) = s\)。
为什么更小的 \(N\) 不行:若 \(N \le 9\),则总人数不足以容纳“\(4\) 个消息符号 + \(2 \cdot 3 = 6\) 个纠错冗余”,Berlekamp-Welch 算法无法保证纠正 \(3\) 个一般错误;同时,若把次数降到 \(3\) 以下,则 \(3\) 个间谍自己就能唯一确定多项式。因此最小的 \(N\) 是 \(10\)。
替代方案:另一种可行的做法是取 \(P(x)\) 的次数为 \(N - 1\),并额外加入 \(6\) 个公开点来处理来自间谍的 \(3\) 个一般错误。也就是说,除了各自的 \((i, P(i))\) 之外,每个人还知道另外 \(6\) 个点的取值 \((t+1, P(t+1)), (t+2, P(t+2)), \dots, (t+6, P(t+6))\),其中 \(t\) 为部队人数。间谍总共能拿到 \(3 + 6 = 9\) 个点,因此次数 \(N-1\) 必须至少为 \(9\),才能防止间谍仅凭自己手中的点打开保险箱。故最小的 \(N\) 仍为 \(10\)。
解答来源:solutions/homework/hw05-sol.pdf · 6-7 · confidence: high
题面来源:homework/hw05.pdf · 6 · confidence: high
注意 9
(a) 回顾课堂上的擦除错误纠错码:它通过总共发送 \(n+k\) 个包(其中 \(n\) 是原始消息中的包数)来保护最多 \(k\) 个包丢失。通常丢失的包数并不是某个固定的 \(k\),而是发送包数的一个分数。假设我们希望保护丢失包数占比为 \(\alpha\)(其中 \(0<\alpha<1\))。作为 \(n\) 和 \(\alpha\) 的函数,我们至少需要发送多少个包?
(b) 将 (a) 的做法推广到一般错误的情形。
(a) 擦除错误下,只要收到足够多的包就能恢复多项式。设总共发送 \(m\) 个包,考虑最坏情况下至多丢失 \(\alpha m\) 个包,那么至少需要收到 \(n\) 个包才能重构该多项式。
(b) 一般错误下,每个错误会同时消耗“位置”与“数值”两个未知量,因此冗余开销大约是擦除错误的两倍。
(a) 设我们总共发送 \(m\) 个包(\(m\) 待定)。由于至多丢失占比 \(\alpha\) 的包,因此收到的包数至少为 \((1-\alpha)m\)。但为了重构传输所用的多项式,我们至少需要 \(n\) 个包。因此只要 \((1-\alpha)m\ge n\) 就足够了,整理可得 \(m\ge n/(1-\alpha)\)。
(b) 设我们总共发送 \(m=n+2k\) 个包,其中 \(k\) 是我们能防范的错误数。被损坏的包数至多为 \(\alpha m\),因此需要 \(k\ge \alpha m\)。于是 \(m\ge n+2\alpha m\),整理可得 \(m\ge n/(1-2\alpha)\)。
注意:当 \(\alpha\ge 1/2\) 时,恢复是不可能的。
解答来源:solutions/homework/hw05-sol.pdf · 7 · confidence: high
题面来源:homework/hw05.pdf · 3 · confidence: high
注意 8 注意 9
(a) Alice 决定不再把消息编码为一个多项式的取值,而是把消息编码为一个 2 次多项式 \(P(x)\) 的系数。对于她的消息 \([m_1,m_2,m_3]\),她构造多项式 \(P(x)=m_1x^2+m_2x+m_3\),并把五个包 \((0,P(0))\)、\((1,P(1))\)、\((2,P(2))\)、\((3,P(3))\)、\((4,P(4))\) 发送给 Bob。然而 Eve 在某个包到达 Bob 之前改变了它的 \(y\) 值。如果 Bob 收到
\[(0,1),\ (1,3),\ (2,0),\ (3,1),\ (4,0)\]
并且知道 Alice 的编码方案以及 Eve 改变了其中一个包,他能否恢复原始消息?如果可以,求出该消息以及 Eve 改变的包的 \(x\) 值;如果不能,请说明理由。运算在模 7 下进行。
(b) Bob 厌倦了解码 2 次多项式。他说服 Alice 把消息编码在一个 1 次多项式上。Alice 为了安全起见,尽管多项式只是 1 次的,她仍然发送 5 个点。她确保选择的消息能够被编码在一个 1 次多项式上。然而 Eve 改变了其中两个包。Bob 收到
\[(0,5),\ (1,7),\ (2,x),\ (3,5),\ (4,0)\]
如果 Alice 实际发送的是 \((0,5)\)、\((1,7)\)、\((2,9)\)、\((3,-2)\)、\((4,0)\),对于哪些 \(x\) 的取值,Bob 无法唯一确定 Alice 的消息?假设 Bob 知道 Eve 改变了两个包。运算在模 13 下进行。
(c) Alice 想向 Bob 发送一个长度为 9 的消息。她有两个可用的通信信道:信道 X 与信道 Y。当 \(n\) 个包被送入信道 X 时,只有 6 个包被送达(任意选取)。类似地,信道 Y 也只会送达 6 个包(任意选取),但它还会篡改(改变值)所送达包中的一个。每个信道只有在至少发送 10 个包时才能工作。分别使用这两个各一次,给出一种 Alice 向 Bob 发送消息的方式,使得 Bob 总能重建该消息。
(a) 使用 Berlekamp-Welch 算法:令 \(Q(x)=P(x)E(x)\),其中 \(E(x)\) 是 1 次错误定位多项式,\(Q(x)\) 是 3 次多项式。利用 5 个点建立线性方程组并求解。
(b) 由于 Bob 知道有 2 个错误,剩下的 3 个点仍在 Alice 的 1 次多项式上。当存在两条不同的 1 次多项式都能穿过所接收 5 个点中的 3 个点时,Bob 就无法唯一确定消息。
(c) 信道 X 无错误但只送达 6 个包,因此可编码一个 5 次多项式;信道 Y 有 1 个一般错误且只送达 6 个包,因此可编码一个 3 次多项式。把长度为 9 的消息拆分到两条信道上。
(a) 我们可以使用 Berlekamp-Welch 算法。令 \(Q(x)=P(x)E(x)\)。由于至多 1 个错误,\(E(x)\) 为 1 次;由于 \(P(x)\) 为 2 次,\(Q(x)\) 为 3 次。列线性方程组并求解:
\[d=-e\] \[a+b+c+d=3-3e\] \[a+4b+2c+d=0\] \[6a+2b+3c+d=3-e\] \[a+2b+4c+d=0\]
解得 \(Q(x)=x^3+5x^2+5x+4\),\(E(x)=x-3\)。将 \(Q(x)\) 除以 \(E(x)\) 得 \(P(x)=x^2+x+1\)。因此 Alice 的消息为 \(m_1=1,m_2=1,m_3=1\),Eve 改变的包的 \(x\) 值为 3。
另解:由于有 5 个点,我们需要找到一个穿过其中 4 个点的 2 次多项式,未被穿过的那个点就是 Eve 改变的包。取点 \((1,3)\)、\((2,0)\)、\((4,0)\),该多项式在 \(x=2\) 和 \(x=4\) 处为 0,因此为 \(k(x-2)(x-4)=k(x^2+x+1)\pmod 7\)。代入 \((1,3)\) 得 \(k\equiv 1\),故多项式为 \(x^2+x+1\)。代入 \(x=0\) 得 1,符合;代入 \(x=3\) 得 \(13\equiv 6\not\equiv 1\),故 \(x=3\) 是被改变的包。Alice 的原始消息为 \(m_1=1,m_2=1,m_3=1\)。
(b) 由于 Bob 知道 Eve 改变了 2 个点,剩下的 3 个点仍在 Alice 用来编码消息的 1 次多项式上。若 Bob 能找到一个穿过其所接收点中至少 3 个点的 1 次多项式,他就能唯一恢复 Eve 的消息。唯一无法唯一确定 Alice 消息的情况是:有两条不同的 1 次多项式都能穿过所接收 5 个点中的 3 个点。
点 \((0,5)\)、\((1,7)\)、\((4,0)\) 已在一条直线上。若 \(x=6\),则 \((1,7)\)、\((2,6)\)、\((3,5)\) 也在一条直线上。若 \(x=5\),则 \((0,5)\)、\((2,5)\)、\((3,5)\) 也在一条直线上。若 \(x=9\),则 \((0,5)\)、\((2,9)\)、\((4,0)\) 落在原始直线上,Bob 可以解码。若 \(x=10\),则 \((2,10)\)、\((3,5)\)、\((4,0)\) 也在一条直线上。因此当 \(x=6,5,10\) 时,Bob 无法唯一确定 Alice 的消息。
(c) 信道 X 会送达 6 个包,因此我们可以通过它发送一个编码在 5 次多项式上的长度为 6 的消息。若通过信道 X 发送 10 个点,则无论 Bob 收到哪 6 个点,都能重构我们的 5 次多项式。由于信道 Y 有 1 个一般错误,我们只能通过它发送一个编码在 3 次多项式上的长度为 4 的消息。若发送 10 个点,Bob 将收到 6 个点来计算一个具有 1 个一般错误的 4 次多项式,这是可行的。因此,为了发送长度为 9 的消息,我们可以将第 1–6 个字符通过信道 X 发送,第 7–9 个字符通过信道 Y 发送。
另解:Alice 可以插值出一个编码长度为 9 消息的 8 次多项式。她通过信道 X 发送该多项式的 10 个点,并通过信道 Y 发送同一多项式的另外 10 个点。Bob 从信道 X 收到 6 个点,从信道 Y 收到 6 个点(其中 1 个被篡改)。他可以使用 \(n=9\)、\(k=1\) 的 Berlekamp-Welch 算法恢复原始多项式,并通过在相关点求值来提取消息。
解答来源:solutions/homework/hw05-sol.pdf · 8-10 · confidence: high
题面来源:homework/hw05.pdf · 3-4 · confidence: high
homework/hw05.pdfsolutions/homework/hw05-sol.pdf