Source code for mqt.bench.benchmarks.ae
# 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
"""Amplitude estimation benchmark definition. Code is based on https://qiskit.org/documentation/finance/tutorials/00_amplitude_estimation.html."""
from __future__ import annotations
import numpy as np
from qiskit.circuit import QuantumCircuit
from qiskit.circuit.library import phase_estimation
from ._registry import register_benchmark
[docs]
@register_benchmark("ae", description="Amplitude Estimation")
def create_circuit(num_qubits: int, probability: float = 0.2) -> QuantumCircuit:
"""Returns a quantum circuit implementing Quantum Amplitude Estimation.
Arguments:
num_qubits: Total number of qubits, including evaluation and target qubits. Must be at least 2 (1 evaluation + 1 target).
probability: Probability of the "good" state.
Returns:
QuantumCircuit: The constructed amplitude estimation circuit.
"""
if num_qubits < 2:
msg = "Number of qubits must be at least 2 (1 evaluation + 1 target)."
raise ValueError(msg)
# Compute the rotation angle: theta_p = 2 * arcsin(sqrt(p))
theta_p = 2 * np.arcsin(np.sqrt(probability))
# Create the state-preparation operator (A operator) as a single-qubit circuit.
state_preparation = QuantumCircuit(1)
state_preparation.ry(theta_p, 0)
# Create the Grover operator (Bernoulli Q operator) as a single-qubit circuit.
# It applies a rotation of 2 * theta_p, which corresponds to an effective rotation of 4*arcsin(sqrt(p)).
grover_operator = QuantumCircuit(1)
grover_operator.ry(2 * theta_p, 0)
# Compute the number of evaluation qubits (phase estimation qubits).
num_eval_qubits = num_qubits - 1
# Build the phase estimation circuit with the specified number of evaluation qubits and the Grover operator.
pe = phase_estimation(num_eval_qubits, grover_operator.to_gate(label="Q"))
# Create the overall circuit using the quantum registers from the phase estimation circuit.
qc = QuantumCircuit(*pe.qregs)
# Compose the state-preparation operator on the target qubit. We assume that the target qubit
# is the last qubit in the register list.
qc.compose(state_preparation, list(range(num_eval_qubits, qc.num_qubits)), inplace=True)
# Compose the phase estimation component.
qc.compose(pe.decompose(gates_to_decompose="unitary"), inplace=True)
# Name the circuit and add measurements to all evaluation qubits.
qc.name = "ae"
qc.measure_all()
return qc