Source code for gates

# Import necessary packages
import quimb as quimb
import numpy as np
from qiskit import QuantumCircuit, execute, Aer
from qiskit.circuit import library as lb

# +
#---------QUIMB-----------
# Controlled phase shift
[docs]def CPHASE(phi, dtype=complex, sparse=False): """Construct a controlled phase gate for two qubits. Parameters ---------- phi : double Angle of rotation. sparse : bool, optional Whether to construct a sparse operator. Returns ------- C : immutable operator The controlled two-qubit gate operator. """ ph = quimb.gen.operators.qu([[1., 0.], [0., np.exp(1.0j * phi )]], dtype=dtype, sparse=sparse) kws = {'dtype': dtype, 'sparse': sparse} op = ((quimb.gen.operators.qu([1, 0], qtype='dop', **kws) & quimb.gen.operators.eye(2, **kws)) + (quimb.gen.operators.qu([0, 1], qtype='dop', **kws) & ph)) quimb.gen.operators.make_immutable(op) return op
#controlled phase + swap gate def cphase_swap_quimb(phase): cphase = np.array(quimb.controlled('z')) ** phase swap = np.array(quimb.swap()) return swap @ cphase # -
[docs]class GATES(): """ Class to contain the various gates in quimb format Attributes ---------- H: matrix shape(2, 2) Hadamard gate NOT: matrix shape(2, 2) Not gate CNOT: matrix shape(4, 4) controlled not gate SWAP: matrix shape(4, 4) swap gate CPHASE(phi): function returns the controlled phase matrix with phase *phi* gate_dict: dictionary dictionary of the format qiskit_gate_name : quimb_gate """ def __init__(self): """ Initialize the various gates from quimb and create a dictionary with the format qiskit_gate_name : quimb_gate """ # Controlled NOT self.CNOT = quimb.controlled('not') # Hadamard self.H = quimb.gen.operators.hadamard() # NOT self.NOT = quimb.gen.operators.pauli('x') # SWAP self.SWAP = quimb.gen.operators.swap() # CPHASE self.CPHASE = CPHASE self.gate_dict = {'h': self.H, 'cx': self.CNOT, 'cp': self.CPHASE, 'swap': self.SWAP, 'x' : self.NOT}
#---QISKIT--- #Controlled phase + swap gate
[docs]def cphase_swap_qiskit(circuit, control, target, phase): """ Apply to a quantum circuit *circuit* the cphase and swap gate. Acts in place. Parameters ---------- circuit: Quantum Circuit Qiskit quantum circuit control: int Index of the control qubit for the controlled phase target: int Index of the target qubit for the controlled phase phase: double Phase to apply in the controlled phase in radiants Returns ------- None: None Acts in place """ circuit.cp(phase, control, target) circuit.swap(control, target)
# ------- CIRQ -------
[docs]def cphase_and_swap_cirq(ctrl, target, phase): """ Combine the CPHASE gate with the SWAP operation, used for QFT algorithm. Input crtl: cirq.devices.line_qubit.LineQubit control qubit target: cirq.devices.line_qubit.LineQubit target qubit phase: double phase to apply in radiants Return cirq gate """ yield cirq.CZ(ctrl, target) ** phase yield cirq.SWAP(ctrl, target)