logo

トッフォリ/CCNOTゲート

トッフォリ/CCNOTゲート

定義1

以下のようなベクトル値ブール関数トフォリゲートToffoli gateと呼ぶ。

T:{0,1}3{0,1}3 T : \left\{ 0, 1 \right\}^{3} \to \left\{ 0, 1 \right\}^{3}

T(a,b,c)=(a,b,(ab)c) T (a, b, c) = (a, b, (a \land b) \oplus c)

  • CCNOT\text{CCNOT} ゲートControlled Controlled NOT(CCNOT) gateとも呼ばれる。

説明

トフォリゲートでは、最初の二つの入力が両方とも11であれば、三番目の入力が反転する。その他の場合は、入力と出力が同じである。具体的な計算は以下の通りである。

T(0,0,0)=(0,0,(00)0)=(0,0,00)=(0,0,0)T(0,0,1)=(0,0,(00)1)=(0,0,01)=(0,0,1)T(0,1,0)=(0,1,(01)0)=(0,1,00)=(0,1,0)T(0,1,1)=(0,1,(01)1)=(0,1,01)=(0,1,1)T(1,0,0)=(1,0,(10)0)=(1,0,00)=(1,0,0)T(1,0,1)=(1,0,(10)1)=(1,0,01)=(1,0,1)T(1,1,0)=(1,1,(11)0)=(1,1,10)=(1,1,1)T(1,1,1)=(1,1,(11)1)=(1,1,11)=(1,1,0) \begin{align*} T (0,0,0) &= (0, 0, (0 \land 0) \oplus 0) = (0, 0, 0 \oplus 0) = (0, 0, 0) \\ T (0,0,1) &= (0, 0, (0 \land 0) \oplus 1) = (0, 0, 0 \oplus 1) = (0, 0, 1) \\ T (0,1,0) &= (0, 1, (0 \land 1) \oplus 0) = (0, 1, 0 \oplus 0) = (0, 1, 0) \\ T (0,1,1) &= (0, 1, (0 \land 1) \oplus 1) = (0, 1, 0 \oplus 1) = (0, 1, 1) \\ T (1,0,0) &= (1, 0, (1 \land 0) \oplus 0) = (1, 0, 0 \oplus 0) = (1, 0, 0) \\ T (1,0,1) &= (1, 0, (1 \land 0) \oplus 1) = (1, 0, 0 \oplus 1) = (1, 0, 1) \\ T (1,1,0) &= (1, 1, (1 \land 1) \oplus 0) = (1, 1, 1 \oplus 0) = (1, 1, 1) \\ T (1,1,1) &= (1, 1, (1 \land 1) \oplus 1) = (1, 1, 1 \oplus 1) = (1, 1, 0) \\ \end{align*}

上の表を見ればTT可逆関数であることとTTを二回合成すると恒等関数になることが容易に分かる。

Id=TT \operatorname{Id} = T \circ T

また、{T}\left\{ T \right\}機能的に完全であるため、TT汎用ゲートである。

부울 함수기호진리표
TT
입력출력
aabbccaabb(ab)c(a \land b) \oplus c
000000000000
000011000011
001100001100
001111001111
110000110000
110011110011
111100111111
111111111100

整理

(射影と注入を制約なく使えると仮定すると)トフォリゲートTT汎用ゲートである。つまり{T}\left\{ T \right\}機能的に完全である。

証明

定理

複製関数を許可すると、{}\left\{ \uparrow \right\}は機能的に完全である。つまりNAND\text{NAND}ゲート\uparrowは汎用ゲートである。

上の定理に従い、射影、注入、TTを適切に使用して複製関数cl\text{cl}NAND\text{NAND}ゲートを表現できることを示せば証明が完了する。

  • 複製関数

    cl=p1Tı2ȷ1 \operatorname{cl} = p_{1} \circ T \circ \imath_{2} \circ \jmath_{1}

    が成り立つ。まずTı2ȷ1(a)T \circ \imath_{2} \circ \jmath_{1} (a)を計算すると以下のようになる。

    Tı2ȷ1(a)=Tı2(a,1)=T(a,1,0) T \circ \imath_{2} \circ \jmath_{1} (a) = T \circ \imath_{2} (a, 1) = T (a, 1, 0)

    ここでa=1a = 1であればT(1,1,0)=(1,1,1)T(1, 1, 0) = (1, 1, 1)であり、a=0a = 0であればT(0,1,0)=(0,1,0)T(0, 1, 0) = (0, 1, 0)であるため、次が成り立つ。

    T(a,1,0)=(a,1,a) T(a, 1, 0) = (a, 1, a)

    したがってp1p_{1}を取れば、

    p1Tı2ȷ1(a)=p1(a,1,a)=(a,a)=cl(a) p_{1} \circ T \circ \imath_{2} \circ \jmath_{1} (a) = p_{1} (a, 1, a) = (a, a) = \operatorname{cl}(a)

  • NAND\text{NAND}ゲート

    p0p1Tȷ2=p0p1Tȷ2(a,b)=ab p_{0} \circ p_{1} \circ T \circ \jmath_{2} = \uparrow \\ p_{0} \circ p_{1} \circ T \circ \jmath_{2} (a, b) = a \uparrow b

    が成り立つ。順に計算すると以下のようになる。

    p0p1Tȷ2(a,b)=p0p1T(a,b,1)=p0p1(a,b,(ab)1)=p0(a,(ab)1)=(ab)1=¬(ab)=ab \begin{align*} p_{0} \circ p_{1} \circ T \circ \jmath_{2} (a, b) &= p_{0} \circ p_{1} \circ T (a, b, 1) \\ &= p_{0} \circ p_{1} (a, b, (a \land b) \oplus 1) \\ &= p_{0} (a, (a \land b) \oplus 1) \\ &= (a \land b) \oplus 1 \\ &= \lnot(a \land b) = a \uparrow b \end{align*}

    最後の行はXOR\text{XOR}ゲートの性質によって成り立つ。


  1. 木村泰宏・許在成, 量子情報理論 (2020), p89-93 ↩︎