Skip to content
Kartikey Purohit
← Course overview

Reference

Syllabus

Exam: Fundamentals of Quantum Computing Using Qiskit v2.X Developer (ENU) Credential: IBM Certified Quantum Computation using Qiskit v2.X Developer — Associate Exam date (mine): August 4, 2026


Exam Logistics

Item Detail
Exam code C1000-179
Questions 68 (multiple choice)
Duration 90 minutes (~79 seconds/question)
Passing score 47 correct ≈ 69%
Cost $200 USD
Qiskit version tested v2.X (V2 primitives, Qiskit Runtime)
Assumed background Python proficiency, basic linear algebra; no physics degree required

Section Weights at a Glance

# Section Weight
1 Create quantum circuits 18%
2 Perform quantum operations 16%
3 Run quantum circuits 15%
4 Use the Sampler primitive 12%
5 Use the Estimator primitive 12%
6 Visualize quantum circuits, measurements, and states 11%
7 Retrieve and analyze results 10%
8 Operate with OpenQASM 6%

Sections 1–5 together are ~73% of the exam — prioritize accordingly.


Section 1 — Create Quantum Circuits (18%)

1.1 Basic circuit construction

  • QuantumCircuit(num_qubits, num_clbits) constructor and its variants
  • QuantumRegister, ClassicalRegister, AncillaRegister; named registers
  • Single-qubit gates: x, y, z, h, s, sdg, t, tdg, p, rx, ry, rz, u, sx, id
  • Two-qubit gates: cx/cnot, cz, cy, ch, swap, iswap, cp, crx, cry, crz, rxx, ryy, rzz, ecr
  • Multi-qubit gates: ccx (Toffoli), cswap (Fredkin), mcx
  • measure(), measure_all(), measure_active(); barrier(), reset()
  • Circuit composition: compose(), append(), tensor(); inverse(), power(), copy()
  • Controlled/custom gates: .control(), .to_gate(), .to_instruction(), gate labels
  • Circuit properties: depth(), size(), width(), num_qubits, count_ops(), qubits/clbits
  • Building well-known circuits: Bell states, GHZ states, superposition prep

1.2 Parameterized circuits

  • qiskit.circuit.Parameter — symbolic parameters in gates
  • ParameterVector — vectors of parameters
  • assign_parameters() (dict or list binding; inplace flag)
  • circuit.parameters attribute (sorted order matters for list binding)
  • Parameter expressions (arithmetic on parameters)
  • Passing parameter values via PUBs at runtime instead of binding

1.3 Dynamic circuits (classical feedforward)

  • Mid-circuit measurement
  • with circuit.if_test((clbit/creg, value)): blocks and else branch
  • switch, for_loop, while_loop control-flow constructs
  • Use cases: teleportation, active reset, conditional gates

1.4 Transpilation and optimization

  • Why transpile: basis gates, coupling map / connectivity, ISA circuits
  • generate_preset_pass_manager(optimization_level, backend=...) — the v2.x standard
  • Optimization levels 0–3 (what each adds: layout, routing, translation, optimization)
  • Transpiler stages: init → layout → routing → translation → optimization → scheduling
  • Layout and routing concepts: initial layout, SWAP insertion, VF2 layout
  • transpile() function vs pass managers
  • Target, backend.target, basis gate sets (e.g., ECR/CZ + rz, sx, x)
  • Effect of transpilation on depth/gate counts; comparing before vs after

Section 2 — Perform Quantum Operations (16%)

2.1 Pauli operators and observables

  • qiskit.quantum_info.Pauli — construction from strings (e.g., Pauli('IZ')), phase conventions
  • Qubit ordering: little-endian — rightmost character acts on qubit 0 (classic trap)
  • SparsePauliOp — construction (from_list, from_sparse_list), coefficients, simplify()
  • Composing/manipulating operators: compose(), tensor(), expand(), adjoint()
  • .to_matrix() conversions; matrix forms of I, X, Y, Z, H, S, T
  • Defining observables for the Estimator (Hamiltonians as Pauli sums)

2.2 Quantum states and operators (quantum_info)

  • Statevectorfrom_label(), from_instruction(), evolving with evolve()
  • DensityMatrix basics
  • Operator class — building from circuits/matrices, unitary checks
  • Inner products, fidelity (state_fidelity), probabilities(), probabilities_dict()
  • Statevector.sample_counts(), expectation_value()

2.3 Applying quantum operations & gate effects

  • What each gate does to basis states and Bloch-sphere states
  • Global vs relative phase; effect of Z/S/T on superposition states
  • Creating entanglement (H + CX); recognizing entangled vs product states
  • Commutation basics (e.g., do X and Z commute), gate identities (HZH = X, HXH = Z)
  • Rotation gates as exp(-iθP/2); special angles (rz(π) ≡ Z up to phase)

Section 3 — Run Quantum Circuits (15%)

3.1 Qiskit Runtime service and backends

  • QiskitRuntimeService() — account setup, channels, saving credentials
  • service.backend(...), service.least_busy(operational=True, simulator=False)
  • Backend properties: num_qubits, basis_gates, coupling_map, target
  • ISA circuits requirement: circuits must be transpiled to backend ISA before running on hardware (v2 primitives reject non-ISA circuits)

3.2 Execution modes

  • Job mode — single primitive request, standalone queuing
  • Batch mode — multiple independent jobs submitted together, parallel scheduling, no state between jobs
  • Session mode — dedicated/exclusive access window; iterative workloads (e.g., variational algorithms); sequential jobs without re-queuing
  • When to choose each mode; Session(backend=...), Batch(backend=...) context managers
  • Passing mode= to a primitive (session, batch, or backend object)
  • Session/batch lifecycle: max time, interactive timeout, closing

3.3 Running with primitives

  • Instantiating SamplerV2(mode=...) / EstimatorV2(mode=...)
  • job = primitive.run(pubs); job is asynchronous
  • Local testing: StatevectorSampler / StatevectorEstimator (qiskit.primitives), Aer simulators, fake backends (FakeManilaV2 etc.)
  • Shots: setting per-run and per-PUB; default shot behavior

Section 4 — Use the Sampler Primitive (12%)

4.1 Concept

  • Sampler returns per-shot measurement samples / bitstring distributions (not expectation values)
  • Circuits must contain measurements for Sampler
  • Sampler PUB shape: (circuit,) or (circuit, parameter_values) and optional shots: (circuit, param_values, shots)

4.2 Results

  • result = job.result(); indexing PUB results: result[0]
  • result[0].data.<creg_name> (e.g., .data.meas for measure_all(), .data.c for default register)
  • BitArray: get_counts(), get_bitstrings(), num_shots, num_bits
  • join_data() when multiple classical registers exist

4.3 Options (error suppression for Sampler)

  • sampler.options.default_shots
  • Dynamical decoupling: options.dynamical_decoupling.enable = True, sequence types (XX, XpXm, XY4)
  • Twirling: options.twirling.enable_gates, enable_measure, num_randomizations, shots_per_randomization
  • Note: Sampler has no resilience_level (that's Estimator-only)

Section 5 — Use the Estimator Primitive (12%)

5.1 Concept

  • Estimator returns expectation values ⟨ψ|O|ψ⟩ of observables
  • Circuits must NOT have measurements (observable defines the measurement)
  • Estimator PUB shape: (circuit, observables), (circuit, observables, parameter_values), optional precision
  • Observables must be mapped to the transpiled circuit layout: observable.apply_layout(isa_circuit.layout)
  • Broadcasting rules for arrays of observables/parameters

5.2 Results

  • result[0].data.evs (expectation values) and .data.stds (standard errors)
  • result[0].metadata (e.g., target precision, shots)

5.3 Options (error mitigation — Estimator)

  • options.default_precision / default_shots
  • Resilience levels: 0 (none), 1 (default — measurement error mitigation / TREX), 2 (adds ZNE)
  • options.resilience.zne_mitigation = True; ZneOptions: noise_factors, extrapolator (linear, exponential, polynomial)
  • Measurement mitigation: options.resilience.measure_mitigation
  • PEC (probabilistic error cancellation) awareness — options.resilience.pec_mitigation
  • Dynamical decoupling and twirling (TwirlingOptions) also apply to Estimator
  • Error suppression (DD, twirling — before/during execution) vs error mitigation (TREX, ZNE, PEC — post-processing) distinction

Section 6 — Visualize Circuits, Measurements, and States (11%)

6.1 Circuit visualization

  • circuit.draw() — outputs: 'text', 'mpl', 'latex'; reverse_bits, fold, idle_wires args
  • Reading circuit diagrams: gate order (left→right), qubit ordering (top = q0), controls vs targets
  • Identifying the circuit that produces a given diagram (and vice versa)

6.2 Measurement/counts visualization

  • plot_histogram(counts) — single and multiple datasets, legend, sort, number_to_keep
  • plot_distribution() for quasi-probabilities
  • Interpreting histograms: bitstring ordering (little-endian), identifying Bell/GHZ signatures

6.3 State visualization

  • plot_bloch_vector() — a single Bloch vector; spherical/cartesian coordinates
  • plot_bloch_multivector(statevector) — per-qubit Bloch spheres; entangled qubits show zero-length vectors (center of sphere)
  • plot_state_qsphere() — amplitude = blob size, phase = color; reading relative phases
  • plot_state_city(), plot_state_hinton(), plot_state_paulivec()
  • Statevector.draw('latex') / array_to_latex
  • Matching a state (e.g., |+⟩, |−⟩, |i⟩) to its Bloch sphere position: |0⟩=+Z, |1⟩=−Z, |±⟩=±X, |±i⟩=±Y

Section 7 — Retrieve and Analyze Results (10%)

7.1 Job management

  • job.job_id(), job.status(), job.done(), job.cancel()
  • Asynchronous execution model; retrieving completed jobs later: service.job(job_id)
  • service.jobs(...) filtering (backend, session, pending)
  • job.metrics(), job.usage() — QPU time awareness

7.2 Result objects (V2)

  • PrimitiveResult structure: iterable of PubResults
  • PubResult.data (DataBin), PubResult.metadata, job-level result.metadata
  • Sampler: counts/bitstrings from BitArray (see §4.2)
  • Estimator: evs, stds, ensemble_standard_error (see §5.2)

7.3 Analysis

  • Converting counts → probabilities; normalizing over shots
  • Comparing ideal (simulator) vs noisy (hardware) distributions
  • Computing expectation values from counts manually (e.g., ⟨Z⟩ = (n₀ − n₁)/shots)
  • Interpreting standard errors and precision vs shots relationship (error ∝ 1/√shots)

Section 8 — Operate with OpenQASM (6%)

8.1 OpenQASM 3

  • Exporting: qiskit.qasm3.dumps(circuit) (string), qiskit.qasm3.dump(circuit, file)
  • Importing: qiskit.qasm3.loads(program_str), qiskit.qasm3.load(file)
  • OpenQASM 3 program structure: OPENQASM 3.0;, include "stdgates.inc";, qubit[n], bit[n], gate syntax
  • OpenQASM 3 features vs 2: classical control flow, input parameters, typed classical data

8.2 OpenQASM 2 (interoperability)

  • QuantumCircuit.from_qasm_str() / qiskit.qasm2.loads(), qasm2.dumps()
  • Reading a short QASM program and predicting the circuit it builds

8.3 REST API awareness

  • Submitting Runtime jobs with QASM payloads via the IBM Quantum REST API (high-level awareness)

Cross-Cutting Concepts (show up everywhere)

  • Little-endian convention — qubit 0 is rightmost in bitstrings, statevector indices, and Pauli strings
  • V2 primitives onlySamplerV2/EstimatorV2, PUBs; V1 (backend.run, Sampler/Estimator V1) is deprecated/removed
  • Qiskit 1.0/2.0 packaging changes: qiskit_ibm_runtime vs qiskit; removal of qiskit.execute; Aer moved to qiskit_aer
  • The Qiskit patterns workflow: Map → Optimize (transpile) → Execute (primitives) → Post-process
  • Common exam traps: forgetting apply_layout on observables, running non-ISA circuits, Sampler without measurements, Estimator with measurements, parameter binding order

Prerequisites Checklist

  • Python: comfortable with classes, context managers (with), NumPy arrays
  • Linear algebra: matrix multiplication, tensor products, eigenvalues, unitary/Hermitian matrices
  • Complex numbers: modulus, phase, Euler's formula
  • Dirac notation: |0⟩, |1⟩, |+⟩, |−⟩, bras/kets, inner/outer products
  • Core QC concepts: superposition, entanglement, measurement/collapse, no-cloning

  1. Official exam page + Sample Test — IBM Training: C9008400 certification (work the sample test until ≥90%)
  2. IBM Quantum Documentationdocs.quantum.ibm.com: primitives, execution modes, error mitigation, transpilation guides
  3. IBM Quantum Learning platformlearning.quantum.ibm.com: "Basics of Quantum Information" (John Watrous), "Quantum Computing in Practice"
  4. Qiskit YouTube channel — "Preparing for the Qiskit Developer Certification 2.0" series
  5. Hands-on: local Qiskit install + qiskit-ibm-runtime + qiskit-aer; experiment with every API in this syllabus
  6. Community: SchrodinTeq sample-test walkthroughs, Udemy practice exams, Quantum Computing Stack Exchange

Sources: IBM Training certification page; exam-guide writeups corroborated across SchrodinTeq, ppalme's review, CertificationBox, and ValidExam objective listings. Verified 2026-07-24 against the official IBM Study Guide (resource-artifactory/official/C1000-179_STU_StudyGuideQiskitv2.pdf) — all 8 sections and weights match exactly (official section order: 1 operations, 2 visualize, 3 create, 4 run, 5 sampler, 6 estimator, 7 retrieve, 8 OpenQASM).