TheAlgorithms/Python · error · ValueError

number of qubits must be exact integer.

Error message

number of qubits must be exact integer.

What it means

Raised by quantum_fourier_transform() in quantum/q_fourier_transform.py when number_of_qubits is numeric but not a whole number (math.floor(x) != x). QuantumRegister sizes must be exact integers; the library chose to accept integral-numeric types (e.g. 4.0 passes) but reject fractional values like 0.5 that would otherwise fail deep inside Qiskit with an opaque error.

Source

Thrown at quantum/q_fourier_transform.py:63

    >>> 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)

    for k in range(number_of_qubits // 2):
        quantum_circuit.swap(k, number_of_qubits - k - 1)

View on GitHub (pinned to f5988cc097)

Solutions

  1. Pass whole numbers: quantum_fourier_transform(4).
  2. Round derived sizes explicitly: quantum_fourier_transform(round(n / 2)) or use integer floor division //.
  3. Validate with .is_integer() when the value must be float-sourced: if not nq.is_integer(): raise.

Example fix

# before
nq = num_states / 2  # float like 5.5 or 5.0
quantum_fourier_transform(nq)

# after
nq = num_states // 2  # exact int
quantum_fourier_transform(nq)
Defensive patterns

Strategy: validation

Validate before calling

nq = round(nq)  # or: num_states // 2
if isinstance(nq, float) and not nq.is_integer():
    raise ValueError(f"qubit count must be whole, got {nq}")
quantum_fourier_transform(nq)

Type guard

def is_whole_number(value) -> bool:
    return isinstance(value, (int, float)) and float(value).is_integer() and value > 0

Try / catch

try:
    qc = quantum_fourier_transform(nq)
except ValueError as e:
    if "exact integer" in str(e):
        qc = quantum_fourier_transform(round(nq))
    else:
        raise

Prevention

When it happens

Trigger: quantum_fourier_transform(0.5), quantum_fourier_transform(7.3), quantum_fourier_transform(2**0.5). Note quantum_fourier_transform(4.0) passes because floor(4.0) == 4.0.

Common situations: Register sizes derived from division (n / 2), logarithms (math.log2(n)), or scaling factors; float arithmetic that should have been integer; ML pipeline hyperparameters sampled as floats.

Related errors


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