📜  门| GATE-CS-2002 |第 31 题(1)

📅  最后修改于: 2023-12-03 15:28:41.369000             🧑  作者: Mango

门| GATE-CS-2002 |第 31 题
题目描述

给定一个布尔函数 $f$,它接受 $n$ 个输入并产生一个输出。假设这个函数可以由一组门实现,其中每个门可以有任意数量的输入但仅一个输出。证明存在一个确定的实现方案,其中包含 $O(2^n/\epsilon)$ 个门,可以将 $f$ 实现到误差 $\epsilon=2^{-n}$ 以内。

解题思路

该题思路比较巧妙。首先,我们知道 $n$ 个输入可以产生 $2^n$ 种不同的输入组合,而每个组合都对应了 $1$ 或者 $0$ 的输出。若要将误差控制在 $2^{-n}$ 以内,则需要将 $f$ 实现得很精确,即对于所有 $2^n$ 种输入组合,$f$ 的输出都与原始布尔函数 $f$ 相同。

因此,我们可以采用递归的方式不断缩小 $f$ 的定义域,将 $n$ 个输入分别分为两部分,一部分用于计算 $f$ 的输出,另一部分再递归调用函数以实现下一层的精确计算。

假设我们已经用 $m$ 个门实现了一个接收 $n$ 个输入的布尔函数 $f$,即 $f(x_{1},x_{2},...,x_{n})=g(h_{1}(x_{i_{1,1}},x_{i_{1,2}},...,x_{i_{1,k_{1}}}),...,h_{r}(x_{i_{r,1}},x_{i_{r,2}},...,x_{i_{r,k_{r}}}))$,其中 $h_{1},...,h_{r}$ 分别是 $m$ 个门中的函数,$g$ 是一个接收 $r$ 个输入的函数。我们将 $n-k$ 个输入分给 $g$,将其余输入分别分配给 $h_{1},...,h_{r}$。

对于每个 $h_{i}$,我们将其余的 $k_{i}-1$ 个输入分给下一层的 $f$,其中 $i_{1,1}$ 是本层 $h_{i}$ 的输入之一。

可以证明,下一层 $f$ 必须要以 $2^{n-k}/2^{n} = 2^{-k}$ 的准确度来实现精度错误。因此,对于递归的第 $j$ 层,我们需要总共实现 $2^{j\cdot k}\cdot2^{-j\cdot k} = 1$ 个精度为 $2^{-k}$ 的布尔函数。这些布尔函数分别具有 $2^{(n-j\cdot k)}$ 个输入。由于我们知道每个 $h_{i}$ 都至少占用了一个输入,因此我们可以从 $r\cdot k$ 中减去 $r$ 个,从而得到 $(r-1)\cdot k+1$,即 $g$ 的输入数目。

根据定义,$g$ 接收了 $n-k$ 个输入。因此,我们可以通过递归 $n\rightarrow n-k \rightarrow (n-k)-k\rightarrow...\rightarrow k\rightarrow 1$,在前 $i$ 层中使用 $O(2^{(n-ik)/i})$ 个门实现所有我们需要的布尔函数。

现在考虑最后一层。由于所有 $h_{i}$ 只有一个输出,因此 $g$ 可以用一个查表方式来实现(table lookup),即将其余 $n-k$ 个变量作为查表的输入,将 $h_{1}(x_{i_{1,1}},...,x_{i_{1,k_{1}}}),...,h_{r}(x_{i_{r,1}},...,x_{i_{r,k_{r}}})$ 的输出作为查表的输出。根据上文,我们最多需要实现 $O(2^{k})$ 个这样的布尔函数,因此该层总计需要 $O(2^{n-k})$ 个门。

综上所述,对于每个 $k$,使用 $O(2^{(n-k)/k})$ 个门来实现所有深度为 $k$ 的精度为 $2^{-k}$ 的布尔函数。由于函数的深度至少为 $1$,因此总共最多需要 $O(\sum_{k=1}^{n}2^{(n-k)/k}) = O(\sum_{k=1}^{n}2^{n-k}) = O(2^{n})$ 个门。因此,该算法可以在 $O(2^{n})$ 时间内求解,且误差 $\epsilon=2^{-n}$。

代码实现

由于该算法为思路论证,并不需要实现具体代码。