HRSCumulativeMultiplier
class qiskit.circuit.library.HRSCumulativeMultiplier(num_state_qubits, num_result_qubits=None, adder=None, name='HRSCumulativeMultiplier')
Bases: Multiplier
A multiplication circuit to store product of two input registers out-of-place.
Circuit uses the approach from [1]. As an example, a multiplier circuit that performs a non-modular multiplication on two 3-qubit sized registers with the default adder is as follows (where Adder
denotes the CDKMRippleCarryAdder
):
a_0: ────■─────────────────────────
│
a_1: ────┼─────────■───────────────
│ │
a_2: ────┼─────────┼─────────■─────
┌───┴────┐┌───┴────┐┌───┴────┐
b_0: ┤0 ├┤0 ├┤0 ├
│ ││ ││ │
b_1: ┤1 ├┤1 ├┤1 ├
│ ││ ││ │
b_2: ┤2 ├┤2 ├┤2 ├
│ ││ ││ │
out_0: ┤3 ├┤ ├┤ ├
│ ││ ││ │
out_1: ┤4 ├┤3 ├┤ ├
│ Adder ││ Adder ││ Adder │
out_2: ┤5 ├┤4 ├┤3 ├
│ ││ ││ │
out_3: ┤6 ├┤5 ├┤4 ├
│ ││ ││ │
out_4: ┤ ├┤6 ├┤5 ├
│ ││ ││ │
out_5: ┤ ├┤ ├┤6 ├
│ ││ ││ │
aux_0: ┤7 ├┤7 ├┤7 ├
└────────┘└────────┘└────────┘
Multiplication in this circuit is implemented in a classical approach by performing a series of shifted additions using one of the input registers while the qubits from the other input register act as control qubits for the adders.
The MultiplierGate
objects represents a multiplication, like this circuit class, but allows the compiler to select the optimal decomposition based on the context. Specific implementations can be set via the HLSConfig
, e.g. this circuit can be chosen via Multiplier=["cumulative_h18"]
.
References:
[1] Häner et al., Optimizing Quantum Circuits for Arithmetic, 2018. arXiv:1805.12445
Parameters
- num_state_qubits (int) – The number of qubits in either input register for state or . The two input registers must have the same number of qubits.
- num_result_qubits (int | None) – The number of result qubits to limit the output to. If number of result qubits is , multiplication modulo is performed to limit the output to the specified number of qubits. Default value is
2 * num_state_qubits
to represent any possible result from the multiplication of the two inputs. - adder (QuantumCircuit | None) – Half adder circuit to be used for performing multiplication. The CDKMRippleCarryAdder is used as default if no adder is provided.
- name (str) – The name of the circuit object.
Raises
NotImplementedError – If num_result_qubits
is not default and a custom adder is provided.
Attributes
name
Type: str
A human-readable name for the circuit.
Example
from qiskit import QuantumCircuit
qc = QuantumCircuit(2, 2, name="my_circuit")
print(qc.name)
my_circuit