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
- Pass whole numbers: quantum_fourier_transform(4).
- Round derived sizes explicitly: quantum_fourier_transform(round(n / 2)) or use integer floor division //.
- 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
- Use // (floor division) instead of / when deriving qubit counts.
- Round log/sqrt-derived sizes explicitly before calling.
- Integral floats (4.0) are accepted; fractional ones are not — check .is_integer().
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
- number of qubits must be > 0.
- Power cannot be negative in any electrical/electronics syste
- One and only one argument must be 0
- One and only one argument must be 0
- Inductance cannot be negative
AI-assisted analysis of TheAlgorithms/Python@f5988cc097 (2026-08-14).
Data as JSON: /api/errors/783b0bd0fef546a8.
Report an issue: GitHub.