Source code for bqskit.ir.gates.constant.shift

"""This module implements the ShiftGate."""
from __future__ import annotations

import numpy as np

from bqskit.ir.gates.constantgate import ConstantGate
from bqskit.ir.gates.quditgate import QuditGate
from bqskit.qis.unitary.unitarymatrix import UnitaryMatrix
from bqskit.utils.typing import is_integer


[docs] class ShiftGate(ConstantGate, QuditGate): """ The one-qudit shift (X) gate. This is a Weyl-Heisenberg gate. This gate shifts the state of a qudit up by one level modulo. For example, the shift gate on a qubit is the Pauli-X gate. The shift gate on a qutrit is the following matrix: .. math:: \\begin{pmatrix} 0 & 0 & 1 \\\\ 1 & 0 & 0 \\\\ 0 & 1 & 0 \\\\ \\end{pmatrix} The shift gate is generally given by the following formula: .. math:: \\begin{equation} X = \\sum_a |a + 1 mod d ><a| \\end{equation} where d is the number of levels (2 levels is a qubit, 3 levels is a qutrit, etc.) References: - https://arxiv.org/pdf/2302.07966.pdf """ _num_qudits = 1
[docs] def __init__(self, radix: int = 2) -> None: """ Construct a ShiftGate. Args: radix (int): The number of qudit levels (>=2). Defaults to qutrits. Raises: ValueError: if radix < 2 """ if not is_integer(radix): raise TypeError(f'Expected integer for radix, got {type(radix)}.') if radix < 2: raise ValueError(f'Radix must be greater than 1, got {radix}.') self._radix = radix # Calculate unitary matrix = np.zeros([radix, radix]) for j in range(radix): matrix[(j + 1) % radix, j] = 1 self._utry = UnitaryMatrix(matrix, self.radixes)