Source code for geqo.gates.multi_qubit_gates

from geqo.core.quantum_operation import QuantumOperation
from geqo.core.quantum_circuit import Sequence
from geqo.gates.fundamental_gates import CNOT, Hadamard, Phase


[docs] class Toffoli(QuantumOperation): """Toffoli (CCNOT) gate on three qubits.""" def __init__(self, nameSpacePrefix=""): """ The constructor of this class takes a name space prefix, which is used for the internal decomposition of this gate. Parameters ---------- nameSpacePrefix : String This string is prepended to all names of internally used gates. Returns ------- Toffoli : geqo.gates.multi_qubit_gates.Toffoli An object of this class that corresponds to the Toffoli gate, i.e. a double-controlled CNOT gate. """ self.nameSpacePrefix = nameSpacePrefix def __repr__(self): """ Returns a representation of the object as character string. ------- string_representation : String Representation of the object as character string. """ return f'Toffoli("{self.nameSpacePrefix}")' def __eq__(self, other): """ Comparator with other objects. Parameters ---------- other : An object, which should be compared to this object. Returns ------- True : If the provided object is of the same type and if the name space prefixes are the same. False : else """ if not isinstance(other, Toffoli): return False else: return self.nameSpacePrefix == other.nameSpacePrefix
[docs] def getInverse(self): """ Return the same object, because it is inverse to itself. Returns ------- Toffoli : geqo.gates.multi_qubit_gates.Toffoli Return the object, because it is self-inverse. """ return self
[docs] def getEquivalentSequence(self): """ Return an object of the class ```Sequence```, which contains several operations that correspond to the Toffoli gate. The name space prefix is prepended to all internal gates when needed. Returns ------- sequence : geqo.core.Sequence An object of the class ```Sequence``` without operations, but with the appropriate bits and qubits. The name space prefix is prepended to all internal gates when needed. """ phPlusPi = Phase(self.nameSpacePrefix + "S.Pi/4") phMinusPi = Phase(self.nameSpacePrefix + "-S.Pi/4") seq = [ (Hadamard(), [2]), (CNOT(), [1, 2]), (phMinusPi, [2]), (CNOT(), [0, 2]), (phPlusPi, [2]), (CNOT(), [1, 2]), (phMinusPi, [2]), (CNOT(), [0, 2]), (phPlusPi, [1]), (phPlusPi, [2]), (CNOT(), [0, 1]), (Hadamard(), [2]), (phPlusPi, [0]), (phMinusPi, [1]), (CNOT(), [0, 1]), ] return Sequence([], [0, 1, 2], seq)
[docs] def getNumberQubits(self): """ Return the number of qubits that are used by this permuation operation. Returns ------- 3 : int The Toffoli gate acts on 3 qubits. """ return 3
[docs] def getNumberClassicalBits(self): """ Returns ------- 0 : int The number of classical bits, which are used by PermuteQubits, is zero. """ return 0
[docs] def hasDecomposition(self): """ Returns ------- True : Bool The Toffoli gate can be decomposed into a sequence of simpler gates. """ return True
[docs] def isUnitary(self): """ Returns ------- True : Bool This is a unitary operation. """ return True