1+ """ the `apply_right!` function is used to prepend any quantum operation to unitary Clifford operation"""
2+ function apply_right! end
3+
4+ function apply_right! (l:: CliffordOperator , r:: AbstractCliffordOperator ; phases= true )
5+ @warn " Slow apply_right! operation: $r "
6+ apply! (CliffordOperator (r, nqubits (l)), l; phases= phases)
7+ end
8+
9+
10+ # #############################
11+ # Single-qubit gates
12+ # #############################
13+
14+ function apply_right! (l:: CliffordOperator , r:: sHadamard )
15+ rowswap! (tab (l), r. q, nqubits (l)+ r. q)
16+ return l
17+ end
18+
19+ function apply_right! (l:: CliffordOperator , r:: sHadamardXY )
20+ mul_right! (l[r. q], l[nqubits (l)+ r. q]; phases= Val (false ))
21+ apply_right! (l, sY (r. q))
22+ return l
23+ end
24+
25+ function apply_right! (l:: CliffordOperator , r:: sHadamardYZ )
26+ mul_right! (l[nqubits (l)+ r. q], l[r. q]; phases= Val (false ))
27+ apply_right! (l, sZ (r. q))
28+ return l
29+ end
30+
31+ function apply_right! (l:: CliffordOperator , r:: sPhase )
32+ mul_right! (l[r. q], l[nqubits (l)+ r. q]; phases= Val (true ))
33+ return l
34+ end
35+
36+ # function apply_right!(l::CliffordOperator, r::sInvPhase)
37+ # return l
38+ # end
39+
40+ function apply_right! (l:: CliffordOperator , r:: sX )
41+ phases (tab (l))[nqubits (l)+ r. q] ⊻= 0x02
42+ return l
43+ end
44+
45+ function apply_right! (l:: CliffordOperator , r:: sY )
46+ phases (tab (l))[r. q] ⊻= 0x02
47+ phases (tab (l))[nqubits (l)+ r. q] ⊻= 0x02
48+ return l
49+ end
50+
51+ function apply_right! (l:: CliffordOperator , r:: sZ )
52+ phases (tab (l))[r. q] ⊻= 0x02
53+ return l
54+ end
55+
56+ function apply_right! (l:: CliffordOperator , r:: sSQRTX )
57+ apply_right! (l, sInvSQRTX (r. q))
58+ apply_right! (l, sX (r. q))
59+ return l
60+ end
61+
62+ function apply_right! (l:: CliffordOperator , r:: sInvSQRTX )
63+ mul_right! (l[nqubits (l)+ r. q], l[r. q]; phases= Val (false ))
64+ return l
65+ end
66+
67+ function apply_right! (l:: CliffordOperator , r:: sSQRTY )
68+ phases (tab (l))[nqubits (l)+ r. q] ⊻= 0x02
69+ rowswap! (tab (l), r. q, nqubits (l)+ r. q)
70+ return l
71+ end
72+
73+ function apply_right! (l:: CliffordOperator , r:: sInvSQRTY )
74+ rowswap! (tab (l), r. q, nqubits (l)+ r. q)
75+ phases (tab (l))[nqubits (l)+ r. q] ⊻= 0x02
76+ return l
77+ end
78+
79+ # function apply_right!(l::CliffordOperator, r::sCXYZ)
80+ # return l
81+ # end
82+
83+ # function apply_right!(l::CliffordOperator, r::sCZYX)
84+ # return l
85+ # end
86+
87+ function apply_right! (l:: CliffordOperator , r:: sId1 )
88+ return l
89+ end
90+
91+
92+ # #############################
93+ # Two-qubit gates
94+ # #############################
95+
96+ function apply_right! (l:: CliffordOperator , r:: sSWAP )
97+ rowswap! (tab (l), nqubits (l)+ r. q1, nqubits (l)+ r. q2)
98+ rowswap! (tab (l), r. q1, r. q2)
99+ return l
100+ end
101+
102+ # function apply_right!(l::CliffordOperator, r::sSWAPCX)
103+ # return l
104+ # end
105+
106+ # function apply_right!(l::CliffordOperator, r::sInvSWAPCX)
107+ # return l
108+ # end
109+
110+ function apply_right! (l:: CliffordOperator , r:: sISWAP )
111+ apply_right! (l, sSWAP (r. q1, r. q2))
112+ apply_right! (l, sZCZ (r. q1, r. q2))
113+ apply_right! (l, sSQRTZ (r. q1))
114+ apply_right! (l, sSQRTZ (r. q2))
115+ return l
116+ end
117+
118+ function apply_right! (l:: CliffordOperator , r:: sInvISWAP )
119+ apply_right! (l, sSWAP (r. q1, r. q2))
120+ apply_right! (l, sZCZ (r. q1, r. q2))
121+ apply_right! (l, sInvSQRTZ (r. q1))
122+ apply_right! (l, sInvSQRTZ (r. q2))
123+ return l
124+ end
125+
126+ # function apply_right!(l::CliffordOperator, r::sCZSWAP)
127+ # return l
128+ # end
129+
130+ # function apply_right!(l::CliffordOperator, r::sCXSWAP)
131+ # return l
132+ # end
133+
134+ function apply_right! (l:: CliffordOperator , r:: sCNOT )
135+ return apply_right! (l, sZCX (r. q1, r. q2))
136+ end
137+
138+ # function apply_right!(l::CliffordOperator, r::sCPHASE)
139+ # return l
140+ # end
141+
142+ function apply_right! (l:: CliffordOperator , r:: sZCX )
143+ mul_right! (l[nqubits (l)+ r. q2], l[nqubits (l)+ r. q1]; phases= Val (true ))
144+ mul_right! (l[r. q1], l[r. q2]; phases= Val (true ))
145+ return l
146+ end
147+
148+ function apply_right! (l:: CliffordOperator , r:: sZCY )
149+ apply_right! (l, sHadamardYZ (r. q2))
150+ apply_right! (l, sZCZ (r. q1, r. q2))
151+ apply_right! (l, sHadamardYZ (r. q2))
152+ return l
153+ end
154+
155+ function apply_right! (l:: CliffordOperator , r:: sZCZ )
156+ mul_right! (l[r. q2], l[nqubits (l)+ r. q1]; phases= Val (true ))
157+ mul_right! (l[r. q1], l[nqubits (l)+ r. q2]; phases= Val (true ))
158+ return l
159+ end
160+
161+ function apply_right! (l:: CliffordOperator , r:: sXCX )
162+ mul_right! (l[nqubits (l)+ r. q2], l[r. q1]; phases= Val (true ))
163+ mul_right! (l[nqubits (l)+ r. q1], l[r. q2]; phases= Val (true ))
164+ return l
165+ end
166+
167+ function apply_right! (l:: CliffordOperator , r:: sXCY )
168+ apply_right! (l, sHadamardXY (r. q2))
169+ apply_right! (l, sXCX (r. q1, r. q2))
170+ apply_right! (l, sHadamardXY (r. q2))
171+ return l
172+ end
173+
174+ function apply_right! (l:: CliffordOperator , r:: sXCZ )
175+ return apply_right! (l, sZCX (r. q2, r. q1))
176+ end
177+
178+ function apply_right! (l:: CliffordOperator , r:: sYCX )
179+ return apply_right! (l, sXCY (r. q2, r. q1))
180+ end
181+
182+ function apply_right! (l:: CliffordOperator , r:: sYCY )
183+ apply_right! (l, sHadamardYZ (r. q1))
184+ apply_right! (l, sHadamardYZ (r. q2))
185+ apply_right! (l, sZCZ (r. q1, r. q2))
186+ apply_right! (l, sHadamardYZ (r. q2))
187+ apply_right! (l, sHadamardYZ (r. q1))
188+ return l
189+ end
190+
191+ function apply_right! (l:: CliffordOperator , r:: sYCZ )
192+ return apply_right! (l, sZCY (r. q2, r. q1))
193+ end
194+
195+ # function apply_right!(l::CliffordOperator, r::sZCrY)
196+ # return l
197+ # end
198+
199+ # function apply_right!(l::CliffordOperator, r::sInvZCrY)
200+ # return l
201+ # end
202+
203+ function apply_right! (l:: CliffordOperator , r:: sSQRTZZ )
204+ apply_right! (l, sInvSQRTZZ (r. q1, r. q2))
205+ apply_right! (l, sZ (r. q1))
206+ apply_right! (l, sZ (r. q2))
207+ return l
208+ end
209+
210+ function apply_right! (l:: CliffordOperator , r:: sInvSQRTZZ )
211+ mul_right! (l[r. q1], l[nqubits (l)+ r. q1]; phases= Val (false ))
212+ mul_right! (l[r. q1], l[nqubits (l)+ r. q2]; phases= Val (false ))
213+ mul_right! (l[r. q2], l[nqubits (l)+ r. q1]; phases= Val (false ))
214+ mul_right! (l[r. q2], l[nqubits (l)+ r. q2]; phases= Val (false ))
215+ return l
216+ end
217+
218+ function apply_right! (l:: CliffordOperator , r:: sSQRTXX )
219+ apply_right! (l, sInvSQRTXX (r. q1, r. q2))
220+ apply_right! (l, sX (r. q1))
221+ apply_right! (l, sX (r. q2))
222+ return l
223+ end
224+
225+ function apply_right! (l:: CliffordOperator , r:: sInvSQRTXX )
226+ mul_right! (l[nqubits (l)+ r. q1], l[r. q1]; phases= Val (false ))
227+ mul_right! (l[nqubits (l)+ r. q1], l[r. q2]; phases= Val (false ))
228+ mul_right! (l[nqubits (l)+ r. q2], l[r. q1]; phases= Val (false ))
229+ mul_right! (l[nqubits (l)+ r. q2], l[r. q2]; phases= Val (false ))
230+ return l
231+ end
232+
233+ function apply_right! (l:: CliffordOperator , r:: sSQRTYY )
234+ apply_right! (l, sInvSQRTYY (r. q1, r. q2))
235+ apply_right! (l, sY (r. q1))
236+ apply_right! (l, sY (r. q2))
237+ return l
238+ end
239+
240+ function apply_right! (l:: CliffordOperator , r:: sInvSQRTYY )
241+ mul_right! (l[r. q1], l[nqubits (l)+ r. q1]; phases= Val (false ))
242+ mul_right! (l[nqubits (l)+ r. q1], l[nqubits (l)+ r. q2]; phases= Val (false ))
243+ mul_right! (l[nqubits (l)+ r. q1], l[r. q2]; phases= Val (false ))
244+ mul_right! (l[r. q2], l[r. q1]; phases= Val (false ))
245+ mul_right! (l[nqubits (l)+ r. q2], l[r. q1]; phases= Val (false ))
246+ mul_right! (l[r. q1], l[nqubits (l)+ r. q1]; phases= Val (false ))
247+ rowswap! (tab (l), r. q1, nqubits (l)+ r. q1)
248+ rowswap! (tab (l), r. q2, nqubits (l)+ r. q2)
249+ apply_right! (l, sZ (r. q2))
250+ return l
251+ end
0 commit comments