Source code for uniqc.algorithmics.state_preparation.basis_state
"""Computational basis-state preparation."""
__all__ = ["basis_state"]
from typing import List, Optional
from uniqc.circuit_builder import Circuit
[docs]
def basis_state(
circuit: Circuit,
state: int,
qubits: Optional[List[int]] = None,
) -> None:
r"""Prepare a computational basis state ``|state>`` on the given qubits.
Applies X gates to the qubits whose corresponding bit in the binary
representation of *state* is 1. All other qubits are left in ``|0>``.
Args:
circuit: Quantum circuit to operate on (mutated in-place).
state: Non-negative integer whose binary representation specifies
the target basis state. Qubit 0 corresponds to the
**least-significant bit**.
qubits: Qubit indices to use. ``None`` means ``list(range(n_bits))``
where *n_bits* is the number of bits needed.
Raises:
ValueError: *state* is negative.
Example:
>>> from uniqc.circuit_builder import Circuit
>>> from uniqc.algorithmics.state_preparation import basis_state
>>> c = Circuit()
>>> basis_state(c, state=5, qubits=[0, 1, 2]) # ``|101>``
"""
if state < 0:
raise ValueError(f"state must be non-negative, got {state}")
n_bits = max(1, state.bit_length())
if qubits is None:
qubits = list(range(n_bits))
for i, q in enumerate(qubits):
if (state >> i) & 1:
circuit.x(q)