Generic Select#
Bloqs for applying SELECT unitary for LCU of Pauli Strings.
from qualtran import Bloq, CompositeBloq, BloqBuilder, Signature, Register
from qualtran import QBit, QInt, QUInt, QAny
from qualtran.drawing import show_bloq, show_call_graph, show_counts_sigma
from typing import *
import numpy as np
import sympy
import cirq
SelectPauliLCU#
A SELECT bloq for selecting and applying operators from an array of PauliStrings.
Where \(U_l\) is a member of the Pauli group.
This bloq uses the unary iteration scheme to apply select_unitaries[selection] to target
controlled on the single-bit control register.
Parameters#
selection_bitsize: The size of the indexingselectregister. This should be at leastlog2(len(select_unitaries))target_bitsize: The size of thetargetregister.select_unitaries: List ofDensePauliStrings to apply to thetargetregister. Each dense pauli string must containtarget_bitsizeterms.control_val: Optional control value. If specified, a singly controlled gate is constructed.
from qualtran.bloqs.multiplexers.select_pauli_lcu import SelectPauliLCU
Example Instances#
target_bitsize = 4
us = ['XIXI', 'YIYI', 'ZZZZ', 'ZXYZ']
us = [cirq.DensePauliString(u) for u in us]
selection_bitsize = int(np.ceil(np.log2(len(us))))
select_pauli_lcu = SelectPauliLCU(selection_bitsize, target_bitsize, select_unitaries=us)
Graphical Signature#
from qualtran.drawing import show_bloqs
show_bloqs([select_pauli_lcu],
['`select_pauli_lcu`'])
Call Graph#
from qualtran.resource_counting.generalizers import ignore_split_join
select_pauli_lcu_g, select_pauli_lcu_sigma = select_pauli_lcu.call_graph(max_depth=1, generalizer=ignore_split_join)
show_call_graph(select_pauli_lcu_g)
show_counts_sigma(select_pauli_lcu_sigma)
Counts totals:
And: 2And†: 2CNOT: 2C[cirq.+XX]: 1C[cirq.+YY]: 1C[cirq.+ZXYZ]: 1C[cirq.+ZZZZ]: 1X: 2