Source code for qolumbina.programs.is_two_power.is_two_power_qubit

# 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, QuantumRegister

# ---------- 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 (qubit version)",
    class_name="Is2PowerQubit",
    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_qubit(input_qubits):
    return Is2PowerQubit(input_qubits=input_qubits)


[docs] class Is2PowerQubit(QuantumCircuit): r""" Qubit version of ``Is2Power_Q`` operation. Acts on n input qubits and 1 target qubit. Flips the target qubit when the input qubits represent a power of 2, following the original Q# ``Is2Power_Q`` logic. """ 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 # ---------- registers ---------- q_input = QuantumRegister(input_qubits, "q") q_target = QuantumRegister(1, "target") super().__init__(q_input, q_target, name=name or "Is2Power_Q") self._build() # ---------- build ---------- def _build(self) -> None: qs = self.qregs[0] qtarget = self.qregs[1][0] n = len(qs) # MultiX on input qubits -> MultiX(qs) for q in qs: self.x(q) # Loop over input qubits for i in range(n): self.x(qs[i]) # Multi-controlled X on target -> Controlled X(qs, qtarget) # All input qubits control the target self.mcx(qs, qtarget) self.x(qs[i]) # Uncompute MultiX on input qubits -> MultiX(qs) for q in qs: self.x(q)