Skip to content

workbench_algorithms.subroutines.qubitization

Main functions to construct circuits for Qubitization.

Qubitization

Qubitization(
    block_encoding: Qubrick, **kwargs: dict[str, Any]
)

Bases: Qubrick

Canonical qubitization iterate.

This Qubrick follows the canonical form of Qubitization introduced in "Hamiltonian Simulation by Qubitization" (arXiv:1610.06546) and used extensively in Lin Lin's lecture notes). This convention starts with a block encoding followed by an all-zero reflection.

Parameters:

Name Type Description Default
block_encoding Qubrick

Qubrick to apply the block encoding circuit.

required
**kwargs dict[str, Any]

Other arguments to pass to the init.

{}

compute

compute(
    psi: Qubits,
    be_ancilla_reg: Qubits,
    data: PauliSum | list[int],
    ctrl: Qubits | int = 0,
    **kwargs: dict[str, Any],
)

Compute the qubitization.

Parameters:

Name Type Description Default
psi Qubits

Target state register.

required
be_ancilla_reg Qubits

Block encoding auxiliary register.

required
data PauliSum | list[int]

Hamiltonian or bitstring values to be qubitized.

required
ctrl Qubits | int

Register to control the qubitization on. Defaults to 0.

0
**kwargs dict[str, Any]

Other arguments to pass to the compute.

{}

QubitizedWalkOperator

QubitizedWalkOperator(
    state_prep: Qubrick,
    select: Qubrick,
    **kwargs: dict[str, Any],
)

Bases: Qubrick

Qubitization iterate.

This Qubrick uses the form introduced in "Quantum Algorithm for Spectral Measurement with Lower Gate Count" (arxiv:1711.11025).

This form is also used by the Google group for their QPE-Qubitization papers. This form differs from the canonical Qubitization iterate (see Fig. 1 of "Even more efficient quantum computations of chemistry through tensor hypercontraction" (arXiv:2011.03494)), and effectively performs a qubitization of a quantum walk, hence the name QubitizedWalkOperator.

Note

Despite being a Qubitization iterate, this Qubrick has a different signature than the canonical Qubitization Qubrick, in that it is defined in terms of \(\text{PREP}\) and \(\text{SELECT}\) rather than arbitrary block encodings. Furthermore, when plugging it in to QPE, one must be careful with what initial state is passed to QPE. When using this Qubrick, one must first call \(\text{PREP}\)'s compute before calling QPE's compute, as this \(\text{PREP}\) effectively prepares a portion of an eigenstate of the QubitizedWalkOperator (or at least a state which has meaningful support on it).

Parameters:

Name Type Description Default
state_prep Qubrick

Qubrick to apply the state prep.

required
select Qubrick

Qubrick to select the Hamiltonian terms from.

required
**kwargs dict[str, Any]

Other arguments to pass to the init.

{}

compute

compute(
    psi: Qubits,
    be_ancilla_reg: Qubits,
    data: PauliSum | list[int],
    ctrl: Qubits | int = 0,
    **kwargs: dict[str, Any],
)

Compute the qubitization.

Parameters:

Name Type Description Default
psi Qubits

Target state register.

required
be_ancilla_reg Qubits

Block encoding auxiliary register.

required
data PauliSum | list[int]

Hamiltonian or bitstring values to be qubitized.

required
ctrl Qubits | int

Register to control the qubitization on. Defaults to 0.

0
**kwargs dict[str, Any]

Other arguments to pass to the compute.

{}