Source code for mqt.bench.benchmarks.bv
# 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
"""Bernstein-Vazirani benchmark definition."""
from __future__ import annotations
from qiskit.circuit import QuantumCircuit
from ._registry import register_benchmark
[docs]
@register_benchmark("bv", description="Bernstein-Vazirani")
def create_circuit(num_qubits: int, dynamic: bool = False, hidden_string: str | None = None) -> QuantumCircuit:
"""Create a quantum circuit for the Bernstein-Vazirani algorithm.
Arguments:
num_qubits: Total number of qubits in the circuit (including the flag qubit).
dynamic: Whether to use a dynamic layout (default: False).
hidden_string: The hidden bitstring to be found (default: alternating pattern of 1 and 0). If provided, its length must be num_qubits - 1.
Returns:
QuantumCircuit: Circuit implementing the Bernstein-Vazirani algorithm.
"""
# Generate a default hidden string if not provided
if hidden_string is None:
hidden_string = "".join([str(i % 2) for i in range(num_qubits - 1)])
# Ensure the hidden string matches the number of input qubits (excluding the flag qubit)
if len(hidden_string) != num_qubits - 1:
msg = "Length of hidden_string must be num_qubits - 1."
raise ValueError(msg)
# Create a quantum circuit: num_qubits (flag + inputs) and num_qubits - 1 classical bits
circuit = QuantumCircuit(num_qubits, num_qubits - 1)
# Prepare the flag qubit in the |1⟩ state
circuit.x(0)
if dynamic:
# Dynamic layout: process one input qubit at a time
for i in range(num_qubits - 1):
# Apply Hadamard to the working qubit
circuit.h(1)
# Apply controlled-Z based on the hidden bitstring
if hidden_string[i] == "1":
circuit.cz(1, 0)
# Apply Hadamard to the working qubit again
circuit.h(1)
# Measure the working qubit
circuit.measure(1, i)
# Reset the working qubit if more rounds are needed
if i < num_qubits - 2:
circuit.reset(1)
else:
# Static layout: process all input qubits at once
# Apply Hadamard to all input qubits
for i in range(1, num_qubits):
circuit.h(i)
# Apply controlled-Z gates based on the hidden bitstring
for i in range(1, num_qubits):
if hidden_string[i - 1] == "1":
circuit.cz(i, 0)
# Apply Hadamard to all input qubits again
for i in range(1, num_qubits):
circuit.h(i)
# Measure all input qubits
for i in range(1, num_qubits):
circuit.measure(i, i - 1)
circuit.name = "bv"
return circuit