Source code for qolumbina.programs.is_two_power.is_two_power_phase

# This code is developed through cross-language conversion from 
# https://github.com/MgcosA/Code_of_Testing_Oracle_Quantum_Program_Article/blob/master/qolumbina/programs/Is2Power.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="Check if input is a power of two (phase version)",
    class_name="Is2PowerPhase",
    source={
        "repo": "https://github.com/MgcosA/Code_of_Testing_Oracle_Quantum_Program_Article/blob/master/",
        "file": "qolumbina/programs/Is2Power.qs",
        "sdk": "Q#",
        "available_doc": True
    },
    testability_refactoring=[
        "Cross-language translation", 
        "Structure reorganization"
    ] 
)
def create_is_two_power_phase(input_qubits):
    return Is2PowerPhase(input_qubits=input_qubits)


[docs] class Is2PowerPhase(QuantumCircuit): r""" Implements Q# operation ``Is2Power_P``: Checks if the input qubit register represents a 2-power. Uses MultiX (X on all qubits) and MCZ (emulated via H-MCX-H). """ def __init__(self, input_qubits: int, name: str | None = None): r""" Args: input_qubits: Number of qubits in the input register (:math:`n`). name: Optional name for the circuit. """ self._input_qubits = input_qubits super().__init__(input_qubits, name=name or "Is2PowerPhase") self._build() def _build(self): qs = self.qubits n = len(qs) # MultiX: X on all qubits -> MultiX(qs) for q in qs: self.x(q) # Loop over each qubit for i in range(n): self.x(qs[i]) # Controlled Z on last qubit controlled by all except last # -> Controlled Z(qs[0..N-2], qs[N-1]) if n > 1: # only if there is more than 1 qubit # Apply H to target, then MCX, then H to emulate MCZ self.h(qs[-1]) self.mcx(qs[0: -1], qs[-1]) self.h(qs[-1]) self.x(qs[i]) # MultiX again -> MultiX(qs) for q in qs: self.x(q)