Source code for mqt.bench.benchmarks.hrs_cumulative_multiplier
# Copyright (c) 2023 - 2026 Chair for Design Automation, TUM
# Copyright (c) 2025 - 2026 Munich Quantum Software Company GmbH
# All rights reserved.
#
# SPDX-License-Identifier: MIT
#
# Licensed under the MIT License
# This code is part of Qiskit.
#
# (C) Copyright IBM 2017, 2021.
#
# This code is licensed under the Apache License, Version 2.0. You may
# obtain a copy of this license in the LICENSE.txt file in the root directory
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
#
# Any modifications or derivative works of this code must retain this
# copyright notice, and modified files need to carry a notice indicating
# that they have been altered from the originals.
#
# Modified by MQSC, 2025.
"""HRS Cumulative Multiplier."""
from __future__ import annotations
from qiskit.circuit import AncillaRegister, QuantumCircuit, QuantumRegister
from qiskit.synthesis import adder_ripple_c04
from ._registry import register_benchmark
[docs]
@register_benchmark("hrs_cumulative_multiplier", description="Häner-Roetteler-Svore (HRS) Cumulative Multiplier")
def create_circuit(num_qubits: int) -> QuantumCircuit:
"""Create a hrs cumulative multiplier circuit.
Arguments:
num_qubits: Number of qubits of the returned quantum circuit. Must be an integer ≥ 5 and (num_qubits - 1) must be divisible by 4.
Returns:
QuantumCircuit: The constructed hrs cumulative multiplier circuit.
See Also:
:class:`qiskit.circuit.library.HRSCumulativeMultiplier`
"""
if (num_qubits - 1) % 4 or num_qubits < 5:
msg = "num_qubits must be an integer ≥ 5 and (num_qubits - 1) must be divisible by 4."
raise ValueError(msg)
num_state_qubits = num_qubits // 4
num_result_qubits = 2 * num_state_qubits
# define the registers
qr_a = QuantumRegister(num_state_qubits, name="a")
qr_b = QuantumRegister(num_state_qubits, name="b")
qr_out = QuantumRegister(num_result_qubits, name="out")
# prepare adder as controlled gate
adder = adder_ripple_c04(num_state_qubits, kind="half")
# get the number of helper qubits needed
num_helper_qubits = adder.num_ancillas
# add helper qubits if required
qr_helper = AncillaRegister(num_helper_qubits, "helper") if num_helper_qubits else None
qregs = [qr_a, qr_b, qr_out] + ([qr_helper] if qr_helper else [])
# build multiplication circuit
qc = QuantumCircuit(*qregs)
for i in range(num_state_qubits):
num_adder_qubits = num_state_qubits
adder_for_current_step = adder
controlled_adder = adder_for_current_step.to_gate().control(1)
qr_list = [qr_a[i], *qr_b[:num_adder_qubits], *qr_out[i : num_state_qubits + i + 1]]
if num_helper_qubits > 0 and qr_helper:
qr_list.extend(qr_helper[:])
qc.append(controlled_adder, qr_list)
qc.measure_all()
qc.name = "hrs_cumulative_multiplier"
return qc