-
Notifications
You must be signed in to change notification settings - Fork 0
/
Basic_gates.py
148 lines (121 loc) · 5.23 KB
/
Basic_gates.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
#--------------------------------------------------------------------------------------------------------------
# This module contains basic gates that can be used while developing circuits on IBM QExperience
#--------------------------------------------------------------------------------------------------------------
#--------------------------------------------------------------------------------------------------------------
# Import necessary modules
#--------------------------------------------------------------------------------------------------------------
from qiskit import QuantumProgram
import Qconfig
#--------------------------------------------------------------------------------------------------------------
# The CSWAP gate
# Input : Quantum program object, the Circuit name, the quantum register name, control bit number and target
# bit numbers.
# Output : Quantum_program_object with the relevant connections
# Circuit implemented - CSWAP
#--------------------------------------------------------------------------------------------------------------
def CSWAP(Quantum_program_object,Circuit_name,Quantum_register_name,Control_bit_number,Target_bit_numbers):
# Get the circuit and the quantum register by name
qc = Quantum_program_object.get_circuit(Circuit_name)
qr = Quantum_program_object.get_quantum_register(Quantum_register_name)
# Get control bit numbers and the target bit number for the addressing the qubits
Control = Control_bit_number
Target_1 = Target_bit_numbers[0]
Target_2 = Target_bit_numbers[1]
# Implement CSWAP using 3 CCNOT implementations
# Implement CCNOT on Control,Target_1 and Target_2 using decomposition given by Nelson and Chuang
qc.h(qr[Target_2])
qc.cx(qr[Target_1],qr[Target_2])
qc.tdg(qr[Target_2])
qc.cx(qr[Control],qr[Target_2])
qc.t(qr[Target_2])
qc.cx(qr[Target_1],qr[Target_2])
qc.tdg(qr[Target_2])
qc.cx(qr[Control],qr[Target_2])
qc.tdg(qr[Target_1])
qc.t(qr[Target_2])
qc.h(qr[Target_2])
qc.cx(qr[Control],qr[Target_1])
qc.tdg(qr[Target_1])
qc.cx(qr[Control],qr[Target_1])
qc.t(qr[Control])
qc.s(qr[Target_1])
# Implement CCNOT on Control,Target_2 and Target_1 using decomposition given by Nelson and Chuang
qc.h(qr[Target_1])
qc.cx(qr[Target_2],qr[Target_1])
qc.tdg(qr[Target_1])
qc.cx(qr[Control],qr[Target_1])
qc.t(qr[Target_1])
qc.cx(qr[Target_2],qr[Target_1])
qc.tdg(qr[Target_1])
qc.cx(qr[Control],qr[Target_1])
qc.tdg(qr[Target_2])
qc.t(qr[Target_1])
qc.h(qr[Target_1])
qc.cx(qr[Control],qr[Target_2])
qc.tdg(qr[Target_2])
qc.cx(qr[Control],qr[Target_2])
qc.t(qr[Control])
qc.s(qr[Target_2])
# Implement CCNOT on Control,Target_1 and Target_2 using decomposition given by Nelson and Chuang
qc.h(qr[Target_2])
qc.cx(qr[Target_1],qr[Target_2])
qc.tdg(qr[Target_2])
qc.cx(qr[Control],qr[Target_2])
qc.t(qr[Target_2])
qc.cx(qr[Target_1],qr[Target_2])
qc.tdg(qr[Target_2])
qc.cx(qr[Control],qr[Target_2])
qc.tdg(qr[Target_1])
qc.t(qr[Target_2])
qc.h(qr[Target_2])
qc.cx(qr[Control],qr[Target_1])
qc.tdg(qr[Target_1])
qc.cx(qr[Control],qr[Target_1])
qc.t(qr[Control])
qc.s(qr[Target_1])
# Return the program object
return Quantum_program_object
#--------------------------------------------------------------------------------------------------------------
# The CCNOT gate
# Input : Quantum program object, the Circuit name, the quantum register name, control bit numbers and target
# bit number.
# Output : Quantum_program_object with the relevant connections
# Circuit implemented - CCNOT
#--------------------------------------------------------------------------------------------------------------
def CCNOT(Quantum_program_object,Circuit_name,Quantum_register_name,Control_bit_numbers,Target_bit_number):
# Get the circuit and the quantum register by name
qc = Quantum_program_object.get_circuit(Circuit_name)
qr = Quantum_program_object.get_quantum_register(Quantum_register_name)
# Get control bit numbers and the target bit number for the addressing the qubits
Control_1 = Control_bit_numbers[0]
Control_2 = Control_bit_numbers[1]
Target = Target_bit_number
# Implement Hadamard on target qubits
qc.h(qr[Target])
# Implement CNOT between Control_2 and Target
qc.cx(qr[Control_2],qr[Target])
# Implement T (dagger) on target qubits
qc.tdg(qr[Target])
# Implement CNOT between Control_1 and Target
qc.cx(qr[Control_1],qr[Target])
# Implement T on target qubits
qc.t(qr[Target])
# Implement CNOT between Control_2 and Target
qc.cx(qr[Control_2],qr[Target])
# Implement T (dagger) on target qubits
qc.tdg(qr[Target])
# Implement CNOT between Control_1 and Target
qc.cx(qr[Control_1],qr[Target])
# Implement T (dagger) on Control_2, T and H on Target
qc.tdg(qr[Control_2])
qc.t(qr[Target])
qc.h(qr[Target])
# Implement CNOT from Control_1 to Control_2 followed by T (dagger) on Control_2
qc.cx(qr[Control_1],qr[Control_2])
qc.tdg(qr[Control_2])
# Implement CNOT from Control_1 to Control_2 followed by T on Control_1 and S on Control_2
qc.cx(qr[Control_1],qr[Control_2])
qc.t(qr[Control_1])
qc.s(qr[Control_2])
# Return the program object
return Quantum_program_object