workbench_algorithms.subroutines.qubitization
Main functions to construct circuits for Qubitization.
Qubitization
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
|
**kwargs
|
dict[str, Any]
|
Other arguments to pass to the compute. |
{}
|
QubitizedWalkOperator
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
|
**kwargs
|
dict[str, Any]
|
Other arguments to pass to the compute. |
{}
|