qrisp.gidney_adder#

gidney_adder(a: int | str | BigInteger | QuantumVariable | DynamicQubitArray | list, b: QuantumVariable | DynamicQubitArray | list, c_in: Qubit | QuantumBool | None = None, c_out: Qubit | QuantumBool | None = None, ctrl: Qubit | QuantumBool | None = None)[source]#

In-place Gidney adder performing b += a.

Based on arXiv:1709.06648. Works in both standard static and dynamic modes.

Parameters:
aint, str, jnp.ndarray, BigInteger, QuantumVariable, DynamicQubitArray, or list

The input value a. When a is a classical value (int, binary string, JAX scalar, or BigInteger), the semi-classical path is taken and no quantum encoding of a is created. When a is a quantum register or qubit list, the quantum-quantum path is used. If a list, must contain only qubit-like objects (elements with a callable qs attribute); the list may be empty for quantum-quantum mode. Binary strings are little-endian: "10" means bit 0 = 1, bit 1 = 0 (decimal value 1).

bQuantumVariable, DynamicQubitArray, or list

The target register that is updated in-place: \(b \leftarrow b + a\). If a list, must be a non-empty list of qubit-like objects (elements with a callable qs attribute).

c_inQuantumBool, Qubit, or None

Optional single-qubit carry-in. When provided, the addition becomes \(b \leftarrow b + a + c_{\text{in}}\).

c_outQuantumBool, Qubit, or None

Optional single-qubit carry-out. When provided, this qubit receives the overflow carry of the addition.

ctrlQubit or None

Optional control qubit. When provided, the entire addition is executed only if ctrl is in state \(\ket{1}\) (controlled addition).

Raises:
ValueError

If inputs do not match one of the supported combinations: classical-quantum (classical a, quantum b) or quantum-quantum (quantum a, quantum b).

Examples

>>> from qrisp import QuantumFloat, gidney_adder
>>> a = QuantumFloat(4)
>>> b = QuantumFloat(4)
>>> a[:] = 4
>>> b[:] = 5
>>> gidney_adder(a, b)
>>> print(b)
{9: 1.0}