Quantum Software Landscape
The quantum software stack includes:
- Circuit-level frameworks: Qiskit, Cirq, Q#
- Variational frameworks: PennyLane, TensorFlow Quantum
- Cloud platforms: IBM Quantum, Amazon Braket, Azure Quantum
- Compilers: t|ket>, Qiskit Transpiler, Cirq Optimizer
- Simulators: statevector, density matrix, tensor network simulators
Qiskit
Qiskit (IBM) is the most widely used quantum SDK:
from qiskit import QuantumCircuit, Aer, execute
qc = QuantumCircuit(2, 2)
qc.h(0)
qc.cx(0, 1)
qc.measure([0, 1], [0, 1])
simulator = Aer.get_backend('qasm_simulator')
result = execute(qc, simulator, shots=1000).result()
print(result.get_counts())
Qiskit provides circuits, transpilation, execution on real hardware, and a rich ecosystem of algorithms.
Cirq
Cirq (Google) focuses on NISQ algorithms and hardware-aware compilation:
import cirq
q0, q1 = cirq.LineQubit.range(2)
circuit = cirq.Circuit([
cirq.H(q0),
cirq.CNOT(q0, q1),
cirq.measure(q0, q1)
])
simulator = cirq.Simulator()
result = simulator.run(circuit, repetitions=1000)
print(result.histogram(key='q(0),q(1)'))
Cirq emphasizes control over gate placement and hardware topology.
PennyLane
PennyLane (Xanadu) is designed for quantum machine learning and variational algorithms:
import pennylane as qml
import numpy as np
dev = qml.device('default.qubit', wires=2)
@qml.qnode(dev)
def circuit(params):
qml.RY(params[0], wires=0)
qml.CNOT(wires=[0, 1])
return qml.expval(qml.PauliZ(0))
params = np.array([0.5], requires_grad=True)
print(circuit(params))
PennyLane provides automatic differentiation, optimization, and integration with classical ML frameworks.
Q# (Microsoft)
Q# is a domain-specific language for quantum programming with integrated classical control:
operation BellState() : (Result, Result) {
use q = Qubit[2];
H(q[0]);
CNOT(q[0], q[1]);
return (M(q[0]), M(q[1]));
}
Q# emphasizes resource estimation, error correction, and long-term quantum computing vision.
Comparison
| Feature | Qiskit | Cirq | PennyLane | Q# |
|---|---|---|---|---|
| Primary use | General QC | NISQ/HW | QML/Variational | Fault-tolerant |
| Hardware | IBM | Multiple | Microsoft | |
| Language | Python | Python | Python | Q# |
| Differentiation | Manual | Manual | Automatic | Manual |
| Community | Largest | Growing | ML-focused | Enterprise |
Python: Framework Comparison
# Qiskit style
def qiskit_bell():
from qiskit import QuantumCircuit
qc = QuantumCircuit(2, 2)
qc.h(0); qc.cx(0, 1); qc.measure([0,1], [0,1])
return qc
# Cirq style
def cirq_bell():
import cirq
q0, q1 = cirq.LineQubit.range(2)
return cirq.Circuit([cirq.H(q0), cirq.CNOT(q0, q1), cirq.measure(q0, q1)])
# PennyLane style
def pennylane_bell():
import pennylane as qml
dev = qml.device('default.qubit', wires=2, shots=1000)
@qml.qnode(dev)
def circuit():
qml.Hadamard(wires=0)
qml.CNOT(wires=[0, 1])
return qml.probs(wires=[0, 1])
return circuit()
print("Qiskit:", qiskit_bell())
print("Cirq:", cirq_bell())
print("PennyLane probs:", pennylane_bell())