cirq
Google量子计算框架。用于面向Google Quantum AI硬件、设计具备噪声感知的电路,或运行量子表征实验时。最适合Google硬件、噪声建模和底层电路设计。对于IBM硬件使用qiskit;进行带自动微分的量子机器学习使用pennylane;进行物理仿真使用qutip。
分类
开发工具安装
下载并解压到你的 skills 目录
复制命令,发送给智能体自动安装:
Cirq - Quantum Computing with Python
Cirq is Google Quantum AI's open-source framework for designing, simulating, and running quantum circuits on quantum computers and simulators.
When to Use This Skill
Use this skill when:
cirq-google) or partner backends (IonQ, Azure Quantum, AQT, Pasqal)For IBM hardware use qiskit; for quantum ML with autodiff use pennylane; for physics simulations use qutip.
Installation
Requires Python 3.11+. Current stable release: 1.6.1 (August 2025). Vendor packages share the same version number.
uv pip install "cirq==1.6.1"For hardware integration (pin matching versions for reproducibility):
# Google Quantum Engine (requires approved GCP project access)
uv pip install "cirq-google==1.6.1"
# IonQ
uv pip install "cirq-ionq==1.6.1"
# AQT (Alpine Quantum Technologies)
uv pip install "cirq-aqt==1.6.1"
# Pasqal
uv pip install "cirq-pasqal==1.6.1"
# Azure Quantum (IonQ, Honeywell/Quantinuum backends)
uv pip install "azure-quantum[cirq]"For latest features during development, omit version pins; for production or hardware runs, pin all packages to the same Cirq release.
Quick Start
Basic Circuit
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'))Parameterized Circuit
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}")Core Capabilities
Circuit Building
For comprehensive information about building quantum circuits, including qubits, gates, operations, custom gates, and circuit patterns, see:
Common topics:
Simulation
For detailed information about simulating quantum circuits, including exact simulation, noisy simulation, parameter sweeps, and the Quantum Virtual Machine, see:
Common topics:
Circuit Transformation
For information about optimizing, compiling, and manipulating quantum circuits, see:
Common topics:
Hardware Integration
For information about running circuits on real quantum hardware from various providers, see:
Supported providers:
cirq-google) — Sycamore, Weber, Willow processors via Quantum Engine (restricted access; requires approved GCP project)cirq-ionq) — trapped-ion QPUs and simulatorsazure-quantum[cirq]) — IonQ and Honeywell/Quantinuum backendscirq-aqt) — Alpine Quantum Technologiescirq-pasqal) — neutral-atom devicesTopics include device representation, qubit selection, authentication, job management, and circuit optimization for hardware. See Access and authentication for Google Cloud setup.
Noise Modeling
For information about modeling noise, noisy simulation, characterization, and error mitigation, see:
Common topics:
Quantum Experiments
For information about designing experiments, parameter sweeps, data collection, and using the ReCirq framework, see:
Common topics:
Common Patterns
Variational Algorithm Template
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])Hardware Execution Template
import os
def run_on_hardware(circuit, provider='google', processor_id=None, repetitions=1000):
"""Template for running on quantum hardware."""
if provider == 'google':
import cirq_google as cg
project_id = os.environ['GOOGLE_CLOUD_PROJECT']
engine = cg.Engine(project_id=project_id)
# List available processors: engine.list_processors()
processor_id = processor_id or 'weber' # use your assigned processor_id
sampler = engine.get_sampler(processor_id=processor_id)
return sampler.run(circuit, repetitions=repetitions)
elif provider == 'ionq':
import cirq_ionq as ionq
# Requires IONQ_API_KEY in environment
service = ionq.Service()
return service.run(circuit, repetitions=repetitions, target='qpu')
elif provider == 'azure':
from azure.quantum.cirq import AzureQuantumService
service = AzureQuantumService(
resource_id=os.environ['AZURE_QUANTUM_RESOURCE_ID'],
location=os.environ['AZURE_QUANTUM_LOCATION'],
)
return service.run(circuit, repetitions=repetitions, target='ionq.qpu')
else:
raise ValueError(f"Unknown provider: {provider}")Noise Study Template
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)Best Practices
- Use appropriate qubit types for your topology
- Keep circuits modular and reusable
- Label measurements with descriptive keys
- Validate circuits against device constraints before execution
- Use state vector simulation for pure states (more efficient)
- Use density matrix simulation only when needed (mixed states, noise)
- Leverage parameter sweeps instead of individual runs
- Monitor memory usage for large systems (2^n grows quickly)
- Always test on simulators first
- Select best qubits using calibration data
- Optimize circuits for target hardware gateset
- Implement error mitigation for production runs
- Store expensive hardware results immediately
- Start with high-level built-in transformers
- Chain multiple optimizations in sequence
- Track depth and gate count reduction
- Validate correctness after transformation
- Use realistic noise models from calibration data
- Include all error sources (gate, decoherence, readout)
- Characterize before mitigating
- Keep circuits shallow to minimize noise accumulation
- Structure experiments with clear separation (data generation, collection, analysis)
- Use ReCirq patterns for reproducibility
- Save intermediate results frequently
- Parallelize independent tasks
- Document thoroughly with metadata
Additional Resources
Common Issues
Circuit too deep for hardware:
transformation.md for optimization techniquesMemory issues with simulation:
Device validation errors:
hardware.md for device-specific compilationNoisy simulation too slow:
simulation.md for performance optimization