cirq について
Cirqは、量子回路の設計、シミュレーション、実行に使うGoogle Quantum AIのオープンソースPythonフレームワークです。回路変換やノイズモデリングに加え、複数の量子ハードウェアプロバイダーとの連携に対応しています。
主な機能
- 01回路とパラメーター付きゲートの構築
- 02正確な回路・ノイズあり回路のシミュレーション
- 03ハードウェア向けの回路最適化とコンパイル
- 04ノイズモデリングと誤差軽減
- 05複数の量子ハードウェアへの接続
活用シーン
- 01量子アルゴリズムをシミュレーションして測定結果を分析
- 02量子ハードウェア向けに回路を最適化・コンパイル
- 03異なるノイズ条件で回路の挙動を比較
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ crazymsn/ academic-skills --skill cirqインストール後、Claude Code で/cirqを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/building.mdexperiments.mdhardware.mdnoise.mdsimulation.mdtransformation.md詳細
Cirq - Python による量子コンピューティング
Cirq は Google Quantum AI によるオープンソースフレームワークで、量子回路を設計、シミュレーション、そして量子コンピューターやシミュレーターで実行するためのものです。
インストール
uv pip install cirq
ハードウェア連携の場合:
# Google Quantum Engine
uv pip install cirq-google
# IonQ
uv pip install cirq-ionq
# AQT (Alpine Quantum Technologies)
uv pip install cirq-aqt
# Pasqal
uv pip install cirq-pasqal
# Azure Quantum
uv pip install azure-quantum cirq
クイックスタート
基本的な回路
import cirq
import numpy as np
# Create qubits
q0, q1 = cirq.LineQubit.range(2)
# Build circuit
circuit = cirq.Circuit(
cirq.H(q0), # Hadamard on q0
cirq.CNOT(q0, q1), # CNOT with q0 control, q1 target
cirq.measure(q0, q1, key='result')
)
print(circuit)
# Simulate
simulator = cirq.Simulator()
result = simulator.run(circuit, repetitions=1000)
# Display results
print(result.histogram(key='result'))
パラメーター化された回路
import sympy
# Define symbolic parameter
theta = sympy.Symbol('theta')
# Create parameterized circuit
circuit = cirq.Circuit(
cirq.ry(theta)(q0),
cirq.measure(q0, key='m')
)
# Sweep over parameter values
sweep = cirq.Linspace('theta', start=0, stop=2*np.pi, length=20)
results = simulator.run_sweep(circuit, params=sweep, repetitions=1000)
# Process results
for params, result in zip(sweep, results):
theta_val = params['theta']
counts = result.histogram(key='m')
print(f"θ={theta_val:.2f}: {counts}")
主な機能
回路の構築
量子ビット、ゲート、操作、カスタムゲート、回路パターンを含む、量子回路の構築に関する包括的な情報については、以下を参照してください:
- references/building.md - 回路構築の完全ガイド
主なトピック:
- 量子ビットの種類 (GridQubit、LineQubit、NamedQubit)
- 1 量子ビットおよび 2 量子ビットゲート
- パラメーター化されたゲートと操作
- カスタムゲートの分解
- モーメントによる回路の構成
- 標準的な回路パターン (ベル状態、GHZ、QFT)
- インポート/エクスポート (OpenQASM、JSON)
- qudit と可観測量の扱い
シミュレーション
厳密シミュレーション、ノイズを含むシミュレーション、パラメータースイープ、量子仮想マシンを含む、量子回路のシミュレーションに関する詳細情報については、以下を参照してください:
- references/simulation.md - 量子シミュレーションの完全ガイド
主なトピック:
- 厳密シミュレーション (状態ベクトル、密度行列)
- サンプリングと測定
- パラメータースイープ (単一パラメーターおよび複数パラメーター)
- ノイズを含むシミュレーション
- 状態ヒストグラムと可視化
- 量子仮想マシン (QVM)
- 期待値と可観測量
- パフォーマンスの最適化
回路変換
量子回路の最適化、コンパイル、操作に関する情報については、以下を参照してください:
- references/transformation.md - 回路変換の完全ガイド
主なトピック:
- トランスフォーマーフレームワーク
- ゲートの分解
- 回路の最適化 (ゲートのマージ、Z ゲートの取り出し、無視できる操作の削除)
- ハードウェア向けの回路コンパイル
- 量子ビットのルーティングと SWAP の挿入
- カスタムトランスフォーマー
- 変換パイプライン
ハードウェア連携
さまざまなプロバイダーの実機量子ハードウェアで回路を実行する方法に関する情報については、以下を参照してください:
- references/hardware.md - ハードウェア連携の完全ガイド
対応プロバイダー:
- Google Quantum AI (cirq-google) - Sycamore、Weber プロセッサー
- IonQ (cirq-ionq) - イオントラップ型量子コンピューター
- Azure Quantum (azure-quantum) - IonQ および Honeywell のバックエンド
- AQT (cirq-aqt) - Alpine Quantum Technologies
- Pasqal (cirq-pasqal) - 中性原子型量子コンピューター
トピックには、デバイス表現、量子ビットの選択、認証、ジョブ管理、ハードウェア向けの回路最適化が含まれます。
ノイズモデリング
ノイズのモデリング、ノイズを含むシミュレーション、特性評価、エラー緩和に関する情報については、以下を参照してください:
- references/noise.md - ノイズモデリングの完全ガイド
主なトピック:
- ノイズチャネル (デポラライジング、振幅減衰、位相減衰)
- ノイズモデル (一定、ゲート固有、量子ビット固有、熱)
- 回路へのノイズの追加
- 読み出しノイズ
- ノイズの特性評価 (ランダム化ベンチマーキング、XEB)
- ノイズの可視化 (ヒートマップ)
- エラー緩和の手法
量子実験
実験の設計、パラメータースイープ、データ収集、ReCirq フレームワークの利用に関する情報については、以下を参照してください:
- references/experiments.md - 量子実験の完全ガイド
主なトピック:
- 実験設計のパターン
- パラメータースイープとデータ収集
- ReCirq フレームワークの構造
- 代表的なアルゴリズム (VQE、QAOA、QPE)
- データ分析と可視化
- 統計解析と忠実度の推定
- 並列データ収集
一般的なパターン
変分アルゴリズムのテンプレート
import scipy.optimize
def variational_algorithm(ansatz, cost_function, initial_params):
"""Template for variational quantum algorithms."""
def objective(params):
circuit = ansatz(params)
simulator = cirq.Simulator()
result = simulator.simulate(circuit)
return cost_function(result)
# Optimize
result = scipy.optimize.minimize(
objective,
initial_params,
method='COBYLA'
)
return result
# Define ansatz
def my_ansatz(params):
q = cirq.LineQubit(0)
return cirq.Circuit(
cirq.ry(params[0])(q),
cirq.rz(params[1])(q)
)
# Define cost function
def my_cost(result):
state = result.final_state_vector
# Calculate cost based on state
return np.real(state[0])
# Run optimization
result = variational_algorithm(my_ansatz, my_cost, [0.0, 0.0])
ハードウェア実行のテンプレート
def run_on_hardware(circuit, provider='google', device_name='weber', repetitions=1000):
"""Template for running on quantum hardware."""
if provider == 'google':
import cirq_google
engine = cirq_google.get_engine()
processor = engine.get_processor(device_name)
job = processor.run(circuit, repetitions=repetitions)
return job.results()[0]
elif provider == 'ionq':
import cirq_ionq
service = cirq_ionq.Service()
result = service.run(circuit, repetitions=repetitions, target='qpu')
return result
elif provider == 'azure':
from azure.quantum.cirq import AzureQuantumService
# Setup workspace...
service = AzureQuantumService(workspace)
result = service.run(circuit, repetitions=repetitions, target='ionq.qpu')
return result
else:
raise ValueError(f"Unknown provider: {provider}")
ノイズ研究のテンプレート
def noise_comparison_study(circuit, noise_levels):
"""Compare circuit performance at different noise levels."""
results = {}
for noise_level in noise_levels:
# Create noisy circuit
noisy_circuit = circuit.with_noise(cirq.depolarize(p=noise_level))
# Simulate
simulator = cirq.DensityMatrixSimulator()
result = simulator.run(noisy_circuit, repetitions=1000)
# Analyze
results[noise_level] = {
'histogram': result.histogram(key='result'),
'dominant_state': max(
result.histogram(key='result').items(),
key=lambda x: x[1]
)
}
return results
# Run study
noise_levels = [0.0, 0.001, 0.01, 0.05, 0.1]
results = noise_comparison_study(circuit, noise_levels)
ベストプラクティス
-
回路設計
- トポロジーに適した量子ビットの種類を使用する
- 回路はモジュール化し、再利用可能に保つ
- 測定にはわかりやすいキーでラベルを付ける
- 実行前にデバイスの制約に照らして回路を検証する
-
シミュレーション
- 純粋状態には状態ベクトルシミュレーションを使用する(より効率的)
- 密度行列シミュレーションは必要な場合(混合状態、ノイズ)にのみ使用する
- 個別の実行ではなく、パラメータスイープを活用する
- 大規模システムではメモリ使用量を監視する(2^n は急速に増大する)
-
ハードウェア実行
- 必ず最初にシミュレーターでテストする
- キャリブレーションデータを使用して最適な量子ビットを選択する
- ターゲットハードウェアのゲートセットに合わせて回路を最適化する
- 本番実行にはエラー緩和を実装する
- 高コストなハードウェアの結果はすぐに保存する
-
回路最適化
- まずは高レベルの組み込みトランスフォーマーから始める
- 複数の最適化を順番に連結する
- 深さとゲート数の削減を追跡する
- 変換後に正しさを検証する
-
ノイズモデリング
- キャリブレーションデータに基づく現実的なノイズモデルを使用する
- すべての誤差要因(ゲート、デコヒーレンス、読み出し)を含める
- 緩和を行う前に特性を把握する
- ノイズの蓄積を最小限に抑えるため、回路は浅く保つ
-
実験
- データ生成、収集、分析を明確に分けて実験を構成する
- 再現性のために ReCirq のパターンを使用する
- 中間結果は頻繁に保存する
- 独立したタスクは並列化する
- メタデータを含めて十分に文書化する
追加リソース
- 公式ドキュメント: https://quantumai.google/cirq
- APIリファレンス: https://quantumai.google/reference/python/cirq
- チュートリアル: https://quantumai.google/cirq/tutorials
- サンプル: https://github.com/quantumlib/Cirq/tree/master/examples
- ReCirq: https://github.com/quantumlib/ReCirq
よくある問題
ハードウェアに対して回路が深すぎる:
- 回路最適化トランスフォーマーを使用して深さを減らす
- 最適化手法については
transformation.mdを参照
シミュレーションのメモリ問題:
- 密度行列シミュレーターから状態ベクトルシミュレーターに切り替える
- 量子ビット数を減らすか、Clifford回路にはスタビライザーシミュレーターを使用する
デバイス検証エラー:
- device.metadata.nx_graph で量子ビットの接続性を確認する
- ゲートをデバイスネイティブのゲートセットに分解する
- デバイス固有のコンパイルについては
hardware.mdを参照
ノイズありシミュレーションが遅すぎる:
- 密度行列シミュレーションは O(2^2n) なので、量子ビット数の削減を検討する
- ノイズモデルは重要な操作にのみ選択的に適用する
- パフォーマンス最適化については
simulation.mdを参照