古典論理ゲートと量子論理ゲートから見る量子回路の性質

#はじめに
量子回路を説明するときに論理ゲートを例にすると性質がわかりやすいのではないかと思って書いてみました。

#結論を先に
- 古典論理ゲートでは1回の入力は取り得るパターンのうちいずれか1つだが、量子論理ゲートでは取り得るパターンの重ね合わせを入力できる
- 古典論理ゲートでは入力と出力は別物だが、量子論理ゲートでは入力の状態がゲートによって変化するため同じもの。よって量子論理ゲートの入力と出力の数は同じ

#古典論理ゲート
古典論理ゲートはビットの論理演算をするもので、NOTゲート、ANDゲート等があります。
ゲートは入力ビットを取り、ゲートの論理演算を適用した結果を出力ビットに出力します。

例1) 0 → NOTゲート → 1
例2) 1, 1 → ANDゲート → 1

ポイント1: 入力ビットと出力ビットは別物
ポイント2: 入力ビットと出力ビットの数が違うものがある(ANDは入力2ビット、出力1ビット)

入力と出力の関係は真理値表で表せます。

例) ANDゲートの真理値表

| 入力0 | 入力1 | 出力 |
|:----:|:-----:|:---:|
| 0    | 0     | 0   |
| 0    | 1     | 0   |
| 1    | 0     | 0   |
| 1    | 1     | 1   |

ただしこれは入力の取り得るパターンを一覧にしたものであって、1回の入力はいずれかの１パターンです。

例) ANDゲートの具体的な動作例

| 入力0 | 入力1 | 出力 |
|:----:|:-----:|:---:|
| 1    | 1     | 1   |


#量子ゲート
次に量子ゲートを見てみます。

例)量子ANDゲートの回路図

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556297/b26dc964-bfc5-9c27-7665-9e0b678b372d.png)

この図は[IBM Quantum Experience](https://quantum-computing.ibm.com/)の[Circuit Composer](https://quantum-computing.ibm.com/composer/new-experiment)で描いたものです。
$q_0, q_1, q_2$のラベルが付いている「線」が「量子ビットです」。左から右にゲートを適用していくことで量子ビットの状態が変化します。
量子回路では量子ビットは通常$|0\rangle$で初期化されるのですが、今回は$q_2$が$|0\rangle$であることを明示しています。
縦点線はバリアと呼ばれる記号で、回路を見やすくするためのもので処理には影響しません。
縦点線の間にある記号は「トフォリゲート」「CCXゲート」などと呼ばれる量子ゲートです。
このゲートは2つの黒点が付いた量子ビットが両方とも$|1\rangle$のとき、$\oplus$の記号が付いた量子ビットを反転します($|0\rangle → |1\rangle, |1\rangle → |0\rangle$)

ここで次のように$q_0, q_1$を入力、$q_2$を出力と考えて、トフォリゲートを適用した結果を表にしてみます。

![1x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556297/c3929e15-a144-ab05-9235-4d326da1b1c8.png)

例) トフォリゲートの真理値表

| $q_0$ | $q_1$ | $q_2$ |
|:----:|:-----:|:---:|
| &#124;0>  | &#124;0>   | &#124;0> |
| &#124;0>  | &#124;1>   | &#124;0> |
| &#124;1>  | &#124;0>   | &#124;0> |
| &#124;1>  | &#124;1>   | &#124;1> |

$q_0, q_1$の両方が$|1\rangle$のとき$q_2$が反転して$|1\rangle$になり、ANDゲートと同じ形になっています。
つまりトフォリゲートは量子版のANDゲートと考えることができます。

ちなみに上記のゲートを通過後に全量子ビットを測定すると以下のようになります(Circuit Composerでは回路の下に表示されています)
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556297/e607904a-dfd3-adc9-f3c2-b526acd7f43d.png)

"000"は左から$q_2, q_1, q_0$の測定結果です。縦軸の"100"は「その結果が測定される確率」です。つまり「$q_20, q_1, q_0$を測定すると、100%の確率で"000"になる」ことがわかります。
真理値表の1つ目のパターンですね。

例) 量子ANDゲートの具体的な動作例

| $q_0$ | $q_1$ | $q_2$ |
|:----:|:-----:|:---:|
| &#124;0>  | &#124;0>   | &#124;0> |

ここまでは古典量子ゲートと同じように見えます。

ここからは量子ゲートに特有の部分を見ていきます。

#量子ゲートは重ね合わせ状態を入力できる
先ほどの量子ゲートの入力は"0"ではなく"$|0\rangle$"でした。
これば量子コンピュータでのビットに相当するもので「量子ビット」といいます。
(ちなみに、量子ビットが出てきたので今までのビットを区別するために「古典ビット」ということがあります)

量子ビットは一般的な形では$|\psi\rangle = \alpha|0\rangle + \beta|1\rangle$のように記述します。
$|\psi\rangle$を測定すると、$|\alpha|^2$の確率で0が、$|\beta|^2$の確率で1が測定されます。
先ほどの$|0\rangle$は$\alpha=1, \beta=0$のような特殊な場合で、測定すると確率1(100%)で0が測定されます。

さて先ほどの量子ゲートは入力が量子ビットなので、$|0\rangle$以外にも$\alpha|0\rangle + \beta|1\rangle$のような状態も入力することができます。
そのような状態にする方法としてアダマールゲートを通す方法があります。
$|0\rangle$ → アダマールゲート(Hゲート) → $\frac{1}{\sqrt2}|0\rangle + \frac{1}{\sqrt2}|1\rangle$
$|\frac{1}{\sqrt2}|$の2乗は$\frac{1}{2}$なので、上記の状態の量子ビットを測定すると$\frac{1}{2}$の確率で0, 1のいずれかが測定されます。

$q_0$にアダマールゲートを通してから量子ANDゲートに通してみます。

![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556297/e45535f8-45fa-23fd-3952-8cd3a39ef946.png)

測定結果を見てみます。

![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556297/5191cc45-47f7-115a-9446-19f5e9b7a34b.png)

測定されたビットの最下位($q_0$)が0と1の2パターンあり、測定確率はどちらも50%になっています。
真理値表で表すと以下のようになります。

| $q_0$ | $q_1$ | $q_2$ |
|:----:|:-----:|:---:|
| &#124;0>  | &#124;0>   | &#124;0> |
| &#124;1>  | &#124;0>   | &#124;0> |

$q_0$は最初$|0\rangle$という状態でしたがアダマールゲートを通すことで「$|0\rangle, |1\rangle$の均等重ね合わせ」の状態になり、それを入力とすることで1回のゲート演算で2パターンの演算ができるようになりました。

同様に$q_1$もアダマールゲートを通せば、1回のゲート演算で4パターンの演算ができます。

![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556297/6be2586d-7af3-c306-9549-d25622ed32d7.png)
![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556297/9eb76582-c1e7-f081-8e85-c16215e6799b.png)

ポイント：古典論理ゲートは入力が1パターンなので1回には1パターンしか演算できないが、量子論理ゲートでは入力を重ね合わせにすることで1回で複数パターンの演算ができる。

とは言え、これが役に立つかは微妙です。
先程の棒グラフの縦軸は「その結果が測定される確率」と書きましたが、最後の棒グラフを見ると4つの結果がそれぞれ25%になっています。つまり1回量子ANDゲートを動かして結果を測定すると4つの結果が等確率でランダムに出ます。
測定する前は4つの結果が確率的に含まれているのですが、測定した結果は確率から求められたいずれか1つです。

出力がランダムだと使いにくいので、まずは入力を重ね合わせ状態にして演算した後、欲しい結果の確率だけを上げるような演算(アルゴリズム)を適用します。それから複数回測定して一番多く測定された結果が欲しいものになります。
(問題によっては必ず1回で正しい答えが出てくるものもあります。)

#量子ゲートは入力の状態を変化させる
ところで測定結果は"000"のように3桁でした。回路図でも$q_0,q_1,q_2$から横に出た線が最後まで伸びています。
実は量子ゲートは入力を受け取って結果を出力するものではなく、入力の量子状態を変化させるものです。
回路図でいうと、左側全部が入力状態で、それにゲートを適用すると全体が出力状態に変化するイメージです。

![2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556297/3887f3c4-a404-73d9-bd64-57f802dcebb0.png)

真理値表も次のようなイメージです。(測定結果のグラフに合わせて$q_2q_1q_0$の順にしています)

| 入力(q2q1q0) | 出力(q2q1q0) |
|:----:|:-----:|
| &#124;000>  | &#124;000>   |
| &#124;001>  | &#124;001>   |
| &#124;010>  | &#124;010>   |
| &#124;011>  | &#124;111>   |

量子回路を見ると古典ゲートで作った回路のように「このビットがこのゲートで変わって…」というようにビット単位で考えそうになるのですが、あくまで「全体の状態」が変わっていくということを認識していないと混乱することがあります（→私）

#おまけ:もつれ
再度$q_0$にアダマールゲートを通した回路を見てみます。

![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556297/e45535f8-45fa-23fd-3952-8cd3a39ef946.png)

![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556297/5191cc45-47f7-115a-9446-19f5e9b7a34b.png)

| $q_0$ | $q_1$ | $q_2$ |
|:----:|:-----:|:---:|
| &#124;0>  | &#124;0>   | &#124;0> |
| &#124;1>  | &#124;0>   | &#124;0> |

$q_0$が$|0\rangle, |1\rangle$で$q_1$が$|0\rangle$固定なので、その組み合わせになっています。
次に以下の回路と測定結果はどうでしょうか。

![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556297/6b816036-e380-f6b7-a348-3c365e1574b7.png)
![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556297/1433f35a-bf15-e359-5b6d-25c48cffab08.png)


| $q_0$ | $q_1$ | $q_2$ |
|:----:|:-----:|:---:|
| &#124;0>  | &#124;0>   | &#124;0> |
| &#124;1>  | &#124;1>   | &#124;1> |

$q_0, q_1$は$q_0, q_1$の組み合わせには分解できません。このような$q_0, q_1$の状態を「もつれ」といいます。
量子回路では単純な重ね合わせの他に、もつれた重ね合わせをつくることができます。

#まとめ
書きたいことはこれだっけ？という気はしていますが、真理値表で説明するのはやりやすいかもと思えました。