量子プログラミングの学習を進める上で必要になる前提知識は数々ありますが、いよいよ最後の最重要数学的基盤、「行列」の知識を習得します。
これまでの記事では、量子状態が複素数のベクトルで記述され、その変化が回転(オイラーの公式)によって表されることを学びました。
では、この状態の回転を実際に量子ビットに作用させる「操作(演算)」とは何なのでしょうか。
その答えが、「行列」です。
量子ゲート(NOTゲート、アダマールゲートなど)、つまり「量子コンピュータが行う演算」は、すべて行列という形で表現されます。
本記事では、線形代数全体の知識ではなく、あくまでも量子プログラミングで必須となる計算スキルに対象を絞り込みます。
具体的には、行列とベクトルの積(ゲートの作用)や、エルミート共役など、量子ゲートを扱うために絶対に不可欠な操作に特化して解説します。
この記事は、基本的な量子ゲートの仕組みを完全に理解し、量子計算の核心に踏み込むための最終準備として執筆しました。
目次
第1章:行列とは「量子ゲートの設計図」
① 行列の定義と量子状態
行列(matrix)とは、数や文字を長方形に並べ、括弧でくくったものです。
大学で学ぶ「線形代数」という分野の根幹を成します。
量子プログラミングにおいては、この行列が量子ゲートそのものを表します。
量子計算は、量子ビットの状態(ベクトル)を、量子ゲートという操作(行列)によって別の状態へと変換するプロセスです。
\(|\psi’\rangle = U |\psi\rangle\)
- \(|\psi\rangle\): 量子状態(複素数の縦ベクトル)
- \(U\): 量子ゲート(複素数の行列)
- \(|\psi’\rangle\): 新しい量子状態
量子プログラミングで扱う行列は、ほとんどが正方行列(行数と列数が等しい行列)です。
特に1量子ビットを扱う最も基本的な量子ゲートは、\(2 \times 2\) 行列で表現されます。
1量子ビットを扱う量子ゲートが \(2 \times 2\) 行列である理由
1量子ビットの状態は、2つの基底状態 \(|0\rangle\) と \(|1\rangle\) の重ね合わせで次のとおり表現されます。
\(|\psi\rangle = \alpha |0\rangle + \beta |1\rangle\)
この状態をベクトルで表すと、2行1列の縦ベクトルになります。
\(|\psi\rangle = \begin{pmatrix} \alpha \\ \beta \end{pmatrix}\)
この2行のベクトルを変換するためには、\(2 \times 2\) の行列を掛ける必要があります。
これが、基本的な量子ゲートが \(2 \times 2\) 行列である理由です。
② 行列の表記法と次元
行列の基本を理解するために、その表記法と次元(サイズ)のルールを正確に把握しておく必要があります。
②-1. 行列の次元(サイズ)
行列の次元は「行(row)の数 \(\times\) 列(column)の数」で表されます。
例えば、以下の行列 \(A\) は2行3列であるため、「\(2 \times 3\) 行列」と呼びます。
\(A = \begin{pmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \end{pmatrix}\)
- 行(\(m\)): 水平方向の並び(上から下へ数える)
- 列(\(n\)): 垂直方向の並び(左から右へ数える)
行の数を表す \(m\)、列の数 \(n\) は、行列のサイズ(次元)を抽象的に表現したいとき、または行列が取り得る一般的なサイズを示すときに使われます。
- 定義や公式: 行列 \(A\) が \(m \times n\) 行列であると定義する際や、行列の積などの計算規則を一般化する公式で使われます(例:\(m \times k\) 行列と \(k \times n\) 行列の積)。
- プログラミング: 行列を扱うプログラミングコードやライブラリの説明で、データの構造やループの範囲を示す際に使用されます。
②-2. 要素の表記法
行列の個々の要素(成分)は、一般的に小文字の添え字で表記されます。要素 \(a_{ij}\) は、\(i\) 行目の\(j\) 列目にある値を示します。
\(A = \begin{pmatrix} a_{11} & a_{12} & a_{13} \\ a_{21} & a_{22} & a_{23} \end{pmatrix}\)
この \(i\)(行)と \(j\)(列)という表記は、一般的なプログラミング言語で二次元のデータを扱う際のループカウンターの慣習(外側を \(i\)、内側を \(j\))と同じ考え方に基づいています。
何かしらのプログラミング言語経験があれば、覚えやすいですね。
②-3. 量子ゲートと次元
| 行列の種類 | 次元 | 量子的な役割 |
|---|---|---|
| 量子ゲート | \(2 \times 2\) 行列 | 1量子ビットの操作 (例:NOT、Hadamard) |
| 量子状態 | \(2 \times 1\) 縦ベクトル | 1量子ビットの状態(\(\alpha, \beta\)) |
多量子ビットを扱う場合、次元は指数関数的に増加します。
例えば、2量子ビットを同時に操作するゲートは \(4 \times 4\) 行列となり、状態は \(4 \times 1\) 縦ベクトルとなります。
③ 特別な種類の行列
量子プログラミングにおいては、特定の役割を持つ特別な種類の行列が頻繁に使用されます。
これらは、計算を単純化したり、状態を正しく記述したりするために不可欠です。
③-1. 単位行列(Identity Matrix, \(I\))
単位行列とは、主対角線上の要素が全て 1 で、それ以外の要素が全て 0 である正方行列です。
量子プログラミングでは、「Identity Matrix」の頭文字をとって \(I\) という記号で表されます。
主対角線とは、左上から右下への対角線です。
\(I = \begin{pmatrix} 1 & 0 \\ 0 & 1 \end{pmatrix}\)
- 量子的な役割:
- 単位行列は「Iゲート(Identity Gate)」と呼ばれ、「何もしない」ゲート操作を表します。ある量子状態に単位行列を作用させても、その状態は変化しません。
③-2. ゼロ行列(Zero Matrix, \(O\))
ゼロ行列とは、全ての要素が 0 である行列です。
量子プログラミングでは、文脈に応じて「Null演算」に関連する部分として現れることがあります。
\(O = \begin{pmatrix} 0 & 0 \\ 0 & 0 \end{pmatrix}\)
- 量子的な役割:
- 量子的な役割: 量子計算において、状態の初期化や、複数の量子ビットを扱う際のテンソル積の一部を構成します。
③-3. 対角行列(Diagonal Matrix)
対角行列とは、主対角線以外の要素が全て 0 である正方行列です。
③-1.で解説した「単位行列」も対角行列の一種です。
\(D = \begin{pmatrix} d_1 & 0 \\ 0 & d_2 \end{pmatrix}\)
- 量子的な役割:
- 量子ゲートの中には、量子状態の振幅(確率)を変えずに、位相(回転角度)の操作のみを行うゲートが多数あり、これらは対角行列で表現されます。具体的には、Zゲートや位相ゲート(Phase Gate)などがこの対角行列の構造を持ちます。
第2章:行列演算の基礎と量子ゲート作用
① 行列の和とスカラー倍
行列を理解する次のステップは、基本的な演算(計算)です。
量子プログラミングにおけるゲートの設計や解析には、この基礎演算が必須となります。
①-1. 行列の和(足し算)
行列の和は、同じ次元(行の数と列の数が完全に一致)を持つ行列同士でのみ可能です。
計算方法は非常に単純で、対応する位置にある要素(成分)同士を足し合わせるだけです。
\(A + B\)
\( =\begin{pmatrix} a_{11} & a_{12} \\ a_{21} & a_{22} \end{pmatrix} + \begin{pmatrix} b_{11} & b_{12} \\ b_{21} & b_{22} \end{pmatrix}\)
\( = \begin{pmatrix} a_{11}+b_{11} & a_{12}+b_{12} \\ a_{21}+b_{21} & a_{22}+b_{22} \end{pmatrix}\)
- 量子的な役割:
- 行列の和は、量子ゲートでは同時には適用されませんが、理論計算や、複数の演算子を組み合わせたハミルトニアン(全エネルギー)の記述などで使用されます。
ハミルトニアン (\(H\)) とは、その量子系の全エネルギー(運動エネルギー + ポテンシャルエネルギー)を与える演算子です。
量子力学では、エネルギーが観測可能な物理量として扱われ、その量子系の振る舞い全体を決定づけます。
また、量子プログラミングで実際に使用するユニタリ量子ゲート(\(U\))を導出する際に不可欠です。
①-2. スカラー倍(定数倍)
スカラー倍とは、行列全体に単一の数(スカラー)を掛け合わせる演算です。
計算方法は、スカラー \(k\) を行列の全ての要素に掛け合わせていきます。
\(k A\)
\( = k \begin{pmatrix} a_{11} & a_{12} \\ a_{21} & a_{22} \end{pmatrix}\)
\( = \begin{pmatrix} k a_{11} & k a_{12} \\ k a_{21} & k a_{22} \end{pmatrix}\)
- 量子的な役割:
- スカラー \(k\) が複素数である場合、これは量子状態の位相(回転角度)や、規格化(ベクトルの長さの調整)に関連して使われます。
② 行列の積(掛け算):量子ゲートの連続操作
行列の積は、行列の中で最も重要な演算のひとつであり、量子プログラミングにおいては複数の量子ゲートを連続して適用する操作に相当します。
②-1. 積が可能な次元のルール
行列の積 \(AB\) を計算するためには、行列 \(A\) の列の数と、行列 \(B\) の行の数が必ず一致していなければなりません。
\(\mathbf{A}_{(m \times \mathbf{k})} \cdot \mathbf{B}_{(\mathbf{k} \times n)} = \mathbf{C}_{(m \times n)}\)
- 量子ゲートの連続操作:
- 2つの量子ゲート \(U_1\) と \(U_2\) を連続して作用させる場合、積 \(U_2 U_1\) を計算します。1量子ビットゲートは全て \(2 \times 2\) 行列であるため、このルールは常に満たされます。
②-2. 計算の仕組み
行列 \(A\) と \(B\) の積 \(C = AB\) の要素 \(c_{ij}\) は、\(A\) の \(i\) 行目の要素と、\(B\) の \(j\) 列目の要素を、順番に掛け合わせて足し合わせる(内積を取る)ことで計算されます。
\(\begin{pmatrix} a_{11} & a_{12} \\ a_{21} & a_{22} \end{pmatrix} \begin{pmatrix} b_{11} & b_{12} \\ b_{21} & b_{22} \end{pmatrix} = \)
\(\begin{pmatrix} a_{11}b_{11} + a_{12}b_{21} & a_{11}b_{12} + a_{12}b_{22} \\ a_{21}b_{11} + a_{22}b_{21} & a_{21}b_{12} + a_{22}b_{22} \end{pmatrix}\)
②-3. 行列の積と順序
行列の積は、順番を入れ替えると結果が変わるのが一般的です(非可換)。
\(B \neq BA\)
- 可換の例外:
- ただし、単位行列や対角行列など、特定の性質を持つ行列同士の積は可換(\(AB = BA\))となります。量子プログラミングでは、この順序を入れ替えても結果が変わらないかどうかを交換関係として扱います。
- 量子的な役割:
- 量子ゲートの操作は順序が重要であり、ゲート \(U_1\) の後に \(U_2\) を適用する操作(\(\psi’ = U_2 U_1 \psi\))と、 \(U_2\) の後に \(U_1\) を適用する操作(\(\psi” = U_1 U_2 \psi\))は、結果が異なります。
③ 行列とベクトルの積:量子状態の変換
量子プログラミングにおいて、行列とベクトルの積は前セクションの「行列の積」と並び最も重要な演算です。
行列 \(U\) が量子状態 \(|\psi\rangle\) というベクトルに作用し、新しい量子状態 \(|\psi’\rangle\) へと変換する操作を記述します。
\(\mathbf{U} |\psi\rangle = |\psi’\rangle\)
③-1. 積が可能な次元のルール
行列とベクトルの積 \(U |\psi\rangle\) が可能であるためには、行列 \(U\) の列の数と、ベクトル \(|\psi\rangle\) の行の数が一致していなければなりません。
量子ビットの場合、ゲート \(U\) は \(2 \times 2\) 行列、状態 \(|\psi\rangle\) は \(2 \times 1\) 縦ベクトルであり、この条件は常に満たされます。
\(\mathbf{U}_{(2 \times \mathbf{2})} \cdot |\psi\rangle_{(\mathbf{2} \times 1)} = |\psi’\rangle_{(2 \times 1)}\)
③-2. 計算の仕組み
行列とベクトルの積は、行列の各行と、ベクトルの列(ベクトルの場合は1列しかない)の内積を取ることで計算されます。
最終的な結果は、元のベクトルと同じ次元を持つ新しいベクトルになります。
\(\begin{pmatrix} a & b \\ c & d \end{pmatrix} \begin{pmatrix} \alpha \\ \beta \end{pmatrix} =\)
\(\begin{pmatrix} a\alpha + b\beta \\ c\alpha + d\beta \end{pmatrix}\)
- 量子的な役割:
- この計算は、入力状態の振幅(\(\alpha, \beta\))を、量子ゲート \(U\) の要素(\(a, b, c, d\))に従って線形結合(掛け算と足し算)することで、新しい振幅(\(\alpha’, \beta’\))を生み出します。
第3章:量子プログラミングに不可欠な特殊演算
① 行列の転置(Transpose, \(A^T\))
転置とは、行列の行と列を入れ替える単純な操作ですが、ユニタリ演算子や、本章セクション③で後述するエルミート共役(Hermitian conjugate)を理解するための基礎知識です。
①-1. 転置の計算方法
行列 \(A\) の転置は \(A^T\) と表記されます。転置の計算は、元の行列の \(i\) 行 \(j\) 列の要素 \(a_{ij}\) を、新しい行列の \(j\) 行 \(i\) 列の位置 \(a^T_{ji}\) へ移動させる操作です。
ただし、\(i=j\) の要素は、位置が変わりません。
\( \quad A = \begin{pmatrix} a_{11} & a_{12} \\ a_{21} & a_{22} \end{pmatrix} \)
\(\rightarrow A^T = \begin{pmatrix} a_{11} & a_{21} \\ a_{12} & a_{22} \end{pmatrix}\)
\(a_{11}\)(1行1列)や \(a_{22}\)(2行2列)のように \(i=j\) の要素は、位置が変わっていないことがわかります。
①-2. ベクトルの転置とブラケット記法
転置操作は、量子状態を表すベクトルで特に重要になります。
量子状態は通常、縦ベクトル(ケット・ベクトル \(|\psi\rangle\))で表されますが、これに転置を施すと横ベクトル(\(|\psi\rangle^T\))になります。
\(|\psi\rangle = \begin{pmatrix} \alpha \\ \beta \end{pmatrix}\)
\( \rightarrow \quad |\psi\rangle^T = \begin{pmatrix} \alpha & \beta \end{pmatrix}\)
- 量子的な役割:
- ブラケット記法(\(\langle \psi | \phi \rangle\))では、内積を計算するために、ブラ・ベクトル \(\langle \psi |\) が必要になります。このブラ・ベクトルは、転置と、次に学ぶ複素共役を組み合わせた操作によって作られます。
② 行列の複素共役(Complex Conjugate, \(A^*\))
量子プログラミングで扱う行列(量子ゲート)やベクトル(量子状態)は、ほとんどの場合、複素数を要素として持ちます。
そのため、行列の複素共役を計算するスキルは不可欠です。
②-1. 数の複素共役(\(z^*\))とは
複素共役とは、複素数 \(z\) の虚数単位 \(i\) の前の符号を反転させる操作です。
- 複素数 \(z = a + bi\) の複素共役は \(z^* = a – bi\) となります。
- 例:\(3 + 4i\) の複素共役は \(3 – 4i\) です。
- 実数(虚部がない数)の複素共役は、符号を反転させる虚部がないため、その実数自身になります。
- 例:\(5\) の複素共役は \(5\) です。
②-2. 複素共役の計算方法
行列 \(A\) の複素共役は \(A^*\) または \(\bar{A}\) と表記されます。
計算方法は、行列の全ての要素に含まれる複素数に対し、その複素共役を取るだけです。
複素数 \(z = a + bi\) の共役 \(z^*\) は、虚数単位 \(i\) の前の符号を反転させた \(a – bi\) となります。(前の記事『大人の学び直し数学⑤:虚数 \(i\) と複素数』を参照)
\(A = \begin{pmatrix} 1+2i & 3 \\ 4i & 5-6i \end{pmatrix}\)
\(\rightarrow \quad A^* = \begin{pmatrix} 1-2i & 3 \\ -4i & 5+6i \end{pmatrix}\)
②-3. 複素共役の量子的な役割
複素共役は、量子計算における確率の計算と、次セクションで解説するエルミート共役の理解に不可欠です。
- 確率の計算: 量子力学では、ある状態を観測する確率は、その状態の振幅(複素数)と、その複素共役を掛け合わせることで得られます(ボルンの規則)。
- エルミート共役の構成: 転置と複素共役を組み合わせることで、ユニタリ性(操作の可逆性)を保証するエルミート共役が完成します。
③ エルミート共役(Hermitian Conjugate, \(A^\dagger\)):ブラ・ベクトルを作る操作
エルミート共役(あるいは随伴演算子)は、量子プログラミングで最も頻繁に使用される特殊演算のひとつと言えます。
これは、単なる計算ではなく、量子力学における確率の計算とユニタリ性(操作の可逆性)を保証するために不可欠です。
③-1. エルミート共役の計算方法
行列 \(A\) のエルミート共役は \(A^\dagger\)(ダガーと読む)と表記されます。
これは、「転置」と「複素共役」の2つの操作を組み合わせることで計算され、どちらの操作を先に実行しても結果は同じになります。
\(A^\dagger = (A^T)^* = (A^*)^T\)
計算手順は次の通りです。
- 元の行列 \(A\) の転置(行と列を入れ替え)を行う。
- 転置後の行列の全ての要素について複素共役を取る。
計算の例:行列 \(A\) のエルミート共役 \(A^\dagger\) は以下のようになります。
\(A = \begin{pmatrix} 1+i & 2 \\ 3i & 4-i \end{pmatrix}\)
\(\rightarrow \quad A^\dagger = \begin{pmatrix} 1-i & -3i \\ 2 & 4+i \end{pmatrix}\)
③-2. ブラ・ベクトル(\(\langle \psi |\))の生成
エルミート共役の最も重要な役割は、ケット・ベクトル \(|\psi\rangle\) から、ブラケット記法に必要なブラ・ベクトル \(\langle \psi |\) を生成することです。
\(\langle \psi | = |\psi\rangle^\dagger\)
\(\langle \psi |\) が生成されることで、量子状態の「内積」 \(\langle \psi | \phi \rangle\)(2つの状態の重なりの度合い、すなわち確率の基礎)を計算できるようになります。
まとめ
本記事で学んだ「行列の基礎」と「特殊演算」が、量子プログラミングにおいて極めて重要である理由を改めて整理し、量子計算の全体像を確認します。
① 量子ゲートは「行列」そのもの
古典コンピュータのNOTゲートやANDゲートが論理回路で表現されるのに対し、量子コンピュータの量子ゲート(NOT、Hadamard、\(Z\) など)は、全て複素数を要素とする行列という形で表現されています。
つまり、行列の計算を理解することは、量子ゲートの設計図と動作原理そのものを理解することに他なりません。
② 演算は「行列とベクトルの積」
量子計算の実行とは、量子状態(ベクトル)を量子ゲート(行列)によって変換する操作です。
数学的には「行列とベクトルの積」という一つの演算に集約されます。
- 量子計算: \(|\psi’\rangle = U |\psi\rangle\)
- 数学演算: \(\begin{pmatrix} \alpha’ \\ \beta’ \end{pmatrix} = \begin{pmatrix} a & b \\ c & d \end{pmatrix} \begin{pmatrix} \alpha \\ \beta \end{pmatrix}\)
行列計算スキルは、量子プログラミングにおける「演算スキル」そのものです。
③ 信頼性を保証する「エルミート共役」
量子計算が常に確率を保存し、操作が可逆である(ユニタリ性)ことを保証するために、量子ゲートはユニタリ行列でなければなりません。
ユニタリ行列の定義には、本章で学んだエルミート共役 (\(A^\dagger\))が不可欠です。
\(U^\dagger U = I\)
ユニタリ行列の仕組みを理解するためにも、エルミート共役の計算能力は最重要知識と言えます。
最後に
本記事では、「線形代数」という広範な学問から、量子プログラミングに不可欠な最小限の行列計算スキルを習得しました。
「大人の学び直し数学」シリーズを通して、量子力学や量子プログラミングの学習に必要となる数学的基盤が整いました。
ここからは、実際の量子プログラミングの世界に踏み込んでいくことができます。
HadamardゲートやPauli-Xゲートなど、基本的なゲートの行列を状態ベクトルに作用させ、量子計算がどのように行われるのかを徹底的に実践しましょう。


コメント