量子回路シミュレータ — ゲートを並べて振幅を流す
量子計算のプログラムは量子回路という図で書かれます。この章では2量子ビットの回路を自分で組み、状態ベクトル(4つの複素振幅)が左から右へ変化していく様子を観察します。最後に「なぜ古典コンピュータでのシミュレーションは破綻するのか」まで踏み込みます。
1. 回路図の読み方 — 左から右へ流れる時間
量子回路は「量子ビット版の楽譜」です。読み方のルールは3つだけ。
- 横線(ワイヤ)= 量子ビット1個。物理的な配線ではなく、その量子ビットの時間軸を表します。
- 時間は左から右へ流れます。左端が初期状態(ふつう |0⟩)、右端が出力です。
- 箱がゲート。ワイヤ2本を縦線でつなぐ「●—⊕」は CNOT(●が制御、⊕が標的)、メーターの記号は測定です。
前章までに登場したゲートを復習しておくと、H(重ね合わせを作る)、X(ビット反転)、Z(|1⟩ の符号を反転)、S(|1⟩ に90°の位相)、CNOT(制御が |1⟩ のときだけ標的を反転)でした。
2. 回路を組んで動かす — ミニ回路ビルダー
下のビルダーで実際に回路を組んでみましょう。パレットでゲートを選び、グリッドのセルをクリックすると配置できます(同じゲートをもう一度クリックすると削除)。「⚡ 実行」を押すと状態が左から右へ流れ、下段の4本のバーが各瞬間の振幅を示します。バーの高さが振幅の大きさ |c|、色が位相角です。
3. 振幅は複素数 — 複素平面で「回る」を見る
2量子ビットの状態は、4つの複素数の組で完全に記述されます。
下のデモは上のビルダーと連動しています。4本の矢印が4つの振幅です。S ゲートを置けば矢印が90°、Z なら180°回ります。振幅の「長さ」は確率に、「向き(位相)」は干渉のしかたに効きます。H·Z·H プリセットを実行して、矢印が足し合わされて消える(干渉で打ち消される)瞬間を観察してください。
4. 測定統計 — 確率は「何度も走らせて」初めて見える
量子回路を1回実行して測定しても、得られるのは「00」のようなたった1つの結果です。振幅そのものは読み出せません。確率分布 P(x) = |cx|² を確かめるには、同じ回路を何百・何千回も実行(ショット)してヒストグラムを取ります。実機の量子コンピュータの結果が常に「counts」で返ってくるのはこのためです。
5. 状態ベクトルシミュレーションのしくみ
このページの裏側では、教科書どおりの状態ベクトルシミュレーションが動いています。仕組みは驚くほど単純です。
- 状態 = 長さ 2n の複素数配列(n=2 なら4要素)。初期値は [1, 0, 0, 0]。
- 1量子ビットゲート = 対象ビットだけが異なる添字ペアごとに 2×2 行列を掛ける。
- CNOT = 制御ビットが1の添字どうしで振幅を入れ替える。
- 測定 = 確率を集計して乱数で結果を選び、矛盾する振幅をゼロにして正規化。
実際にこのページで動いているコードの核心部はこれだけです。
function apply1(st, q, m) { // 1量子ビットゲート
const out = st.slice();
const pairs = q === 0 ? [[0,2],[1,3]] : [[0,1],[2,3]];
for (const [i0, i1] of pairs) { // ペアごとに 2×2 行列 × ベクトル
out[i0] = add(mul(m[0][0], st[i0]), mul(m[0][1], st[i1]));
out[i1] = add(mul(m[1][0], st[i0]), mul(m[1][1], st[i1]));
}
return out;
}
6. なぜ古典シミュレーションは n で破綻するのか
単純で美しいアルゴリズムですが、致命的な弱点があります。配列の長さが 2n — 量子ビットを1個増やすたびに、必要なメモリと計算量が2倍になるのです。
| 量子ビット数 n | 振幅の個数 2n | 必要メモリ | 目安 |
|---|---|---|---|
| 10 | 1,024 | 16 KB | 一瞬 |
| 20 | 約100万 | 16 MB | ノートPCで余裕 |
| 30 | 約10億 | 17 GB | ノートPCの限界付近 |
| 40 | 約1兆 | 17.6 TB | 大型サーバでも苦しい |
| 50 | 約1015 | 18 PB | 世界最大級のスパコン級 |
| 100 | 約1.3×1030 | — | 地球上の全ストレージでも不可能 |
一方、量子コンピュータ自身は n 量子ビットをただ「持っている」だけでこの状態空間を扱えます。ここが量子計算の潜在的な優位性の源泉です。
7. まとめ
- 量子回路:ワイヤ=量子ビット、時間は左→右。図は左から、数式は右から掛かる。
- 状態ベクトル:2量子ビットなら4つの複素振幅。大きさの2乗が確率、位相は干渉に効く。
- 測定統計:振幅は直接読めない。多数ショットのヒストグラムで分布を推定する。
- 2n の壁:古典シミュレーションは量子ビット1個ごとにコストが倍増する。