Author: Anubhav Vardhan (anubhavvardhan@gmail.com)
For more information about QuTiP see http://qutip.org
In [1]:
%matplotlib inline
In [2]:
from IPython.display import Image
In [3]:
from numpy import pi
In [4]:
from qutip import *
In [5]:
cphase(pi/2)
Out[5]:
In [6]:
Image(filename='images/cphase.png')
Out[6]:
In [7]:
rx(pi/2)
Out[7]:
In [8]:
Image(filename='images/rx.png')
Out[8]:
In [9]:
ry(pi/2)
Out[9]:
In [10]:
Image(filename='images/ry.png')
Out[10]:
In [11]:
rz(pi/2)
Out[11]:
In [12]:
Image(filename='images/rz.png')
Out[12]:
In [13]:
cnot()
Out[13]:
In [14]:
Image(filename='images/cnot.png')
Out[14]:
In [15]:
csign()
Out[15]:
In [16]:
Image(filename='images/csign.png')
Out[16]:
In [17]:
berkeley()
Out[17]:
In [18]:
Image(filename='images/berkeley.png')
Out[18]:
In [19]:
swapalpha(pi/2)
Out[19]:
In [20]:
Image(filename='images/swapalpha.png')
Out[20]:
In [21]:
fredkin()
Out[21]:
In [22]:
Image(filename='images/fredkin.png')
Out[22]:
In [23]:
toffoli()
Out[23]:
In [24]:
Image(filename='images/toffoli.png')
Out[24]:
In [25]:
swap()
Out[25]:
In [26]:
Image(filename='images/swap.png')
Out[26]:
In [27]:
iswap()
Out[27]:
In [28]:
Image(filename='images/iswap.png')
Out[28]:
In [29]:
sqrtiswap()
Out[29]:
In [30]:
Image(filename='images/sqrtiswap.png')
Out[30]:
In [31]:
sqrtswap()
Out[31]:
In [32]:
Image(filename='images/sqrtswap.png')
Out[32]:
In [33]:
sqrtnot()
Out[33]:
In [34]:
Image(filename='images/sqrtnot.png')
Out[34]:
In [35]:
snot()
Out[35]:
In [36]:
Image(filename='images/snot.png')
Out[36]:
In [37]:
phasegate(pi/2)
Out[37]:
In [38]:
Image(filename='images/phasegate.png')
Out[38]:
In [39]:
globalphase(pi/2)
Out[39]:
In [40]:
Image(filename='images/globalphase.png')
Out[40]:
The example above show how to generate matrice representations of the gates implemented in QuTiP, in their minimal qubit requirements. If the same gates is to be represented in a qubit register of size $N$, the optional keywork argument N
can be specified when calling the gate function. For example, to generate the matrix for the CNOT gate for a $N=3$ bit register:
In [41]:
cnot(N=3)
Out[41]:
In [42]:
Image(filename='images/cnot310.png')
Out[42]:
Furthermore, the control and target qubits (when applicable) can also be similarly specified using keyword arguments control
and target
(or in some cases controls
or targets
):
In [43]:
cnot(N=3, control=2, target=0)
Out[43]:
In [44]:
Image(filename='images/cnot302.png')
Out[44]:
The gates implemented in QuTiP can be used to build any qubit circuit using the class QubitCircuit. The output can be obtained in the form of a unitary matrix or a latex representation.
In the following example, we take a SWAP gate. It is known that a swap gate is equivalent to three CNOT gates applied in the given format.
In [45]:
N = 2
qc0 = QubitCircuit(N)
qc0.add_gate("SWAP", [0, 1], None)
qc0.png
Out[45]:
In [46]:
U_list0 = qc0.propagators()
U0 = gate_sequence_product(U_list0)
U0
Out[46]:
In [47]:
qc1 = QubitCircuit(N)
qc1.add_gate("CNOT", 0, 1)
qc1.add_gate("CNOT", 1, 0)
qc1.add_gate("CNOT", 0, 1)
qc1.png
Out[47]:
In [48]:
U_list1 = qc1.propagators()
U1 = gate_sequence_product(U_list1)
U1
Out[48]:
In place of manually converting the SWAP gate to CNOTs, it can be automatically converted using an inbuilt function in QubitCircuit
In [49]:
qc2 = qc0.resolve_gates("CNOT")
qc2.png
Out[49]:
In [50]:
U_list2 = qc2.propagators()
U2 = gate_sequence_product(U_list2)
U2
Out[50]:
In [51]:
qc3 = QubitCircuit(3)
qc3.add_gate("CNOT", 1, 0)
qc3.add_gate("RX", 0, None, pi/2, r"\pi/2")
qc3.add_gate("RY", 1, None, pi/2, r"\pi/2")
qc3.add_gate("RZ", 2, None, pi/2, r"\pi/2")
qc3.add_gate("ISWAP", [1, 2])
qc3.png
Out[51]:
In [52]:
U3 = gate_sequence_product(qc3.propagators())
U3
Out[52]:
In [53]:
qc4 = qc3.resolve_gates("CNOT")
qc4.png
Out[53]:
In [54]:
U4 = gate_sequence_product(qc4.propagators())
U4
Out[54]:
In [55]:
qc5 = qc3.resolve_gates("ISWAP")
qc5.png
Out[55]:
In [56]:
U5 = gate_sequence_product(qc5.propagators())
U5
Out[56]:
In [57]:
qc6 = qc3.resolve_gates(["ISWAP", "RX", "RY"])
qc6.png
Out[57]:
In [58]:
U6 = gate_sequence_product(qc6.propagators())
U6
Out[58]:
In [59]:
qc7 = qc3.resolve_gates(["CNOT", "RZ", "RX"])
qc7.png
Out[59]:
In [60]:
U7 = gate_sequence_product(qc7.propagators())
U7
Out[60]:
Interactions between non-adjacent qubits can be resolved by QubitCircuit to a series of adjacent interactions, which is useful for systems such as spin chain models.
In [61]:
qc8 = QubitCircuit(3)
qc8.add_gate("CNOT", 2, 0)
qc8.png
Out[61]:
In [62]:
U8 = gate_sequence_product(qc8.propagators())
U8
Out[62]:
In [63]:
qc9 = qc8.adjacent_gates()
qc9.png
Out[63]:
In [64]:
U9 = gate_sequence_product(qc9.propagators())
U9
Out[64]:
In [65]:
qc10 = qc9.resolve_gates("CNOT")
qc10.png
Out[65]:
In [66]:
U10 = gate_sequence_product(qc10.propagators())
U10
Out[66]:
In [67]:
from qutip.ipynbtools import version_table
version_table()
Out[67]: