Source code for qolumbina.programs.hamiltonian.diagonal_hamiltonian

# This code is developed through cross-language conversion from 
# https://github.com/MgcosA/Code_of_Testing_Oracle_Quantum_Program_Article/blob/master/qolumbina/programs/HamiltonX.qs
# 
# In detail, the raw program is written in Q#, and we rewrite it in Qiskit.

from qiskit import QuantumCircuit

# ---------- benchmark registration ----------
from ..benchmark_registry import register_benchmark
from pathlib import Path
@register_benchmark(
    Path(__file__).stem,
    family=Path(__file__).resolve().parent.name,
    description="Hamiltonian evolution for diagonal Z Hamiltonian",
    class_name="DiagonalZHamiltonian",
    source={
        "repo": "https://github.com/MgcosA/Code_of_Testing_Oracle_Quantum_Program_Article/blob/master/",
        "file": "qolumbina/programs/HamiltonX.qs",
        "sdk": "Q#",
        "available_doc": True        
    },
    testability_refactoring=[
        "Cross-language translation", 
        "Structure reorganization",
        "Input validation"  # Ensure $n$ and $t$ are positive
    ] 
)
def create_diagonal_z_hamiltonian(input_qubits, t):
    return DiagonalZHamiltonian(input_qubits=input_qubits, t=t)


[docs] class DiagonalZHamiltonian(QuantumCircuit): r""" Implements the Hamiltonian evolution exp(-i * H * t) using only single-qubit Rz gates. """ def __init__(self, input_qubits: int, t: float, name: str | None = None): r""" Args: input_qubits: Number of qubits in the system (:math:`n`). t: Evolution time :math:`t` (:math:`t > 0`). name: Optional name for the circuit. Raises: ValueError: If ``t`` is negative. """ if t < 0: raise ValueError("t should be non-negative") super().__init__(input_qubits, name=name or "DiagonalZHamiltonian") self._time = t self._input_qubits = input_qubits self._build() # ---------- build ---------- def _build(self) -> None: qs = self.qubits n = len(qs) # Apply Rz rotation for each qubit according to 2^i scaling for i in range(n): angle = self._time * (2 ** i) # t * IntAsDouble(2 ^ i) self.rz(angle, qs[i])