はじめに
前回は、機械としての量子コンピュータについて、物理方式、制御、測定、誤り訂正あたりをざっくり整理しました。
今回は第3回、量子回路を見ていきます。
量子コンピュータを勉強していると、|0⟩、H、CNOT、テンソル積、ユニタリ行列みたいな記号が出てきます。 数学的な新しい概念で、迷子になりがちですが、ここでわからなくなるのは、「情報はどこに載っているのか」です。
1 qubit や 2 qubit くらいなら、|0⟩, |1⟩, |00⟩, |01⟩, |10⟩, |11⟩ と手で並べられるので、なんとなくわかった気になれます。でも n qubit と言われた瞬間に、ベクトル要素は「n 個なのか、2n個なのか、2^n 個なのか」等で一気に迷子になります。
特に厄介なのは、qubit の数とビット列の桁数、状態ベクトルの要素数が一致しないことです。ここがズレていることに気づけないまま読むと、以降の説明がずっと噛み合わなくなります。自分はここで何度も混乱しました。この記事を書きながらも混乱してます。。。
古典ビットなら、情報は 0 か 1 という値そのものに載っています。一方、量子回路では、|0⟩ や |1⟩ のような基本パターンそれぞれに対応する確率振幅に情報が載ります。状態はベクトルで表し、ゲートはそのベクトルを変える行列として表します。もう意味わかんないですよね。。。
この記事では、特に「なぜ n qubit の状態が長さ 2^n のベクトルになるのか」、「ビット列、ベクトル、行列がどうつながっているのか」を中心に整理します。
量子回路は状態、ゲート、測定で見る
量子回路をものすごくざっくり書くと、次の流れです。
初期状態を用意する → 量子ゲートで状態を変える → 測定して古典ビットとして読む。
量子回路では、qubit の状態をベクトルとして表し、ゲートを行列として表し、測定で確率的に結果を取り出します。まずは「状態 = ベクトル」「ゲート = 行列」「測定 = 確率的な読み出し」と分けて見ると理解しやすいです。
1 qubit は長さ2のベクトル
1 qubit の状態を表すときは、まず |0⟩ と |1⟩ という2つの基本パターンを用意します。これを基底状態と呼びます。基底状態は、状態を表すための座標軸みたいなものです。平面上の点を x 軸方向と y 軸方向の成分で表すように、1 qubit の状態を |0⟩ 方向と |1⟩ 方向の成分で表します。
ベクトルで書くとこうです。
|0⟩ = [1, 0]
|1⟩ = [0, 1]
一般の1 qubit 状態は、次のように書けます。
α|0⟩ + β|1⟩
α と β は確率振幅です。測定して 0 が出る確率は |α|²、1 が出る確率は |β|² です。つまり、1 qubit の状態は「|0⟩ と |1⟩ に対応する振幅を1つずつ持つ」と見られます。
n qubit はなぜ長さ 2^n のベクトルなのか
2 qubit では、それぞれの qubit の基底状態の組み合わせを考えます。
|0⟩⊗|0⟩ = |00⟩
|0⟩⊗|1⟩ = |01⟩
|1⟩⊗|0⟩ = |10⟩
|1⟩⊗|1⟩ = |11⟩
つまり、各 qubit の基底状態の組み合わせを作っています。ここで出てくる ⊗ がテンソル積です。数学的な新しい概念で混乱しがちですが、組み合わせを演算子にしたイメージです。余計混乱させちゃってるかもですが。。。2 qubit なら、各 qubit に 0 / 1 の2通りがあるので、基底状態は 2 × 2 = 4 個です。n qubit では、
2 × 2 × ... × 2 = 2^n
なので、基底状態は 2^n 個あります。nでも2n でもありません。n 個の qubit それぞれに2成分あるから 2n、と並べたくなりますが、量子状態は qubit ごとの成分を単純に連結するのではなく、基底状態の組み合わせ全体それぞれに振幅を持ちます。
任意の n qubit 状態は、この 2^n 個の基底状態の重ね合わせとして表されます。
各基底状態 |x⟩ に確率振幅 α_x が1つずつ必要なので、状態ベクトルの長さは 2^n になります。
整理すると、こうです。
| 見ているもの | 数 |
|---|---|
| qubit の数 | n |
| 量子回路図の線の本数 | n |
| 各 qubit の基底状態数 | 2 |
| 全体の基底状態数 | 2^n |
| 状態ベクトルの要素数 | 2^n |
回路図の線は n 本なのに、状態ベクトルは 2^n 要素です。この「見た目の本数」と「内部で持っている振幅の数」が一致しないところが、かなり混乱ポイントだと思います。
ここで注意したいのは、一般の n qubit 状態は「各 qubit の状態をただ並べたもの」とは限らないことです。
たとえば次の状態は、2 qubit の状態ですが、1つ目の qubit の状態と2つ目の qubit の状態に分けて書けません。
(|00⟩ + |11⟩) / √2
これがもつれ状態です。テンソル積は、複数 qubit の基底状態の組み合わせを作るためにも、その上の重ね合わせを扱うためにも使われます。
ゲートは状態ベクトルを変える行列
量子ゲートは、状態ベクトルに作用する行列です。1 qubit の状態ベクトルは長さ2なので、1 qubit ゲートは基本的に 2×2 行列です。2 qubit 全体に作用するゲートは、状態ベクトルが長さ4なので 4×4 行列になります。各種ゲートは、まじめに本を読んでもらうのがよいとおもいますが、サイズがどうなってるかをおさえておくのが重要かと思います。
| ゲート | 対象 | 状態ベクトル長 | 行列サイズ |
|---|---|---|---|
| X | 1 qubit | 2 |
2×2 |
| H | 1 qubit | 2 |
2×2 |
| CNOT | 2 qubit | 4 |
4×4 |
| n qubit 全体の操作 | n qubit | 2^n |
2^n × 2^n |
個々のゲートの行列や計算は、ここでは深入りしません。同じことをもう一度言いますが、n quibitとそれぞれのサイズの関係を抑えて、学ぶことが重要かと思います。
測定は「状態を読む」けれど、全部は読めない
測定すると、量子状態は古典ビットとして読み出されます。たとえば次の状態を測定すると、0 と 1 がそれぞれ 50% の確率で出ます。
(|0⟩ + |1⟩) / √2
ここで大事なのは、測定は単なるログ出力ではないということです。測定した瞬間、重ね合わせ状態から古典的な結果に変わります。なので量子アルゴリズムでは、測定前に欲しい答えの確率が高くなるように状態を作ります。ここが「全パターンを並列に試して全部読む」ではないポイントです。
回路とアルゴリズムは同じではない
量子回路を少し書けるようになると、それだけで量子コンピュータ、量子アルゴリズムを理解した気になりがちですが、量子回路はあくまで表現方法です。H、CNOT、測定がわかることと、Shor や Grover の量子アルゴリズムが何をしているかは別の話です。道のりが長いですよね。。。
古典コンピュータでも、AND、OR、NOT、XOR のようなロジック回路や、加算器の作り方がわかることと、ソート、探索、暗号、機械学習のアルゴリズムがわかることは別です。ロジック回路は計算を実現する部品や表現方法であって、「どんな問題をどう解くか」はその上のレイヤーにあります。
Qiskit で書くと、ベル状態(マックスもつれ状態)を作る回路は qc.h(0)、qc.cx(0, 1)、qc.measure(...) くらいで書けます。ただ、それはあくまで回路の記述です。量子アルゴリズムでは、問題の構造をどう振幅や位相に埋め込み、どう干渉させて、欲しい答えの確率を上げるかが重要になります。
(ただ悩ましいことに、変分法と呼ばれるようなアルゴリズムでは、パラメータ付き回路を古典最適化で調整する違うアプローチをするタイプもあるようです。)
ここらの量子アルゴリズムについては、うまく説明できるかあやしいですが、次回のお楽しみで。
おわりに
今回は、量子回路を「状態・ゲート・測定」に分けて整理しました。
次のように見ると迷子になりにくいと思います。
- 状態はベクトル
- ゲートは状態を変える行列
- 測定は確率的な読み出し
- n qubit の基底状態は 2^n 個ある
- 各基底状態に振幅が1つずつあるので、状態ベクトルは長さ 2^n になる
- 振幅の符号や位相が干渉に効く
- 一般の n qubit 状態は、各 qubit の状態を並べただけとは限らない
- 回路がわかることとアルゴリズムがわかることは別
量子回路は、物理とアルゴリズムの間にある重要なレイヤーです。「状態をどう表し、ゲートでどう動かし、測定でどう読むか」を押さえると、量子コンピュータの話が立体的に見えてきます。
次は、量子アルゴリズム編として、Shor や Grover は何をしているのか、何に効いて何に効かないのかを整理する予定です。
毎回言い訳してみたいですみませんが、間違いや違和感があれば教えてもらえるとうれしいです。
