TheAlgorithms/Python · error · ValueError

number of qubits must be > 0.

Error message

number of qubits must be > 0.

What it means

Raised by quantum_fourier_transform() in quantum/q_fourier_transform.py when number_of_qubits <= 0. A QFT circuit needs at least one qubit; zero or negative counts make QuantumRegister construction invalid and the Hadamard/control loop (which iterates range(counter)) meaningless, so the guard rejects them with ValueError.

Source

Thrown at quantum/q_fourier_transform.py:61

        ...
    ValueError: number of qubits must be > 0.
    >>> quantum_fourier_transform('a')
    Traceback (most recent call last):
        ...
    TypeError: number of qubits must be a integer.
    >>> quantum_fourier_transform(100)
    Traceback (most recent call last):
        ...
    ValueError: number of qubits too large to simulate(>10).
    >>> quantum_fourier_transform(0.5)
    Traceback (most recent call last):
        ...
    ValueError: number of qubits must be exact integer.
    """
    if isinstance(number_of_qubits, str):
        raise TypeError("number of qubits must be a integer.")
    if number_of_qubits <= 0:
        raise ValueError("number of qubits must be > 0.")
    if math.floor(number_of_qubits) != number_of_qubits:
        raise ValueError("number of qubits must be exact integer.")
    if number_of_qubits > 10:
        raise ValueError("number of qubits too large to simulate(>10).")

    qr = QuantumRegister(number_of_qubits, "qr")
    cr = ClassicalRegister(number_of_qubits, "cr")

    quantum_circuit = QuantumCircuit(qr, cr)

    counter = number_of_qubits

    for i in range(counter):
        quantum_circuit.h(number_of_qubits - i - 1)
        counter -= 1
        for j in range(counter):
            quantum_circuit.cp(np.pi / 2 ** (counter - j), j, counter)

View on GitHub (pinned to f5988cc097)

Solutions

  1. Pass a positive integer count (1..10 for simulatable sizes).
  2. Validate at the source: if nq <= 0: reject in the UI/config layer.
  3. Clamp computed sizes: nq = max(1, total - reserved) if a zero count is a bug.

Example fix

# before
nq = data_qubits - ancilla  # can be 0
quantum_fourier_transform(nq)

# after
if nq <= 0:
    raise ValueError(f"need at least 1 qubit, got {nq}")
quantum_fourier_transform(nq)
Defensive patterns

Strategy: validation

Validate before calling

if not isinstance(number_of_qubits, (int, float)) or number_of_qubits <= 0:
    raise ValueError(f"number_of_qubits must be positive, got {number_of_qubits!r}")
quantum_fourier_transform(number_of_qubits)

Type guard

def is_positive_qubit_count(value) -> bool:
    return isinstance(value, (int, float)) and value > 0

Try / catch

try:
    qc = quantum_fourier_transform(nq)
except ValueError as e:
    if "must be > 0" in str(e):
        raise ConfigError("qubit count must be at least 1") from e
    raise

Prevention

When it happens

Trigger: quantum_fourier_transform(0), quantum_fourier_transform(-2), quantum_fourier_transform(-0.5). Note a float like 0.5 passes this check but fails the next one (exact-integer check).

Common situations: Computed register sizes that hit 0 (e.g. num_qubits = total - reserved with reserved >= total); user form input defaulting to 0; parameter sweeps starting at 0.

Related errors


AI-assisted analysis of TheAlgorithms/Python@f5988cc097 (2026-08-14). Data as JSON: /api/errors/aed3a34888721f39. Report an issue: GitHub.