Source code for mqt.bench.benchmarks.grover

# 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

"""Grover benchmark definition."""

from __future__ import annotations

import numpy as np
from qiskit.circuit import AncillaRegister, ForLoopOp, QuantumCircuit, QuantumRegister
from qiskit.circuit.library import grover_operator

from ._registry import register_benchmark


[docs] @register_benchmark("grover", description="Grover's Algorithm") def create_circuit(num_qubits: int, *, for_loop: bool = False) -> QuantumCircuit: """Returns a quantum circuit implementing Grover's algorithm. Args: num_qubits: number of qubits of the returned quantum circuit for_loop: whether to use a structured for-loop for the Grover iterations """ num_qubits = num_qubits - 1 # -1 because of the flag qubit q = QuantumRegister(num_qubits, "q") flag = AncillaRegister(1, "flag") state_preparation = QuantumCircuit(q, flag) state_preparation.h(q) state_preparation.x(flag) oracle = QuantumCircuit(q, flag) oracle.mcp(np.pi, q, flag) operator = grover_operator(oracle) iterations = int(np.pi / 4 * np.sqrt(2**num_qubits)) num_qubits = operator.num_qubits - 1 # -1 because last qubit is "flag" qubit and already taken care of # num_qubits may differ now depending on the mcx_mode q2 = QuantumRegister(num_qubits, "q") qc = QuantumCircuit(q2, flag, name="grover") qc.compose(state_preparation, inplace=True) if for_loop: body = QuantumCircuit(q2, flag) body.append(operator.to_gate(), body.qubits) qc.append(ForLoopOp(range(iterations), None, body), qc.qubits) else: qc.compose(operator.power(iterations), inplace=True) qc.measure_all() qc.name = qc.name return qc