Source code for mqt.bench.benchmarks.qpeexact

# 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

"""QOE exact benchmark definition."""

from __future__ import annotations

import random
from fractions import Fraction

import numpy as np
from qiskit.circuit import ClassicalRegister, QuantumCircuit, QuantumRegister
from qiskit.synthesis import synth_qft_full

from ._registry import register_benchmark


[docs] @register_benchmark("qpeexact", description="Quantum Phase Estimation (QPE) exactly representable phase") def create_circuit(num_qubits: int) -> QuantumCircuit: """Returns a quantum circuit implementing the Quantum Phase Estimation algorithm for a phase which can be exactly estimated. Arguments: num_qubits: Number of qubits of the returned quantum circuit. Must be at least 2. Returns: QuantumCircuit: A quantum circuit implementing the Quantum Phase Estimation algorithm for a phase which can be exactly estimated. """ if num_qubits <= 1: msg = "Number of qubits must be at least 2 for QPE exact." raise ValueError(msg) num_qubits = num_qubits - 1 # because of ancilla qubit q = QuantumRegister(num_qubits, "q") psi = QuantumRegister(1, "psi") c = ClassicalRegister(num_qubits, "c") qc = QuantumCircuit(q, psi, c, name="qpeexact") # get random n-bit string as target phase random.seed(10) theta = 0 while theta == 0: theta = random.getrandbits(num_qubits) lam = Fraction(0, 1) # print("theta : ", theta, "correspond to", theta / (1 << n), "bin: ") for i in range(num_qubits): if theta & (1 << (num_qubits - i - 1)): lam += Fraction(1, (1 << i)) qc.x(psi) qc.h(q) for i in range(num_qubits): angle = (lam * (1 << i)) % 2 if angle > 1: angle -= 2 if angle != 0: qc.cp(angle * np.pi, psi, q[i]) qc.compose( synth_qft_full(num_qubits=num_qubits, inverse=True), inplace=True, qubits=list(range(num_qubits)), ) qc.barrier() qc.measure(q, c) return qc