Source code for mqt.bench.benchmarks.dj
# 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
"""Deutsch Josza benchmark definition. Code is based on https://qiskit.org/textbook/ch-algorithms/deutsch-jozsa.html."""
from __future__ import annotations
from typing import TYPE_CHECKING
import numpy as np
from qiskit.circuit import QuantumCircuit
from ._registry import register_benchmark
if TYPE_CHECKING:
from qiskit.circuit.gate import Gate
[docs]
def dj_oracle(case: str, n: int) -> Gate:
"""Returns a quantum circuit implementing the Deutsch-Josza oracle."""
# plus one output qubit
oracle_qc = QuantumCircuit(n + 1)
rng = np.random.default_rng(10)
if case == "balanced":
b_str = ""
for _ in range(n):
b = rng.integers(0, 2)
b_str = b_str + str(b)
for qubit in range(len(b_str)):
if b_str[qubit] == "1":
oracle_qc.x(qubit)
for qubit in range(n):
oracle_qc.cx(qubit, n)
for qubit in range(len(b_str)):
if b_str[qubit] == "1":
oracle_qc.x(qubit)
if case == "constant":
output = rng.integers(2)
if output == 1:
oracle_qc.x(n)
oracle_gate = oracle_qc.to_gate()
oracle_gate.name = "Oracle" # To show when we display the circuit
return oracle_gate
[docs]
def dj_algorithm(oracle: Gate, n: int) -> QuantumCircuit:
"""Returns a quantum circuit implementing the Deutsch-Josza algorithm."""
dj_circuit = QuantumCircuit(n + 1, n)
dj_circuit.x(n)
dj_circuit.h(n)
for qubit in range(n):
dj_circuit.h(qubit)
dj_circuit.append(oracle, range(n + 1))
for qubit in range(n):
dj_circuit.h(qubit)
dj_circuit.barrier()
for i in range(n):
dj_circuit.measure(i, i)
return dj_circuit
[docs]
@register_benchmark("dj", description="Deutsch-Jozsa")
def create_circuit(num_qubits: int, balanced: bool = True) -> QuantumCircuit:
"""Returns a quantum circuit implementing the Deutsch-Josza algorithm.
Arguments:
num_qubits: number of qubits of the returned quantum circuit
balanced: True for a balanced and False for a constant oracle
"""
oracle_mode = "balanced" if balanced else "constant"
num_qubits = num_qubits - 1 # because of ancilla qubit
oracle_gate = dj_oracle(oracle_mode, num_qubits)
qc = dj_algorithm(oracle_gate, num_qubits)
qc.name = "dj"
return qc