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])