What is Cirq?
Cirq is Google's quantum computing framework designed for NISQ (Noisy Intermediate-Scale Quantum) devices. It offers fine-grained control over gate-level operations, making it ideal for algorithm development and hardware experiments. Cirq includes multiple free simulators and can run on Google's quantum hardware through partnerships.
Installation
terminal
pip install cirq # Core + simulator pip install cirq-google # Google hardware access (optional) pip install cirq-web # Web visualization (optional)Basic Circuit & Simulation
cirq_basic.py
import cirq import numpy as np # Create qubits q0, q1 = cirq.LineQubit.range(2) # Build a Bell state circuit circuit = cirq.Circuit([ cirq.H(q0), cirq.CNOT(q0, q1), cirq.measure(q0, q1, key='result') ]) print(circuit) # 0: ───H───@───M('result')─── # │ │ # 1: ───────X───M───────────── # Simulate with shots (sampling) sim = cirq.Simulator() result = sim.run(circuit, repetitions=1000) print(result.histogram(key='result')) # Counter({0: 504, 3: 496}) (0=|00⟩, 3=|11⟩)Statevector & Density Matrix Simulation
cirq_statevector.py
import cirq q0, q1 = cirq.LineQubit.range(2) # Build without measurement for statevector circuit = cirq.Circuit([cirq.H(q0), cirq.CNOT(q0, q1)]) # Exact statevector simulation (free, local) sim = cirq.Simulator() result = sim.simulate(circuit) print(result.final_state_vector) # [0.707+0j, 0+0j, 0+0j, 0.707+0j] # Density matrix simulation (for noisy circuits) noise_model = cirq.ConstantQubitNoiseModel( cirq.depolarize(p=0.01) ) noisy_sim = cirq.DensityMatrixSimulator(noise=noise_model) noisy_result = noisy_sim.simulate(circuit) print(noisy_result.final_density_matrix)Clifford Simulator (Efficient for Stabilizer Circuits)
cirq_clifford.py
import cirq # CliffordSimulator efficiently handles stabilizer circuits # Simulates 1000s of qubits for Clifford gates qubits = cirq.LineQubit.range(50) # 50 qubits! circuit = cirq.Circuit( [cirq.H(q) for q in qubits], [cirq.CNOT(qubits[i], qubits[i+1]) for i in range(49)], cirq.measure(*qubits, key='ghz') ) sim = cirq.CliffordSimulator() result = sim.run(circuit, repetitions=100) print(result.histogram(key='ghz'))Variational Algorithms with Cirq
cirq_vqa.py
import cirq import numpy as np from scipy.optimize import minimize q0, q1 = cirq.LineQubit.range(2) def ansatz(theta: float) -> cirq.Circuit: return cirq.Circuit([ cirq.ry(theta)(q0), cirq.CNOT(q0, q1), cirq.measure(q0, q1, key='m') ]) def cost(params): circuit = ansatz(params[0]) sim = cirq.Simulator() result = sim.run(circuit, repetitions=200) counts = result.histogram(key='m') # Minimize energy (simplified objective) return -counts.get(0, 0) / 200 # maximize |00⟩ prob result = minimize(cost, x0=[0.5], method='COBYLA') print(f"Optimal theta: {result.x[0]:.4f}")💡
Also available via HLQuantum
Want to run the same circuit on multiple backends without rewriting your code? HLQuantum abstracts this SDK (and 5 others) behind a single unified API.
python
import hlquantum as hlq qc = hlq.Circuit(2) qc.h(0).cx(0, 1).measure_all() # One line to switch between any backend result = hlq.run(qc, shots=1024) # auto-detect result = hlq.run(qc, shots=1024, backend="cirq") # explicit