第2章回路図の読み書き
この章の目標
- 回路図を数式(行列とテンソル積の式)に正確に翻訳できるようになる
- 「回路は左から右、行列は右から左」の順序反転を体に入れる
- 並列(テンソル積)と直列(行列積)を混同しなくなる
- 基本的な回路の等価変形(恒等式)を使えるようになる
2.1 回路図の文法
回路図の構成要素は少数です:
- 横線(ワイヤ)=量子ビット。上から $q_0, q_1, \dots$。左端に初期状態(通常 $|0\rangle$)。
- 箱=ゲート。ワイヤ上に置かれ、左から右の順に作用する。
- 時間=左から右へ流れる。同じ縦位置にあるゲートは同時(並列)。
- メーター記号=測定。以降は二重線(古典ビット)になる(第4章)。
この教材ではQiskitのテキスト描画と同じASCII形式を使います:
q0: |0⟩ ──[H]──[T]──[H]──
これは「$|0\rangle$ に $H$、次に $T$、次に $H$」。数式では作用の順に右から左へ積むので: $$|\psi_{\text{out}}\rangle = H\, T\, H\, |0\rangle$$ 回路図とは逆順になります。ここが回路読みの事故多発地点です。「回路の右端のゲート=式の左端の行列」と何度も唱えてください。
2.2 並列はテンソル積、ワイヤ素通りは $I$
複数ワイヤの回路では、同じ時刻の縦1列がひとつの行列(各ワイヤのゲートのテンソル積)になります。ゲートのないワイヤは $I$ を補います:
q0: |0⟩ ──[H]──────●──
│
q1: |0⟩ ──────[X]──⊕──
1列目は $H \otimes I$、2列目は $I \otimes X$、3列目はCNOT(記号は第3章)。全体は $$|\psi_{\text{out}}\rangle = \mathrm{CNOT}\,(I \otimes X)(H \otimes I)|00\rangle$$ なお $H \otimes I$ と $I \otimes X$ は別のワイヤに作用するので可換で、1列目と2列目はまとめて $H \otimes X$(1列)と書いても同じです(演習2-3)。
縦方向=テンソル積(空間、$\otimes$)、横方向=行列積(時間、通常の積)。回路図が読みやすいのは、この2種類の積を平面の2方向に割り当てているからです。逆に、任意の回路は「縦1列ずつのユニタリの積」として機械的に1本の式に落ちます。回路を見たら式に、式を見たら回路に、両方向の翻訳を訓練するのが本章の演習です。
2.3 回路の等価変形 — 恒等式のストック
同じユニタリを与える回路は無数にあり、簡単な恒等式で書き換えられます。頻出のものをストックしておきましょう(すべてステップ1で計算済みか、演習で確認します):
| 恒等式 | 意味 |
|---|---|
| $HH = XX = ZZ = YY = I$ | 2連打は消せる(自己逆) |
| $HZH = X$, $HXH = Z$ | $H$ で挟むとX⇄Zが入れ替わる(基底変換) |
| $S^2 = Z$, $T^2 = S$ | 位相ゲートの分解・合成 |
| $XZ = -ZX$ | 同一ワイヤ上の $X$ と $Z$ は順序を変えると符号が出る(反可換) |
| $(A \otimes I)(I \otimes B) = A \otimes B = (I \otimes B)(A \otimes I)$ | 別ワイヤのゲートは自由にスライドできる |
実機ではゲート数(特に深さ=横方向の長さ)がエラー率に直結するため、こうした書き換えで回路を短くする「回路最適化」が重要になります。コンパイラの気持ちが分かる程度に、手で書き換えられるようになっておきましょう。
from qiskit import QuantumCircuit
from qiskit.quantum_info import Statevector, Operator
qc = QuantumCircuit(1)
qc.h(0); qc.z(0); qc.h(0)
print(qc.draw()) # 回路図(左から右)
print(Operator(qc).data.round(3)) # 回路全体を1つの行列に畳む → Xになるはず
print(Statevector.from_instruction(qc))
Operator(qc) は回路全体を1つのユニタリ行列に畳んでくれます。恒等式の検算($HZH = X$ など)が1行でできる強力な答え合わせ道具です。
演習2
次の回路を数式に翻訳し、出力状態を計算せよ。
q0: |0⟩ ──[X]──[H]──[S]──
解答を見る
式は $S H X |0\rangle$(回路と逆順)。$X|0\rangle = |1\rangle$、$H|1\rangle = |-\rangle$、$S|-\rangle = \frac{|0\rangle - i|1\rangle}{\sqrt2} = |{-i}\rangle$。ブロッホ球なら「南極 → 赤道−x → z軸まわり90°で赤道−y」という経路です。
式 $|\psi\rangle = (H \otimes H)(X \otimes I)|00\rangle$ を回路図に翻訳し、出力状態を求めよ。
解答を見る
q0: |0⟩ ──[X]──[H]──
q1: |0⟩ ───────[H]──
($X \otimes I$ が先=回路の左)。出力は $(H \otimes H)|10\rangle = |-\rangle \otimes |+\rangle = \frac12(|00\rangle + |01\rangle - |10\rangle - |11\rangle)$。式→回路の翻訳では「式の右端が回路の左端」。
$(H \otimes I)(I \otimes X) = (I \otimes X)(H \otimes I) = H \otimes X$ を、$(A \otimes B)(C \otimes D) = AC \otimes BD$ の公式で確かめよ。
解答を見る
$(H \otimes I)(I \otimes X) = HI \otimes IX = H \otimes X$。逆順も $IH \otimes XI = H \otimes X$。別ワイヤのゲートは時間的に前後させても同じ——回路図で縦の位置が違っても、ワイヤが違えば「同時」とみなせる根拠です。回路を式に翻訳するとき、列の切り方に迷ったら「ワイヤが違えばどう切っても同じ」と思い出してください。
次の2つの回路が同じユニタリを表すことを示せ。
(a) q0: ──[H]──[X]──[H]── (b) q0: ──[Z]──
また、この事実を使って回路 ──[H]──[X]──[H]──[Z]── を1ゲートに簡約せよ。
解答を見る
(a) は $HXH = Z$(恒等式ストック、ステップ1の $HZH = X$ と対)。よって (b) と同じ。後半:$Z \cdot (HXH) = Z \cdot Z = Z^2 = I$……順序に注意。回路の式は $Z H X H$ で、$HXH = Z$ より $Z \cdot Z = I$。全体が恒等変換、つまり「何もしない回路」に簡約されます(ゲート4個→0個の最適化)。
$XZ = -ZX$(反可換)を行列で確かめよ。この符号 $-1$ はグローバル位相なのに、「$X$ と $Z$ の順序を入れ替えてよい」と言い切れないのはなぜか。ヒント: 第3章の制御ゲートを先取りすると、「一部にだけ」掛かる場合が出てくる。
解答を見る
$XZ = \begin{pmatrix} 0 & -1 \\ 1 & 0 \end{pmatrix}$、$ZX = \begin{pmatrix} 0 & 1 \\ -1 & 0 \end{pmatrix} = -XZ$ ✓。単独の回路全体に掛かる $-1$ はグローバル位相で無害ですが、この操作が制御化される(制御ビットが $|1\rangle$ の分岐にだけ適用される)と、$-1$ は重ね合わせの片方の枝にだけ付く相対位相に化けて、観測可能な差になります(第3章の位相キックバックが正にこれ)。「グローバル位相は無視してよい」が通用するのは回路全体に掛かるときだけ、という重要な但し書きです。
次の回路の出力状態と、標準基底での測定確率を求めよ。
q0: |0⟩ ──[H]──[T]──[H]──
ヒント: ステップ1の総合演習6-1($R_{\pi/2}$ 版)と同じ型。$T = R_{\pi/4}$ 相当。
解答を見る
$H|0\rangle = \frac{|0\rangle + |1\rangle}{\sqrt2}$、$T$ で $\frac{|0\rangle + e^{i\pi/4}|1\rangle}{\sqrt2}$、$H$ で $\frac{(1 + e^{i\pi/4})|0\rangle + (1 - e^{i\pi/4})|1\rangle}{2}$。 $$P(0) = \frac{|1 + e^{i\pi/4}|^2}{4} = \frac{2 + 2\cos\frac{\pi}{4}}{4} = \frac{1 + \frac{\sqrt2}{2}}{2} \approx 0.854$$ $P(1) \approx 0.146$。H–位相–H のサンドイッチは「位相 $\phi$ を確率 $\cos^2\frac{\phi}{2}$ に変換する装置」(一般式 $P(0) = \cos^2\frac{\phi}{2}$)。この装置はステップ3のアルゴリズム群の共通骨格なので、一般式ごと覚えてしまってください。
2つの量子ビットに同時に $H$ を掛ける回路(深さ1)と、順番に掛ける回路(深さ2):
(a) q0: ──[H]── (b) q0: ──[H]──────
q1: ──[H]── q1: ──────[H]──
両者のユニタリが同じであることを式で示せ。では「深さ」が同じでない2つの回路が同じユニタリを持つとき、実機ではどちらが望ましいか。
解答を見る
(a) は $H \otimes H$、(b) は $(I \otimes H)(H \otimes I) = H \otimes H$ で同一。実機では深さの浅い (a) が望ましい。量子ビットは時間とともにデコヒーレンス(環境との相互作用で状態が劣化)するため、回路の実行時間=深さが短いほどエラーが少ない。並列化できるゲートは同じ列に詰めるのがコンパイラの基本方針です。「ゲート数」と「深さ」は別の指標で、論文のリソース評価では両方が報告されます。
1量子ビットの任意の回路(ゲート列)は、どれだけ長くても常に1個のユニタリ行列に畳める。さて、「では長い回路は無意味で、すべての量子計算は1ゲートでできる」という主張はどこが間違っているか。$n$ 量子ビットの場合を考えて答えよ。
解答を見る
畳めること自体は正しい($n$ 量子ビットでも回路全体は1個の $2^n \times 2^n$ ユニタリ)。間違いは「その1個の行列が実装できる基本操作だ」という部分です。実機が直接実行できるのは1〜2量子ビットの基本ゲートだけで、$2^n \times 2^n$ の任意のユニタリを基本ゲートに分解すると、一般には指数個のゲートが必要です。量子アルゴリズムの設計とは「役に立つ巨大ユニタリのうち、多項式個の基本ゲートに分解できるものを見つけること」に他なりません。「回路の長さ」こそが計算量であり、ここが計算理論としての量子計算の出発点です(ステップ3へ)。