1- """ the `apply_right!` function is used to right multiply any quantum operation to unitary
2- Clifford operation or Pauli product"""
1+ """
2+ the `apply_right!` function is used to right multiply any quantum operation to unitary
3+ Clifford operation or Pauli product
4+
5+ ```jldoctest
6+ julia> apply_right!(C"X Z", sHadamard(1))
7+ X₁ ⟼ + Z
8+ Z₁ ⟼ + X
9+
10+ julia> cliff = one(CliffordOperator, 2)
11+ X₁ ⟼ + X_
12+ X₂ ⟼ + _X
13+ Z₁ ⟼ + Z_
14+ Z₂ ⟼ + _Z
15+ julia> apply_right!(cliff, sHadamard(1))
16+ X₁ ⟼ + Z_
17+ X₂ ⟼ + _X
18+ Z₁ ⟼ + X_
19+ Z₂ ⟼ + _Z
20+ julia> apply_right!(cliff, sCNOT(1, 2))
21+ X₁ ⟼ + ZX
22+ X₂ ⟼ + _X
23+ Z₁ ⟼ + X_
24+ Z₂ ⟼ + XZ
25+
26+ julia> apply_right!(C"Y Z", C"Z Y"; phases=true)
27+ X₁ ⟼ + Z
28+ Z₁ ⟼ - X
29+ julia> apply_right!(C"Y Z", P"X")
30+ X₁ ⟼ + Y
31+ Z₁ ⟼ - Z
32+ ```
33+
34+ See also: [`apply!`](@ref), [`apply_inv!`](@ref)
35+ """
336function apply_right! end
437
538
6- # dense_cliffords
39+ # #############################
40+ # Dense operators
41+ # #############################
742
8- function apply_right! (l:: CliffordOperator , r:: PauliOperator ; phases = false )
43+ function apply_right! (l:: CliffordOperator , r:: PauliOperator )
944 nqubits (l)== nqubits (r) || throw (DimensionMismatch (" The Clifford and Pauli operators need to act on the same number of qubits." ))
10- tab (l). phases[nqubits (l)+ 1 : end ] .⊻= r[1 : nqubits (l)]
11- tab (l). phases[1 : nqubits (l)] .⊻= r[nqubits (l)+ 1 : end ]
45+ for i in 1 : nqubits (l)
46+ x, z = r[i]
47+ if x
48+ phases (l)[nqubits (l)+ i] ⊻= 0x02
49+ end
50+ if z
51+ phases (l)[i] ⊻= 0x02
52+ end
53+ end
54+ return l
1255end
1356
1457function apply_right! (l:: CliffordOperator , r:: CliffordOperator ; phases= true )
4790end
4891
4992
50- # symbolic_cliffords
51-
52- function mul_right_ignore_anticommute! (l:: PauliOperator , r:: PauliOperator )
53- x = mul_right! (l, r; phases= Val (true ))
54- x. phase[] = x. phase[] & 0x02
55- return x
56- end
57-
58-
5993# #############################
6094# Single-qubit gates
6195# #############################
@@ -89,18 +123,18 @@ function apply_right!(l::CliffordOperator, r::sInvPhase)
89123end
90124
91125function apply_right! (l:: CliffordOperator , r:: sX )
92- phases (tab (l) )[nqubits (l)+ r. q] ⊻= 0x02
126+ phases (l )[nqubits (l)+ r. q] ⊻= 0x02
93127 return l
94128end
95129
96130function apply_right! (l:: CliffordOperator , r:: sY )
97- phases (tab (l) )[r. q] ⊻= 0x02
98- phases (tab (l) )[nqubits (l)+ r. q] ⊻= 0x02
131+ phases (l )[r. q] ⊻= 0x02
132+ phases (l )[nqubits (l)+ r. q] ⊻= 0x02
99133 return l
100134end
101135
102136function apply_right! (l:: CliffordOperator , r:: sZ )
103- phases (tab (l) )[r. q] ⊻= 0x02
137+ phases (l )[r. q] ⊻= 0x02
104138 return l
105139end
106140
@@ -116,14 +150,14 @@ function apply_right!(l::CliffordOperator, r::sInvSQRTX)
116150end
117151
118152function apply_right! (l:: CliffordOperator , r:: sSQRTY )
119- phases (tab (l) )[nqubits (l)+ r. q] ⊻= 0x02
153+ phases (l )[nqubits (l)+ r. q] ⊻= 0x02
120154 rowswap! (tab (l), r. q, nqubits (l)+ r. q)
121155 return l
122156end
123157
124158function apply_right! (l:: CliffordOperator , r:: sInvSQRTY )
125159 rowswap! (tab (l), r. q, nqubits (l)+ r. q)
126- phases (tab (l) )[nqubits (l)+ r. q] ⊻= 0x02
160+ phases (l )[nqubits (l)+ r. q] ⊻= 0x02
127161 return l
128162end
129163
@@ -270,7 +304,7 @@ function apply_right!(l::CliffordOperator, r::sInvZCrY)
270304 l[r. q2] = mul_left! (l[r. q2], l[nqubits (l)+ r. q1])
271305 l[nqubits (l)+ r. q2] = mul_left! (l[nqubits (l)+ r. q2], l[nqubits (l)+ r. q1])
272306 l[r. q1] = mul_left! (l[r. q1], l[nqubits (l)+ r. q2])
273- phases (tab (l) )[r. q1] ⊻= 0x02
307+ phases (l )[r. q1] ⊻= 0x02
274308 return l
275309end
276310
@@ -322,4 +356,13 @@ function apply_right!(l::CliffordOperator, r::sInvSQRTYY)
322356 rowswap! (tab (l), r. q2, nqubits (l)+ r. q2)
323357 apply_right! (l, sZ (r. q2))
324358 return l
359+ end
360+
361+
362+ """ Multiply Pauli operators `l * r`, ignoring anticommutation phases (keeping only ±1, not ±i).
363+ See also: [`mul_right!`](@ref)."""
364+ function mul_right_ignore_anticommute! (l:: PauliOperator , r:: PauliOperator )
365+ mul_right! (l, r; phases= Val (true ))
366+ l. phase[] = l. phase[] & 0x02
367+ return l
325368end
0 commit comments