こんにちは皆さん量子コンピュータシリーズ第4弾です。
前回までは一体系に限って議論してきましたが、それだけではコンピュータらしいことはできません。
-
【量子コンピュータ入門】Bloch球×Qiskitで理解する万能ゲートと量子回路シミュレーション
量子コンピュータシリーズ第3弾です。 前回は、量子コンピュータとは量子状態を自由自在にユニタリ変換する装置であるということを説明し、次回(つまり今回です)は量子コンピュータにおける万能ゲートについて説 ...
続きを見る
二体系まで話を広げることで、ようやく量子コンピュータはその真価を発揮します。
今回からはいよいよ神秘の領域、二体系の量子論に踏み込んでいきましょう。
目標は多体量子系に特有の現象、量子もつれ(量子エンタングルメント)について理解することです。
それでは早速始めましょう。
量子もつれ
量子もつれとは、量子的な系において現れる、古典的な相関を超えた相関のことです。
量子もつれは古典系では決して実現できないので、それを利用した量子コンピュータはある面において古典コンピュータを遥かに超える性能を発揮し得るのです。
このままでは抽象的でわかりにくいので、噛み砕いて説明してみましょう。
まず古典的な相関とは、我々が普通に実現、経験できるような二つの対象間の相関です。
例えばマクロで十分に硬い二つの物体を衝突させたとき、重心系の運動量は衝突前と衝突後とで保存しているとみなせるので、衝突前の重心系の運動量と衝突後の一方の物体の運動量が判れば(観測できれば)、衝突後のもう一方の物体の運動量も\( 100 \% \)分かります。
このときこれら二つの物体は運動量に関して相関していると言えるでしょう。
別の例として、くじ引きを考えてみましょう。
箱の中に当たりのくじとはずれのくじをそれぞれ一枚ずつ入れておき、二人の人間がくじを引きます。
自分もしくは相手が当たりを引く確率は\(1/2\)ですが、箱の中のくじは二枚しかないことがわかっているので、自分が当たりを引いていることがわかれば(観測できれば)、相手がはずれのくじを引いていることは\(100 \%\)わかりますし、逆もまた然りです。
これらは情報が足りていないからそれが分かっていないだけで、観測以前から状態は決定しています。
これに対して二つの量子系の間の量子相関は日常的な感覚からすればあり得ないような関係です。
例としてパラメトリック下方変換という現象によって生成される光子の偏光、その相関について考えてみましょう。
パラメトリック下方変換とは、非線形光学現象に分類される現象の一つです。
電場の2乗に比例する(非線形の名前の由来です)ような分極を物質が持てるとき、そのような物質に入射された光子はエネルギーと運動量を保存するように、二つの光子に分裂して出てきます。
この過程により生成された二つの光子は電磁場を介して相互作用しており、一方を測定したときの結果がもう一方にも影響します。
このときの相関には二つの光子が同じ偏光を共有するタイプⅠの相関と、二つの光子が互いに直交する偏光を持つタイプⅡの相関の2種類があります。
この相関は任意の測定について成り立っており、例えばタイプⅠの相関の場合、一方の光子を任意の角度の偏光板に通したとき、もう一方の光子も同じ向きの偏光板を\(100 %\)通過します。
これは「もともと二つの光子の偏光の状態は決まっていたが、それを知らなかった」という類のものではなく、「量子的な重ね合わせの状態にあった系を測定することにより一方の偏光の状態が確定し、それによりもう一方の偏光状態を将来的に測定したときの状態も確定した」という意味です。
このような量子的な相関を持つ複数の系は互いに「もつれている」或いは「エンタングルしている」と表現されます。
この量子もつれという現象を理解し、計算の対象とするためには「テンソル」という数学が必要です。
次の節ではテンソルについて学びましょう。
補足
注意すべきなのは、「量子系における相関」と「量子相関」とは異なるものであるということです。
量子系においても、混合状態という古典的な相関を持った状態を作ることができます。
テンソル
テンソルとは、二つのベクトル\( \boldsymbol{a}, \boldsymbol{b} \)にテンソル積という演算(と和)を施して得られる、新しいベクトル\( \boldsymbol{c} \)を指します。
あまりこの概念に馴染みのない方もいるかと思いますので、わかりやすい例でテンソル(積)の「気持ち」を説明してみましょう。
物理学における「仕事」という物理量は、物体に加えられた力\(F[\rm{N}]\)と物体の変位\(x[\rm{m}]\)との積\(Fx[\rm{Nm}]\)によって定義される量です。
このとき力\(F\)を2倍にしたら当然仕事も2倍になりますし、変位\(x\)を2倍にしても同様になります。
力\(F\)と変位\(x\)は物理的には異なる次元を持つ量でありながら、仕事という新しい次元を持った量を考えることでそれらをまとめて記述することができるのです。
このようにテンソルというのは複数の要素の変化を一まとめにして、全体の変化がどうなるかを知りたいときに使われます。
量子コンピュータに関して言えば、複数の量子状態をユニタリ変換したときに全体の量子状態がどう変換されるかを表現するためにテンソルが必要となります。
ではテンソルを考える気持ちがわかった所で定義を見てみましょう。
テンソル積は具体的には二つのベクトル
$$\begin{align}
\boldsymbol{a} &= \sum_{i} a_i \boldsymbol{\alpha}_i \\
\boldsymbol{b} &= \sum_{j} b_j \boldsymbol{\beta}_j
\end{align}$$
に対して
$$\begin{align}
\boldsymbol{c} &= \boldsymbol{a} \otimes \boldsymbol{b} \\
&= \sum_{i} a_i \boldsymbol{\alpha}_i \otimes \sum_{j} b_j \boldsymbol{\beta}_j \\
&= \sum_{i} \sum_{j} a_i b_j (\boldsymbol{\alpha}_i \otimes \boldsymbol{\beta}_j)
\end{align}$$
と定義されます。
ただし\( a_i, b_j \)はそれぞれ複素数であり、\( \boldsymbol{\alpha}_i, \boldsymbol{\beta}_j \)は\( \boldsymbol{a}, \boldsymbol{b} \)が属するそれぞれのベクトル空間の基底ベクトルです。
また\( \boldsymbol{\alpha}_i \otimes \boldsymbol{\beta}_j \)は\( \boldsymbol{c} \)が属するベクトル空間の基底ベクトルを表す形式的な記号です。
少し抽象的で分かりづらいと思うので、例を考えてみましょう。
$$\begin{align}
\boldsymbol{a} &=
\begin{pmatrix}
1 \\
2
\end{pmatrix}
= 1
\begin{pmatrix}
1 \\
0
\end{pmatrix}
+ 2
\begin{pmatrix}
0 \\
1
\end{pmatrix} \\
\boldsymbol{b} &=
\begin{pmatrix}
3 \\
4 \\
5
\end{pmatrix}
= 3
\begin{pmatrix}
1 \\
0 \\
0
\end{pmatrix}
+ 4
\begin{pmatrix}
0 \\
1 \\
0
\end{pmatrix}
+ 5
\begin{pmatrix}
0 \\
0 \\
1
\end{pmatrix}
\end{align}$$
とします。
すると定義通り
$$\begin{align}
\boldsymbol{c} &= \boldsymbol{a} \otimes \boldsymbol{b} \\
&= 3
\begin{pmatrix}
1 \\
0
\end{pmatrix}
\otimes
\begin{pmatrix}
1 \\
0 \\
0
\end{pmatrix}
+ 4
\begin{pmatrix}
1 \\
0
\end{pmatrix}
\otimes
\begin{pmatrix}
0 \\
1 \\
0
\end{pmatrix}
+ 5
\begin{pmatrix}
1 \\
0
\end{pmatrix}
\otimes
\begin{pmatrix}
0 \\
0 \\
1
\end{pmatrix} \\
& \quad + 6
\begin{pmatrix}
0 \\
1
\end{pmatrix}
\otimes
\begin{pmatrix}
1 \\
0 \\
0
\end{pmatrix}
+ 8
\begin{pmatrix}
0 \\
1
\end{pmatrix}
\otimes
\begin{pmatrix}
0 \\
1 \\
0
\end{pmatrix}
+ 10
\begin{pmatrix}
0 \\
1
\end{pmatrix}
\otimes
\begin{pmatrix}
0 \\
0 \\
1
\end{pmatrix}
\end{align}$$
となります。
ですがこのままでは\(
\begin{pmatrix}
1 \\
0
\end{pmatrix}
\otimes
\begin{pmatrix}
1 \\
0 \\
0
\end{pmatrix}
\)やその他の基底の正体がいまいち分かりません。
そこでこれらの基底を新しいベクトル空間の基底と対応させます。
$$\begin{align}
\begin{pmatrix}
1 \\
0 \\
0 \\
0 \\
0 \\
0
\end{pmatrix} & :=
\begin{pmatrix}
1 \\
0
\end{pmatrix}
\otimes
\begin{pmatrix}
1 \\
0 \\
0
\end{pmatrix} \\
\begin{pmatrix}
0 \\
1 \\
0 \\
0 \\
0 \\
0
\end{pmatrix} & :=
\begin{pmatrix}
1 \\
0
\end{pmatrix}
\otimes
\begin{pmatrix}
0 \\
1 \\
0
\end{pmatrix} \\
\begin{pmatrix}
0 \\
0 \\
1 \\
0 \\
0 \\
0
\end{pmatrix} & :=
\begin{pmatrix}
1 \\
0
\end{pmatrix}
\otimes
\begin{pmatrix}
0 \\
0 \\
1
\end{pmatrix} \\
\begin{pmatrix}
0 \\
0 \\
0 \\
1 \\
0 \\
0
\end{pmatrix} & :=
\begin{pmatrix}
0 \\
1
\end{pmatrix}
\otimes
\begin{pmatrix}
1 \\
0 \\
0
\end{pmatrix} \\
\begin{pmatrix}
0 \\
0 \\
0 \\
0 \\
1 \\
0
\end{pmatrix} & :=
\begin{pmatrix}
0 \\
1
\end{pmatrix}
\otimes
\begin{pmatrix}
0 \\
1 \\
0
\end{pmatrix} \\
\begin{pmatrix}
0 \\
0 \\
0 \\
0 \\
0 \\
1
\end{pmatrix} & :=
\begin{pmatrix}
0 \\
1
\end{pmatrix}
\otimes
\begin{pmatrix}
0 \\
0 \\
1
\end{pmatrix}
\end{align}$$
こうすると
$$\begin{align}
\boldsymbol{c} &= 3
\begin{pmatrix}
1 \\
0 \\
0 \\
0 \\
0 \\
0
\end{pmatrix}
+ 4
\begin{pmatrix}
0 \\
1 \\
0 \\
0 \\
0 \\
0
\end{pmatrix}
+ 5
\begin{pmatrix}
0 \\
0 \\
1 \\
0 \\
0 \\
0
\end{pmatrix} \\
& \quad + 6
\begin{pmatrix}
0 \\
0 \\
0 \\
1 \\
0 \\
0
\end{pmatrix}
+ 8
\begin{pmatrix}
0 \\
0 \\
0 \\
0 \\
1 \\
0
\end{pmatrix}
+ 10
\begin{pmatrix}
0 \\
0 \\
0 \\
0 \\
0 \\
1
\end{pmatrix} \\
&=
\begin{pmatrix}
3 \\
4 \\
5 \\
6 \\
8 \\
10
\end{pmatrix}
\end{align}$$
となって明示的にテンソル積の記号が現れない分かりやすい表現を得ることができました。
特に今の場合のように標準基底を用いてベクトルを表現したとき、テンソル積は
$$\begin{equation}
\boldsymbol{c} =
\begin{pmatrix}
1 \cdot 3 \\
1 \cdot 4 \\
1 \cdot 5 \\
2 \cdot 3 \\
2 \cdot 4 \\
2 \cdot 5
\end{pmatrix}
\end{equation}$$
のようにそれぞれのベクトルの成分を掛け合わせて並べるという演算に一致します。
またここで言うベクトルとは列ベクトルに限らず、もっと一般的なものでかまいません。
たとえば標準基底について
$$\begin{align}
\boldsymbol{a} &=
\begin{pmatrix}
a_{11} & a_{12} \\
a_{21} & a_{22} \\
a_{31} & a_{32}
\end{pmatrix}\\
\boldsymbol{b} &=
\begin{pmatrix}
b_{11} & b_{12} \\
b_{21} & b_{22}
\end{pmatrix}
\end{align}$$
と表現します(ただし成分はいずれも複素数)。
するとこれらのテンソル積\( \boldsymbol{c} \)は\( \boldsymbol{a}, \boldsymbol{b} \)それぞれの成分の積を並べた
$$\begin{align}
\boldsymbol{c} &=
\begin{pmatrix}
a_{11} b_{11} & a_{11} b_{12} & a_{12} b_{11} & a_{12} b_{12} \\
a_{11} b_{21} & a_{11} b_{22} & a_{12} b_{21} & a_{12} b_{22} \\
a_{21} b_{11} & a_{21} b_{12} & a_{22} b_{11} & a_{22} b_{12} \\
a_{21} b_{21} & a_{21} b_{22} & a_{22} b_{21} & a_{22} b_{22} \\
a_{31} b_{11} & a_{31} b_{12} & a_{32} b_{11} & a_{32} b_{12} \\
a_{31} b_{21} & a_{31} b_{22} & a_{32} b_{21} & a_{32} b_{22} \\
\end{pmatrix}
\end{align}$$
となります。
これでテンソル積の具体的な計算方法について理解できました。
この演算は多重線形性、すなわち引数となる二つのベクトルに対して、片方(例えば\( \boldsymbol{b} \))を固定してももう一方について線形性を保つという性質を有するようにデザインされています。
これは数式の上では
$$\begin{equation}
\left\{ \,
\begin{aligned}
& (d \boldsymbol{a}) \otimes \boldsymbol{b} = d (\boldsymbol{a} \otimes \boldsymbol{b}) \\
& (\boldsymbol{a} + \boldsymbol{e}) \otimes \boldsymbol{b}
= (\boldsymbol{a} \otimes \boldsymbol{b}) + (\boldsymbol{e} \otimes \boldsymbol{b})
\end{aligned}
\right.
\end{equation}$$
と表現されます。
ただし\( d \)は複素数、\( \boldsymbol{e} := \sum_{i} e_i \boldsymbol{\alpha}_i\)は\( \boldsymbol{a} \)と同じベクトル空間に属するベクトルです。
この性質が本当に成り立っているか実際に確認してみましょう。
一本目の式は
$$\begin{align}
(d \boldsymbol{a}) \otimes \boldsymbol{b}
&= \sum_{i} d a_i \boldsymbol{\alpha}_i \otimes \sum_{j} b_j \boldsymbol{\beta}_j \\
&= \sum_{i} \sum_{j} d a_i b_j (\boldsymbol{\alpha}_i \otimes \boldsymbol{\beta}_j) \\
&= d \sum_{i} \sum_{j} a_i b_j (\boldsymbol{\alpha}_i \otimes \boldsymbol{\beta}_j) \\
&= d (\boldsymbol{a} \otimes \boldsymbol{b})
\end{align}$$
より正しく、また二本目の式も
$$\begin{align}
(\boldsymbol{a} + \boldsymbol{e}) \otimes \boldsymbol{b}
&= \sum_{i} \left( a_i + e_i \right) \boldsymbol{\alpha}_i \otimes \sum_{j} b_j \boldsymbol{\beta}_j \\
&= \sum_{i} \sum_{j} \left( a_i + e_i \right) b_j (\boldsymbol{\alpha}_i \otimes \boldsymbol{\beta}_j) \\
&= \sum_{i} \sum_{j} \left\{ a_i b_j (\boldsymbol{\alpha}_i \otimes \boldsymbol{\beta}_j)
+ e_i b_j (\boldsymbol{\alpha}_i \otimes \boldsymbol{\beta}_j) \right\} \\
&= \sum_{i} \sum_{j} a_i b_j (\boldsymbol{\alpha}_i \otimes \boldsymbol{\beta}_j)
+ \sum_{i} \sum_{j} e_i b_j (\boldsymbol{\alpha}_i \otimes \boldsymbol{\beta}_j) \\
&= (\boldsymbol{a} \otimes \boldsymbol{b}) + (\boldsymbol{e} \otimes \boldsymbol{b})
\end{align}$$
となり正しいので、確かに双線形性が成り立っていることが分かります。
\( \boldsymbol{a} \)を固定しても同様の性質が成り立ちます。
多重線形性という性質の何が嬉しいかと言うと、複数の線形系に対してどの線形性も損なうことなく、一つのセットとして扱えることです。
ここで、量子状態は線形空間の元(=ベクトル)として表せたということを思い出しましょう。
すなわち量子状態はテンソル積の演算の対象です。
二つの異なる量子状態\(| \psi \rangle, | \phi \rangle\)に対して、その合成系は\(| \psi \rangle \otimes | \phi \rangle\)と表せます。
同様に各々の量子状態に作用するユニタリ変換\(U_\psi, U_\phi\)も\(U_\psi \otimes U_\phi\)とすることで合成系に作用する一つのユニタリ変換であるとみなせます。
このとき合成系への新しいユニタリ変換の作用は
\begin{equation*}
(U_\psi \otimes U_\phi) (| \psi \rangle \otimes | \phi \rangle)
= (U_\psi | \psi \rangle) \otimes (U_\phi | \phi \rangle)
\end{equation*}
と定義されます。
この式が意味するのは、まとめた量子状態にまとめた変換を施すのと、それぞれの量子状態に変換を施したものをまとめるのとで違いはないということです。
テンソル積という演算が何らかの物理的な操作を表すのではなく、複数の系をまとめて見るということを表しているだけであることを思うと納得がいくと思います。
二つの量子状態がいつまでも独立であればテンソル積による合成やその逆の分離はいつでもできますが、ここに相互作用が入ってくると、二つの部分に分解できない非自明な状態が発生します。
その相互作用こそが量子もつれであり、量子コンピュータの計算能力の根源です。
では先ほどのパラメトリック下方変換による二光子相関についてテンソル積を用いて表現してみましょう。
二光子相関
量子もつれの表現に移る前に、量子状態のテンソル積の省略表現について触れておきます。
二つの独立した量子系について、その合成系の量子状態は
\begin{equation*}
| \psi \rangle | \phi \rangle := | \psi \rangle \otimes | \phi \rangle
\end{equation*}
と表す。
このように表現しておくと可読性が上がって式が見やすくなります。
ただしこの量子状態に作用する演算子のテンソル積は普通省略しません。
というのも
\begin{equation*}
U_\psi U_\phi = U_\psi \otimes U_\phi
\end{equation*}
としてしまうと普通の行列の意味での積と区別がつかなくなってしまうからです。
さてこのような約束をしておいた上で、パラメトリック下方変換による二光子相関は以下のように表現されます。
\begin{equation*}
| \Psi \rangle = \frac{1}{\sqrt{2}}
(| \rightarrow \rangle | \rightarrow \rangle +| \uparrow \rangle | \uparrow \rangle ) \text{タイプⅠ}
\end{equation*}
\begin{equation*}
| \Psi \rangle = \frac{1}{\sqrt{2}}
(| \rightarrow \rangle | \uparrow \rangle +| \uparrow \rangle | \rightarrow \rangle ) \text{タイプⅡ}
\end{equation*}
これらは\((\alpha | 0 \rangle + \beta | 1 \rangle) \otimes (\gamma | 0 \rangle + \delta | 1 \rangle)\)というような二つの独立した量子状態のテンソル積で書くことはできず、全体の状態を考えなければいけません。
例えばタイプⅠの相関の場合、観測によって\(| \rightarrow \rangle | \rightarrow \rangle\)の状態か\(| \uparrow \rangle | \uparrow \rangle\)の状態が確定する訳ですが、これはつまりもつれた光子の片方を観測して\(| \rightarrow \rangle (| \uparrow \rangle)\)であれば、もう片方の光子を測定したときの状態も\(100 \%\)の確率で\(| \rightarrow \rangle (| \uparrow \rangle)\)であるとわかるということです。
注意
一見、これは観測の結果が離れた場所にある光子に瞬時に(つまり光速を超えて)伝わったように思えます。
微妙な所ですが、実際に離れた場所の光子の量子状態が確定するのは、こちら側の観測の結果を知って測定を行ってからです。
量子論が予言するのはあくまでも量子状態を観測したときの確率や期待値であって、状態そのものではないというのが穏当な解釈でしょうか。
この性質を上手く使えば、自分から離れた場所にいる相手に量子状態を送ることも可能になります。
これがいわゆる「量子テレポーテーション」です(詳しくは次回話します)。
量子状態を相手に送るに当たって古典的な通信を用いるので瞬時の移動とはいきませんが、極めて安全性の高い通信が行えます。
というのも量子状態は観測されると壊れてしまうので、それを以て道中で何者かの盗聴にあったかどうかを知ることができるからです。
このように量子もつれという現象は計算資源としてだけではなく、通信資源としても非常に魅力的なのです。
二体系のユニタリ変換
これまで見てきた通り、「独立な二つの量子系のテンソル積では表せない量子状態(=もつれ状態)」 が存在します。
同様に、それらの状態に作用する 「単純なテンソル積では表せないユニタリ変換」 も存在します。
例えば、次の\(4 \times 4\)行列を考えてみましょう。
$$
U=\left(\begin{array}{llll}
1 & 0 & 0 & 0 \\
0 & 1 & 0 & 0 \\
0 & 0 & 0 & 1 \\
0 & 0 & 1 & 0
\end{array}\right)
$$
これは2量子ビット系の標準的な基底
$$
\{|00\rangle,|01\rangle,|10\rangle,|11\rangle\}
$$
における表現で、行列としてユニタリ(随伴行列との積が恒等行列になる)であることが確認できる。
CNOTゲートとしての解釈
実はこの変換\(U\)は、「制御NOTゲート(CNOTゲート)」と呼ばれる代表的な2量子ビットゲートです。CNOTでは、1つ目の量子ビット(コントロール量子ビット)の状態によって、2つ目の量子ビット(ターゲット量子ビット)を反転させるかどうかが変わります。
- コントロール量子ビットが\(|0\rangle\)なら、ターゲット量子ビットは「何もされない(恒等演算)」。
- コントロール量子ビットが\(|1\rangle\)なら、ターゲット量子ビットは「\(|0\rangle \leftrightarrow|1\rangle\)が反転」される。
ここで便宜上
$$
|\rightarrow\rangle:=|0\rangle=\binom{1}{0}, \quad|\uparrow\rangle:=|1\rangle=\binom{0}{1}
$$
と書き換えておきます。二量子ビット系では、テンソル積
$$
|\rightarrow\rangle|\rightarrow\rangle=|00\rangle, \quad|\rightarrow\rangle|\uparrow\rangle=|01\rangle, \quad|\uparrow\rangle|\rightarrow\rangle=|10\rangle, \quad|\uparrow\rangle|\uparrow\rangle=|11\rangle
$$
を以下の順番で並べた4次元ベクトルとして扱うのが標準的です。
具体的に見てみましょう。
①\(|\rightarrow\rangle|\uparrow\rangle=|01\rangle\) への作用
$$
|\rightarrow\rangle|\uparrow\rangle=\left(\begin{array}{l}
0 \\
1 \\
0 \\
0
\end{array}\right) \quad(\text { 第2成分のみが } 1)
$$
これに先ほどの行列\(U\)を作用させると
$$
U\left(\begin{array}{l}
0 \\
1 \\
0 \\
0
\end{array}\right)=\left(\begin{array}{l}
0 \\
1 \\
0 \\
0
\end{array}\right)=|\rightarrow\rangle|\uparrow\rangle .
$$
変化がないことが分かります。これは「一つ目の量子ビットが\(|\rightarrow\rangle=|0\rangle\)」(コントロールが0)なので、ターゲットは反転されない」ことを意味しています。
②\(|\uparrow\rangle|\rightarrow\rangle=|10\rangle\)への作用
$$
|\uparrow\rangle|\rightarrow\rangle=\left(\begin{array}{l}
0 \\
0 \\
1 \\
0
\end{array}\right) \quad(\text { 第3成分のみが } 1)
$$
これに先ほどの行列\(U\)を作用させると
$$
U\left(\begin{array}{l}
0 \\
0 \\
1 \\
0
\end{array}\right)=\left(\begin{array}{l}
0 \\
0 \\
0 \\
1
\end{array}\right)=|\uparrow\rangle|\uparrow\rangle \quad(=|11\rangle) .
$$
ここでは「1つ目の量子ビットが\(|\uparrow\rangle=|1\rangle\)(コントロールが1)」なので、「二つ目の量子ビットが\(|0\rangle \rightarrow|1\rangle\)に反転」されました。すなわち\(|10\rangle\) が \(|11\rangle\)に変換されたわけです。
まとめると、行列\(U\)は「一つ目の量子ビットが\(|0\rangle\)なら何もしないが、\(|1\rangle\)なら二つ目を反転する」というルールに対応しており、これこそCNOTゲートなのです。
CNOTゲートの意味
CNOTゲートの重要性は「量子コンピュータの複数入力(=複数量子ビット)を操作できる」という点にあります。
1量子ビットのゲート(\(X, Z, H, T\)など)だけでは実用的な計算はほとんどできませんが、CNOTのように 2ビット目の状態を1ビット目の状態で制御 できるゲートを加えることで、初めて「論理演算(ビット間の相互作用)」が実装されます。
実際、「1量子ビットゲート群」+「CNOTゲート」 があれば、任意の量子回路を近似的に実装できる(万能ゲートセット)ことが知られています。これは古典計算における「NANDやNORさえあれば十分」と同様の発想です。
以上のように、もつれた光子対(量子相関)を使うと「片方のビットがもう片方のビットの状態を左右する」ユニタリ変換を作ることができます。CNOTはその代表例であり、量子アルゴリズムの多くで中核的な役割を担うのです。
次回は、このCNOTゲートを活用した 量子アルゴリズム の具体例をPython上でシミュレーションしてみたいと思います。いよいよ「量子コンピュータらしさ」がはっきりと見えてくるので、どうぞお楽しみに。