論理演算

量子論理ゲート

論理演算 AND や OR の量子版

古典コンピュータの電子回路が AND や OR などの論理ゲートから組み立てられているように、量子算術演算も量子版の論理ゲートから組み立てることができます。 量子回路で AND や OR などの論理演算ができれば、if 文の条件部になど使う論理式を量子回路として組み立てられるようになります。 こうした論理式は、古典コンピュータだけではなく量子コンピュータでもアルゴリズムの中核をなすものです。 古典の論理ゲートに対応する量子論理ゲートをひとつひとつ見ていきましょう。

量子論理 NOT

まずは論理 NOT の量子版です。 これは a = NOT a と書け、a の NOT を取ったものを a に代入します。 プログラミングに慣れている人ならば a = !a と書いたほうが分かりやすいかもしれません。 これは、 をそのまま使うだけです。

  • を入れ替えて量子論理 NOT の動作を確認しましょう

量子論理 AND

量子論理 AND は、入力となる量子ビット a, b と、結果を入れる量子ビット c を使います。 c は \(|0\rangle\) に初期化され、a AND b の結果が出力されます。

a b c = a AND b
0 0 0
0 1 0
1 0 0
1 1 1

これは「a かつ b だったときに c は 1」ですから、次のように CCNOT で表現できます。

  • を入れ替えて量子論理 AND の動作を確認しましょう

量子論理 XOR

論理 XOR は 2 つの入力 a, b を取り、「a と b のどちらか片方が 1 だった時、1 を出力する」という論理ゲートです。 量子版の論理 XOR は、`b = a XOR b` と書け、これは次のように CNOT ゲート 1 つで表すことができます。

  • を入れ替えて量子論理 XOR の動作を確認しましょう

ちなみに XOR は足し算の一種であり、「a と b を足した値を 2 で割った余り (排他的論理和)」として考えることができます。

a b a + b a XOR b (a + b を 2 で割った余り)
0 0 0 0
0 1 1 1
1 0 1 1
1 1 2 0

NOT ゲート の記号はなぜ「+」か? と今まで疑問に思っていた人もいるかもしれません。 これは、CNOT で を置いたビットに XOR という足し算 (排他的論理和) が実行されるから、と考えることができます。

量子論理 NAND

論理 NAND は NOT + AND の省略形で、入力がすべて 1 だった場合に 0、それ以外は 1 を返します。 これは入力 a, b、出力 c の場合には、`c = NOT(a AND b)` と書くことができ、 先ほどの量子論理 AND 回路と を組合わせることで実装できます。

  • を入れ替えて量子論理 NAND の動作を確認しましょう

量子論理 OR

量子論理 OR は、入力となる量子ビット a, b と、結果を入れる量子ビット c を使います。 c は \(|0\rangle\) に初期化され、a OR b の結果が出力されます。 今までより少し複雑になりますが、量子論理 OR は次のように実装できます。

  • を入れ替えて量子論理 OR の動作を確認しましょう

OR がなぜこのような回路になるかは、OR が NAND と NOT で次のように書き直せることから来ています。

a OR b = (NOT a) NAND (NOT b)

つまり OR は、入力 a, b をそれぞれ NOT したものを入力とする NAND に分解できます。

最後のステップで a, b に対してアンコンピュテーションすることで a, b を元に戻していることに注意しましょう。 c = a OR b の回路は a, b の値は書き換えないので、ふたたびそれぞれに を適用することで (= NOT a,b の逆回路を適用することで) 元の状態に戻してやる必要があります。

量子論理 NOR

論理 NOR は NOT + OR の略で、c = NOT(a OR b) を計算するものです。 すでに量子論理 OR と NOT は実装したので、NOR を作るにはこれらを組合わせるだけです。

ここで NOT c の は OR の と打ち消しあって消えるので、最終的な NOR は次のようになります。

  • を入れ替えて量子論理 NOR の動作を確認しましょう

まとめ

量子論理演算は従来のデジタル回路の AND や OR といった論理演算を量子回路で実行するものです。 デジタル回路との大きな違いは、重ね合わせの入出力に対応していることです。 量子論理演算は振幅の大きさの重ね合わせを入力として取り、演算結果を同じく振幅の大きさとして出力します。