What is Qiskit?
Qiskit is IBM's open-source quantum computing SDK. It provides tools to compose, visualize, optimize, and execute quantum circuits on IBM Quantum simulators and real quantum hardware. The free tier includes access to multiple QPUs with no cost beyond queue time.
📦
v1.x
Current version
🖥️
30+ qubits
Aer simulator
⚛️
127 qubits
Free real QPU
🆓
Free
Open account
Installation
terminal
pip install qiskit # Core pip install qiskit-aer # Local simulator pip install qiskit-ibm-runtime # IBM Quantum cloud access pip install qiskit[visualization] # Optional: circuit diagramsSetting Up Free IBM Quantum Access
- 1Visit quantum.ibm.com and click "Sign in" → "Create an IBMid" (free).
- 2After login, go to your profile (top-right) → "Manage account" → "API token".
- 3Copy the API token and paste it into the save_account() call below.
- 4Run the setup script once. Credentials are saved to ~/.qiskit/qiskit-ibm.json.
setup_credentials.py
from qiskit_ibm_runtime import QiskitRuntimeService # Save your IBM Quantum token (only needed once) QiskitRuntimeService.save_account( channel="ibm_quantum", token="YOUR_IBM_QUANTUM_TOKEN_HERE", overwrite=True ) # Verify the connection service = QiskitRuntimeService(channel="ibm_quantum") backends = service.backends() print(f"Available backends: {[b.name for b in backends]}")Running on the Free Local Simulator
Qiskit Aer provides a high-performance local simulator. No account required — run unlimited circuits on your machine.
local_sim.py
from qiskit import QuantumCircuit from qiskit_aer import AerSimulator from qiskit.visualization import plot_histogram # Build a Bell state circuit qc = QuantumCircuit(2, 2) qc.h(0) qc.cx(0, 1) qc.measure([0, 1], [0, 1]) # Run on local Aer simulator (free, unlimited) sim = AerSimulator() job = sim.run(qc, shots=4096) result = job.result() counts = result.get_counts() print(counts) # {'00': ~2048, '11': ~2048} # Statevector simulation (no measurement noise) from qiskit.quantum_info import Statevector sv = Statevector.from_instruction(qc.remove_final_measurements(inplace=False)) print(sv) # [0.707+0j, 0, 0, 0.707+0j]Running on Real Free QPU Hardware
real_hardware.py
from qiskit import QuantumCircuit, transpile from qiskit_ibm_runtime import QiskitRuntimeService, SamplerV2 as Sampler service = QiskitRuntimeService(channel="ibm_quantum") # Find the least-busy free QPU backend = service.least_busy( operational=True, simulator=False, min_num_qubits=2 ) print(f"Running on: {backend.name} ({backend.num_qubits} qubits)") # Build circuit qc = QuantumCircuit(2, 2) qc.h(0) qc.cx(0, 1) qc.measure_all() # Transpile for the specific backend qc_t = transpile(qc, backend, optimization_level=3) # Submit job using SamplerV2 (modern Qiskit Runtime API) with Sampler(mode=backend) as sampler: job = sampler.run([qc_t], shots=1024) result = job.result() print(result[0].data.meas.get_counts())Variational Quantum Eigensolver (VQE)
vqe_example.py
from qiskit.circuit.library import TwoLocal from qiskit.quantum_info import SparsePauliOp from qiskit_ibm_runtime import QiskitRuntimeService, Session from qiskit_ibm_runtime import EstimatorV2 as Estimator from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager import numpy as np # Define a simple Hamiltonian (H2 molecule) hamiltonian = SparsePauliOp.from_list([ ("ZZ", -1.0523732), ("IZ", 0.3979374), ("ZI", -0.3979374), ("XX", 0.1809312), ("YY", 0.1809312), ]) # Ansatz circuit ansatz = TwoLocal(2, ['ry', 'rz'], 'cx', reps=2) init_params = np.zeros(ansatz.num_parameters) service = QiskitRuntimeService(channel="ibm_quantum") backend = service.least_busy(operational=True, simulator=False) pm = generate_preset_pass_manager(backend=backend, optimization_level=1) ansatz_isa = pm.run(ansatz) hamiltonian_isa = hamiltonian.apply_layout(ansatz_isa.layout) with Session(backend=backend) as session: estimator = Estimator(mode=session) job = estimator.run([(ansatz_isa, hamiltonian_isa, init_params)]) print(f"Energy estimate: {job.result()[0].data.evs}")💡
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="qiskit") # explicit