量子回路
前回までに単数または複数Qビットに対する操作の説明を試みたが、今回はそれらを使って量子回路を作ってみる。
\def\bra#1{\mathinner{\left\langle{#1}\right|}}
\def\ket#1{\mathinner{\left|{#1}\right\rangle}}
\def\braket#1#2{\mathinner{\left\langle{#1}\middle|#2\right\rangle}}
これは5つのQビットを使用した例になる。便宜上、上から順に16進数で名前を付けておく。これらのQビットを従来の計算機のビットに見立てて、一番上のQビットを最下位ビット、一番下のQビットを最上位ビットとみなすと、たとえば0x02のQビットが立っている場合を2進数で表すと、
00010
となる(左が最上位ビット、右が最下位ビット)
そうすると、たとえば3という数字は、0x01と0x02のQビットが立っている状態、つまり0x03で、2進数で表現すれば、
00011
となる。(図中のHはアダマール演算子で、それぞれのQビットに適用した例として示しただけでここでは特に問題にしない)
こんな感じで従来のビットを使った計算機と同じような方法で計算回路を作れそう。実際に、このようにQビットを見立て、前回で説明したQビットに対する演算子を適当に使うことによって従来の計算機と同じ働きをする計算機を作ることができるということだ。量子的な現象がミクロの世界からマクロな世界までをつかさどる理だとするならならば、従来の計算機は量子計算機の特別なケースだと言えるのだろう。これは従来の計算機のビットでは実現不可能な量子重ね合わせや量子もつれの状態でも機能する。以下、そんな状態の例を示す。
量子もつれを生成する演算回路
図2の回路図ではQビットの名前が同じ0x1になっているがこれはQビットaとbをそれぞれわかりやすく分けてみた場合の単なる表示上の問題で、基本的には図1と同じとみてほしい。16進数の名前をレジスターごとに相対的に付けているだけなので、回路全体として見れば一番上が0x01、その下が0x02と表現しても同じこと。
図2の下の図は回路が実行されて観測直後のQビットの状態を表しており、それぞれの状態の円は半径最大1で色のついた円の半径が確率振幅、中心から伸びた棒は位相を表しており、真上を基準として位相がずれていると棒の傾きも変化する。いままで見てきた状態縦ベクトルを横にした格好になっている。それぞれのQビットの観測後の値はそれぞれ1となっている。(前に観測について説明した方法でそれぞれのQビットを観測するとそうなることが確認できる。ただし、上の回路では両方0になる場合と1になる場合の確率は1/2。この図では1になった場合を表している)
この状態がどのような意味を持つのか簡単に説明する。
図2にある回路図のQビットの縦の並びは冒頭で説明した通りで、他のHやプラス、RのマークはそれぞれQビットに適用した操作となっている。操作は左から右に向けて順番に適用される。
最初の操作Hはアダマールなので説明不要。
二つ目の操作、プラスマークと黒丸が線でつながっているものは「Qビットaが1のときだけ、bを反転する」という選択的な操作を表す。aはbを制御する役割を担うという意味でコントロールビット(制御ビット)、bは実際に操作対象となるのでターゲットビット(標的ビット)などと呼ぶ。一つのコントロールビットとNOT演算子ということで、CNOTゲートと呼ばれる。
最後の操作、Rは観測を表していて、アルファベットRの下に観測した後のそれぞれのQビットの値(0 or 1)が記載されている。なので、図2の場合はa,bがそれぞれ観測によって1となっていることが確認できる。
ここで観測する直前の回路とQビットの状態を図で示す。
図3)
Qビットの状態円表示は、1つ目と4つ目の状態の確率振幅が$1/\sqrt{2}$の円半径となっており、a, bそれぞれを観測するなら1/2の確率で0または1となる状態となっている。
数式でも確認すると以下のとおり。
\begin{align}
\ket{\psi_a} &= \frac{1}{\sqrt{2}}\ket{0} + \frac{1}{\sqrt{2}}\ket{1} = \frac{1}{\sqrt{2}}
\left(
\begin{array}{ccc}
1 \\
0
\end{array}
\right)
+
\frac{1}{\sqrt{2}}\left(
\begin{array}{ccc}
0 \\
1
\end{array}
\right)
=
\frac{1}{\sqrt{2}}\left(
\begin{array}{ccc}
1\\
1
\end{array}
\right) \\
\ket{\psi_b} &= \ket{0} = \left(
\begin{array}{ccc}
1\\
0
\end{array}
\right) \\
\ket{\psi} &= \ket{\psi_a}\otimes \ket{\psi_b} =
\left(
\begin{array}{ccc}
\frac{1}{\sqrt{2}}\left(
\begin{array}{ccc}
1 \\
0
\end{array}
\right) \\
\frac{1}{\sqrt{2}}\left(
\begin{array}{ccc}
1 \\
0
\end{array}
\right) \\
\end{array}
\right)
=
\frac{1}{\sqrt{2}}\left(
\begin{array}{ccc}
1 \\
0 \\
1 \\
0
\end{array}
\right)
\\
CX\ket{\psi} &=
\left(
\begin{array}{ccc}
1 & 0 & 0 & 0 \\
0 & 1 & 0 & 0\\
0 & 0 & 0 & 1\\
0 & 0 & 1 & 0
\end{array}
\right)
\frac{1}{\sqrt{2}}
\left(
\begin{array}{ccc}
1 \\
0 \\
1 \\
0 \\
\end{array}
\right) =
\frac{1}{\sqrt{2}}\left(
\begin{array}{ccc}
1 \\
0 \\
0 \\
1 \\
\end{array}
\right) \\
\end{align}
$CX$はCNOTゲート。
最後の式の最右辺のとおり、0または1が1/2の確率で観測される。
この状態はaが0ならbも0、aが1ならbも1となる。一方の観測結果が他方に影響を与えているのでこの2つのキュービットはもつれた状態である(CNOT適用前はもつれていない状態)このようにCNOTゲートは量子もつれを作る演算子であり、この状態はベルペアとかベル状態とか呼ばれる。
同じ計算をブラケット記号を使うと以下のようになる。ただし各演算子の添字はそれぞれ適用対象となるQビットを表す。
\begin{align}
CX &= \ket{0}_a\bra{0} I_b + \ket{1}_a\bra{1} X_b \\
CX \ket{\psi} &= (\ket{0}_a\bra{0} I_b + \ket{1}_a\bra{1} X_b)\frac{\ket{0}_a + \ket{1}_a}{\sqrt{2}}\ket{0}_b \\
&= \ket{0}_a I_b \frac{\ket{0}_b}{\sqrt{2}} + \ket{1}_a X_b \frac{\ket{0}_b}{\sqrt{2}} \\
&= \frac{1}{\sqrt{2}}\ket{0}_a\ket{0}_b + \frac{1}{\sqrt{2}}\ket{1}_a\ket{1}_b \\
&= \frac{1}{\sqrt{2}}(\ket{00} + \ket{11})
= \frac{1}{\sqrt{2}}\left(
\begin{array}{ccc}
1 \\
0 \\
0 \\
1 \\
\end{array}
\right) \\
\end{align}
ここまでの説明で腑に落ちない点がある。いきなり図や数式を持ち出して天下り的に説明しているけれども、そもそもCNOTゲートのような操作は物理的にどのように行われ、それによってこの選択的演算が可能であることをどのように説明するのか?例えば、フェーズゲートなどは量子の位相操作のために電子や光子に物理的な操作を行う、その際に回転操作が必要。というような理屈で私のような素人でも一応の納得感を得るのだが、CNOTの場合にそれにあたる説明は何なのか?このような疑問を持つこと自体量子力学を知らない筆者の限界なのだ。今のところはCNOTに該当する物理的な操作が存在するという前提で先に進んでいきたい。
さて、CNOTのような条件付き演算は他のパウリゲートや回転ゲートなどの演算についても同様に定義できる。それらの演算子を$U$として、以下のように定義する。
\ket{0}\bra{0} I + \ket{1}\bra{1} U \\
また、これまでは2つQビットの演算を見てきたが、3つ以上のQビットでも同様の操作が可能である。例えば以下の3つのQビットに対する操作はトリフォフォゲート(CCNOTゲート)呼ばれる。
(I^{\otimes 2} - \ket{11}\bra{11})I + \ket{11}\bra{11}X
シュミレーター実装
CNOT等をシュミレーター上に実装するのは簡単である。ターゲットビットへの操作の際に、コントロールビットが立っているところだけに操作を選択的に適用するだけだ。例えば図4の場合、状態が8次元の列ベクトルで表されることはこれまで何度も見てきた。
(a_0, a_1, a_2, a_3, a_4, a_5, a_6, a_7)^T
ここで、ターゲットビットである0x04にNOTゲート操作する場合は、
(a_0, a_4), (a_1, a_5), (a_2, a_6), (a_3, a_7)
の各ペアに対して操作するのだった。これを2進数で表現しなおすと、
(000, 100), (001, 101), (010, 110), (011, 111)
ここでコントロールビットである0x01(001)|0x02(010) = 0x03(011)のビットが立っているものだけを選択すると、
(011, 111)
つまり、
(a_3, a_7)
についてだけ操作すればいいことになる。シュミレーターの実装上、これはただのビット演算である。
計算機回路の話をしているのにいまだ計算機ぽくない話ばかりになっているが、上のCNOTのような演算は量子回路を作るための必須演算であるため説明した。次から少しずつそれっぽい話に進んでいきたい。