cocteau666/quantum

simulator of 16qubit

★ 0Forks 0PythonGitHub ↗Compare

README

24量子ビット 量子コンピューターシミュレーター

macOS (Apple Silicon / Intel) で動作する、状態ベクトル方式の量子回路シミュレーターです。 依存は Python 3 + numpy のみ。デフォルトは 24 量子ビット (最大 24)。

ファイル構成

ファイル 内容
quantum_simulator.py シミュレーター本体 (QuantumSimulator クラス)
demo.py デモ: Bell状態 / GHZ状態 / 量子フーリエ変換 / Grover探索
test_simulator.py 検証テスト (13件)
TUTORIAL.md 量子コンピューター入門チュートリアル (使い方の解説)

実行方法

python3 demo.py            # デモを実行
python3 test_simulator.py  # テストを実行

使い方

from quantum_simulator import QuantumSimulator

sim = QuantumSimulator()            # 24量子ビット (省略時)、初期状態 |000...0>
# sim = QuantumSimulator(16)        # ビット数を指定したい場合 (1〜24)

# Bell 状態を作る
sim.h(0)                            # アダマールゲート
sim.cx(0, 1)                        # CNOT (制御 q0, ターゲット q1)

print(sim.dump())                   # 振幅の大きい基底状態を表示
print(sim.sample(1024))             # 1024 ショットの測定統計
bit = sim.measure(0)                # 1量子ビットの射影測定 (状態が収縮)
bits = sim.measure_all()            # 全量子ビット測定 → "0000...0011" など

対応ゲート

  • 1量子ビット: x y z h s sdg t tdg rx ry rz p u3
  • 制御ゲート: cx cy cz cp ccx (Toffoli) ccz mcx mcz (多重制御)
  • その他: swap、qft(inverse=True/False) (量子フーリエ変換)
  • 任意のユニタリ行列: apply_gate(matrix, targets, controls)

ビット順序の規約

量子ビット q0 が整数インデックスの最下位ビット (リトルエンディアン) です。 例: q0=1, q5=1 の基底状態はインデックス 2^0 + 2^5 = 33。

仕組み

  • 状態は 2^24 = 16,777,216 個の複素振幅 (complex128, 約 256 MB) として保持。
  • ゲート適用は状態ベクトルをテンソル (2,)*n に reshape し、 ターゲット軸への行列積として実行 (numpy でベクトル化)。
  • 1量子ビットゲートはターゲット軸を中央にした (A, 2, B) reshape で 2x2 行列を直接適用する高速パスを使う (全配列コピーを回避)。
  • 制御付きゲートは「制御ビットがすべて 1」の部分空間だけを スライスして変換するため、多重制御でも高速。

性能の目安 (24量子ビット): 1量子ビットゲート 1 回 ≈ 40 ms。 num_qubits は 1〜24 の範囲で変更可能 (1 ビット増えるごとにメモリ・時間が倍増)。

24量子ビットでの注意

Bell・GHZ・QFT は数秒〜十数秒で動きますが、Grover 探索は全 24 量子ビットでは 非現実的です。反復回数が √N に比例して約 3216 回必要で、1 ゲートが 1677 万振幅すべてに触れるため全体で約 3.4 時間かかります。demo.py では 探索の様子が一目で分かるよう Grover のみ 16 量子ビットで実演しています。

Contributors

cocteau666

Issues