量子ゲートの計算を線形代数でやさしく理解する
はじめに
量子コンピュータの計算は、私たちの身近にある古典コンピュータとは全く異なる原理に基づいています。古典コンピュータが0と1のビットを使って計算するのに対し、量子コンピュータは「量子ビット」という特殊な単位を使います。
この量子ビットの状態や、量子コンピュータが行う「量子ゲート」と呼ばれる操作を理解する上で、線形代数の考え方が非常に役立ちます。大学で線形代数を学んだ方であれば、その知識を量子コンピュータの理解に応用することができます。
この記事では、量子コンピュータの計算の基本である量子ゲートが、線形代数ではどのように表現され、計算が行われるのかを、具体的な例を通してやさしく解説します。線形代数の基礎知識を量子コンピュータの理解に繋げたいと考えている方にとって、この記事がその一歩となることを願っています。
量子状態をベクトルで表現する
古典ビットが「0」か「1」のどちらかの状態をとるのに対し、量子ビットは「0」と「1」の「重ね合わせ」の状態をとることができます。この量子ビットの状態を表現するために、線形代数のベクトルを用います。
-
基底ベクトル: 古典的な状態である「0」と「1」は、それぞれ2次元の縦ベクトルで表現されます。これを量子状態の「計算基底」と呼びます。
- 状態 $|0\rangle$ は $\begin{pmatrix} 1 \ 0 \end{pmatrix}$
- 状態 $|1\rangle$ は $\begin{pmatrix} 0 \ 1 \end{pmatrix}$ ここで使っている $| \cdot \rangle$ という記号は、量子力学で量子状態を表す際によく使われる「ケット記法」と呼ばれるものです。
-
重ね合わせ状態: 量子ビットは $|0\rangle$ と $|1\rangle$ の重ね合わせ状態をとることができます。これは、上記の基底ベクトルの線形結合(足し合わせ)として表現されます。
- 一般的な1量子ビットの状態 $|\psi\rangle$ は、 $|\psi\rangle = \alpha |0\rangle + \beta |1\rangle$ と書けます。
- ベクトルで表すと $|\psi\rangle = \alpha \begin{pmatrix} 1 \ 0 \end{pmatrix} + \beta \begin{pmatrix} 0 \ 1 \end{pmatrix} = \begin{pmatrix} \alpha \ \beta \end{pmatrix}$ となります。
ここで、$\alpha$と$\beta$は複素数です。これらの係数は、その量子状態を観測したときに $|0\rangle$ や $|1\rangle$ が得られる確率と関連しています。具体的には、状態を観測したときに $|0\rangle$ が得られる確率は $|\alpha|^2$、 $|1\rangle$ が得られる確率は $|\beta|^2$ となります。確率の合計は1になる必要があるため、$|\alpha|^2 + |\beta|^2 = 1$ という条件(これを規格化条件と呼びます)を満たさなければなりません。
例えば、重ね合わせ状態としてよく登場する $|+\rangle$ 状態は、 $|+\rangle = \frac{1}{\sqrt{2}}|0\rangle + \frac{1}{\sqrt{2}}|1\rangle$ と表現され、ベクトルでは $\begin{pmatrix} 1/\sqrt{2} \ 1/\sqrt{2} \end{pmatrix}$ となります。この状態を観測すると、50%の確率で $|0\rangle$、50%の確率で $|1\rangle$ が得られます。
量子ゲートを行列で表現する
古典コンピュータの論理ゲート(AND, OR, NOTなど)がビットの状態を変化させるように、量子ゲートは量子ビットの状態を変化させます。量子コンピュータの計算は、この量子ゲートを順に適用していくことによって行われます。
線形代数では、ベクトルの状態を変換する操作は「行列」で表現されます。量子ゲートも例外ではなく、量子ゲートは量子状態ベクトルに作用する「行列」として表現されます。特に、量子ゲートに対応する行列は「ユニタリー行列」と呼ばれる特別な性質を持つ行列である必要があります。ユニタリー行列とは、自身とエルミート共役(転置して複素共役をとったもの)をかけたときに単位行列になる行列のことです。この性質は、量子計算における確率の合計が常に1であることなど、量子力学的な性質を保つために重要です。
代表的な1量子ビットゲートを行列で見てみましょう。
-
NOTゲート(Xゲート): 古典NOTゲートのように、$|0\rangle$を$|1\rangle$に、$|1\rangle$を$|0\rangle$に変換するゲートです。
- 行列表現: $X = \begin{pmatrix} 0 & 1 \ 1 & 0 \end{pmatrix}$
- 計算例: $X |0\rangle = \begin{pmatrix} 0 & 1 \ 1 & 0 \end{pmatrix} \begin{pmatrix} 1 \ 0 \end{pmatrix} = \begin{pmatrix} 0 \cdot 1 + 1 \cdot 0 \ 1 \cdot 1 + 0 \cdot 0 \end{pmatrix} = \begin{pmatrix} 0 \ 1 \end{pmatrix} = |1\rangle$ $X |1\rangle = \begin{pmatrix} 0 & 1 \ 1 & 0 \end{pmatrix} \begin{pmatrix} 0 \ 1 \end{pmatrix} = \begin{pmatrix} 0 \cdot 0 + 1 \cdot 1 \ 1 \cdot 0 + 0 \cdot 1 \end{pmatrix} = \begin{pmatrix} 1 \ 0 \end{pmatrix} = |0\rangle$
-
アダマールゲート(Hゲート): 量子コンピュータでよく使われるゲートで、計算基底の状態$|0\rangle, |1\rangle$を重ね合わせ状態に変換します。
- 行列表現: $H = \frac{1}{\sqrt{2}} \begin{pmatrix} 1 & 1 \ 1 & -1 \end{pmatrix}$
- 計算例: $H |0\rangle = \frac{1}{\sqrt{2}} \begin{pmatrix} 1 & 1 \ 1 & -1 \end{pmatrix} \begin{pmatrix} 1 \ 0 \end{pmatrix} = \frac{1}{\sqrt{2}} \begin{pmatrix} 1 \ 1 \end{pmatrix} = \frac{1}{\sqrt{2}} (|0\rangle + |1\rangle) = |+\rangle$ $H |1\rangle = \frac{1}{\sqrt{2}} \begin{pmatrix} 1 & 1 \ 1 & -1 \end{pmatrix} \begin{pmatrix} 0 \ 1 \end{pmatrix} = \frac{1}{\sqrt{2}} \begin{pmatrix} 1 \ -1 \end{pmatrix} = \frac{1}{\sqrt{2}} (|0\rangle - |1\rangle) = |-\rangle$
これらの例からわかるように、量子ゲートを量子状態に作用させる計算は、対応する行列を量子状態ベクトルに左からかける(行列とベクトルの積を計算する)というシンプルな線形代数操作で表現できます。
複数の量子ゲートを適用する
実際の量子計算では、複数の量子ゲートを順番に量子ビットに適用していきます。これは、対応する行列を順番に量子状態ベクトルに左からかけていくことに相当します。
例えば、まずアダマールゲート(H)を適用し、次にNOTゲート(X)を適用する場合、初期状態$|\psi_{init}\rangle$からの最終状態$|\psi_{final}\rangle$は次のように計算されます。
$|\psi_{final}\rangle = X (H |\psi_{init}\rangle) = (X H) |\psi_{init}\rangle$
これは行列の積$XH$を計算し、それを初期状態ベクトルに作用させることと同じです。行列の積は結合法則が成り立ちますが、一般に交換法則は成り立ちません($XH \neq HX$)。これは、量子ゲートの適用順序が計算結果に影響することを示しています。
多量子ビット系の表現とゲート
複数の量子ビットを扱う場合、その状態ベクトルはそれぞれの量子ビットの状態ベクトルの「テンソル積」(またはクロネッカー積)という演算を使って表現されます。
例えば、2つの量子ビットがあり、1つ目が$|\psi_1\rangle$、2つ目が$|\psi_2\rangle$の状態にあるとき、系全体の複合状態は$|\psi_1\rangle \otimes |\psi_2\rangle$と書かれます(しばしば $|\psi_1\psi_2\rangle$ と略記されます)。
ベクトルで考えると、2つの1量子ビット状態 $\begin{pmatrix} \alpha_0 \ \beta_0 \end{pmatrix}$ と $\begin{pmatrix} \alpha_1 \ \beta_1 \end{pmatrix}$ のテンソル積は、4次元ベクトル $\begin{pmatrix} \alpha_0 \begin{pmatrix} \alpha_1 \ \beta_1 \end{pmatrix} \ \beta_0 \begin{pmatrix} \alpha_1 \ \beta_1 \end{pmatrix} \end{pmatrix} = \begin{pmatrix} \alpha_0 \alpha_1 \ \alpha_0 \beta_1 \ \beta_0 \alpha_1 \ \beta_0 \beta_1 \end{pmatrix}$ となります。
2量子ビットに作用する量子ゲート(例えばCNOTゲートやSWAPゲートなど)も、4x4のユニタリー行列で表現されます。これらのゲートが複合状態ベクトルに作用する様子も、行列とベクトルの積として計算できます。
例えば、CNOTゲートは制御ビットが $|1\rangle$ のときだけ標的ビットにXゲートを適用するゲートです。計算基底 $|00\rangle, |01\rangle, |10\rangle, |11\rangle$ に対応するベクトル $\begin{pmatrix} 1 \ 0 \ 0 \ 0 \end{pmatrix}, \begin{pmatrix} 0 \ 1 \ 0 \ 0 \end{pmatrix}, \begin{pmatrix} 0 \ 0 \ 1 \ 0 \end{pmatrix}, \begin{pmatrix} 0 \ 0 \ 0 \ 1 \end{pmatrix}$ を考えると、CNOTゲートの行列表現は次のようになります。
$CNOT = \begin{pmatrix} 1 & 0 & 0 & 0 \ 0 & 1 & 0 & 0 \ 0 & 0 & 0 & 1 \ 0 & 0 & 1 & 0 \end{pmatrix}$
この行列を使って、例えば初期状態$|10\rangle$(制御ビットが $|1\rangle$、標的ビットが $|0\rangle$)にCNOTゲートを適用する計算は、
$CNOT |10\rangle = \begin{pmatrix} 1 & 0 & 0 & 0 \ 0 & 1 & 0 & 0 \ 0 & 0 & 0 & 1 \ 0 & 0 & 1 & 0 \end{pmatrix} \begin{pmatrix} 0 \ 0 \ 1 \ 0 \end{pmatrix} = \begin{pmatrix} 0 \ 0 \ 0 \ 1 \end{pmatrix} = |11\rangle$
となり、制御ビットが $|1\rangle$ の場合に標的ビットの状態が反転していることが線形代数の計算で確認できます。
まとめ
量子コンピュータの計算は、量子状態をベクトルで、量子ゲートを行列で表現し、行列とベクトルの積として記述することができます。線形代数の知識は、1量子ビットや多量子ビットの状態変化を追跡し、量子アルゴリズムがどのように機能するのかを数学的に理解するための強力なツールとなります。
この記事で紹介した内容は量子計算のごく基本的な部分ですが、より複雑な量子アルゴリズムや量子回路も、基本的にはこれらの線形代数的な操作の組み合わせとして解析されます。量子コンピューティングを深く学んでいく上で、線形代数の概念は常に中心的な役割を果たします。
線形代数を学んだ経験がある方は、ぜひこの視点から量子コンピューティングの世界を覗いてみてください。きっと、その奥深さと論理的な美しさに触れることができるでしょう。