在零知识证明的背景下,算术电路是为 NP 中的问题建立模型的一个方程组。
我们在关于 P vs NP 的文章中的一个关键点是,P 或 NP 中问题的任何解都可以通过将该问题建模为布尔电路来验证。
然后,我们将原问题的解转换为布尔变量的一组值(称为 witness),这会使得布尔电路返回 true。
本文建立在上面链接的文章基础之上,因此请先阅读那一篇。
使用布尔电路来表示问题解的一个缺点是,在表示加法或乘法等算术运算时,它可能会非常繁琐。
例如,如果我们想表达 $a + b = c$ ,其中 $a = 8, b = 4, c = 12$ ,我们必须将 $a$ 、 $b$ 和 $c$ 转换为二进制数。二进制数中的每一位将对应一个独立的布尔变量。在这个例子中,假设我们需要 4 个比特(bit)来编码 $a$ 、 $b$ 和 $c$ ,其中 $a_{0}$ 代表数字 $a$ 的最低有效位 (LSB), $a_{3}$ 代表最高有效位 (MSB),如下所示:
(你现在不需要知道如何将数字转换为二进制,我们将在本文后面解释该方法)。
一旦我们将 $a$ 、 $b$ 和 $c$ 写成二进制,我们就可以编写一个布尔电路,其输入是所有的二进制位 $(a_{0}, a_{1}, …, c_{2}, c_{3})$ 。我们的目标是编写这样一个布尔电路,使得当且仅当 $a + b = c$ 时,该电路输出 true。
事实证明,这比预期的要复杂得多,如下方模拟二进制 $a + b = c$ 的大型电路所示。为了简洁起见,我们不展示推导过程。我们仅展示该公式以说明此类电路会有多么冗长:
((a₄ ∧ b₄ ∧ c₄) ∨ (¬a₄ ∧ ¬b₄ ∧ c₄) ∨ (¬a₄ ∧ b₄ ∧ ¬c₄) ∨ (a₄ ∧ ¬b₄ ∧ ¬c₄)) ∧
((a₃ ∧ b₃ ∧ ((a₂ ∧ b₂) ∨ (b₂ ∧ (a₁ ∧ b₁) ∨ (b₁ ∧ c₀) ∨ (a₁ ∧ c₀)))) ∨
(¬a₃ ∧ ¬b₃ ∧ ((a₂ ∧ b₂) ∨ (b₂ ∧ (a₁ ∧ b₁) ∨ (b₁ ∧ c₀) ∨ (a₁ ∧ c₀)))) ∨
(¬a₃ ∧ b₃ ∧ ¬((a₂ ∧ b₂) ∨ (b₂ ∧ (a₁ ∧ b₁) ∨ (b₁ ∧ c₀) ∨ (a₁ ∧ c₀)))) ∨
(a₃ ∧ ¬b₃ ∧ ¬((a₂ ∧ b₂) ∨ (b₂ ∧ (a₁ ∧ b₁) ∨ (b₁ ∧ c₀) ∨ (a₁ ∧ c₀))))) ∧
((a₂ ∧ b₂ ∧ ((a₁ ∧ b₁) ∨ (b₁ ∧ c₀) ∨ (a₁ ∧ c₀))) ∨
(¬a₂ ∧ ¬b₂ ∧ ((a₁ ∧ b₁) ∨ (b₁ ∧ c₀) ∨ (a₁ ∧ c₀))) ∨
(¬a₂ ∧ b₂ ∧ ¬((a₁ ∧ b₁) ∨ (b₁ ∧ c₀) ∨ (a₁ ∧ c₀)))) ∨
(a₂ ∧ ¬b₂ ∧ ¬((a₁ ∧ b₁) ∨ (b₁ ∧ c₀) ∨ (a₁ ∧ c₀))))) ∧
((a₁ ∧ b₁ ∧ c₀) ∨ (¬a₁ ∧ ¬b₁ ∧ c₀) ∨ (¬a₁ ∧ b₁ ∧ ¬c₀) ∨ (a₁ ∧ ¬b₁ ∧ ¬c₀)) ∧
((a₀ ∧ b₀ ∧ c₀) ∨ (¬a₀ ∧ ¬b₀ ∧ c₀) ∨ (¬a₀ ∧ b₀ ∧ ¬c₀) ∨ (a₀ ∧ ¬b₀ ∧ ¬c₀)) ∧
¬ ((a₄ ∧ b₄) ∨
(b₄ ∧ (a₃ ∧ b₃) ∨ (b₃ ∧ (a₂ ∧ b₂) ∨ (b₂ ∧ (a₁ ∧ b₁) ∨ (b₁ ∧ c₀) ∨ (a₁ ∧ c₀))) ∨
(a₃ ∧ (a₂ ∧ b₂) ∨ (b₂ ∧ (a₁ ∧ b₁) ∨ (b₁ ∧ c₀) ∨ (a₁ ∧ c₀))))
这里的关键是,如果我们受限于布尔输入和基本的布尔运算(AND、OR、NOT),对于基础问题而言,构建电路很快就会变得复杂且乏味,尤其是当涉及算术运算时。
相比之下,直接在电路中表示数字会更简单。与其用布尔公式对加法进行建模,我们不如直接对这些数字使用加法和乘法。
本文证明了使用 算术电路 也可以对 P 或 NP 中的任何问题进行建模。
算术电路是一个仅使用加法、乘法和相等关系的方程组。与布尔电路一样,它检查所提供的一组输入是否有效,但不计算解。
下面是我们关于算术电路的第一个例子: