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)