|
2 | 2 | $TYPEDSIGNATURES
|
3 | 3 |
|
4 | 4 | Inverse of a `CliffordOperator`
|
| 5 | +
|
| 6 | +```jldoctest |
| 7 | +julia> inv(CliffordOperator(sCNOT)) |
| 8 | +X₁ ⟼ + XX |
| 9 | +X₂ ⟼ + _X |
| 10 | +Z₁ ⟼ + Z_ |
| 11 | +Z₂ ⟼ + ZZ |
| 12 | +
|
| 13 | +julia> inv(CliffordOperator(sCNOT(2, 1), 2)) |
| 14 | +X₁ ⟼ + X_ |
| 15 | +X₂ ⟼ + XX |
| 16 | +Z₁ ⟼ + ZZ |
| 17 | +Z₂ ⟼ + _Z |
| 18 | +
|
| 19 | +julia> inv(CliffordOperator(tHadamard)) |
| 20 | +X₁ ⟼ + Z |
| 21 | +Z₁ ⟼ + X |
| 22 | +``` |
5 | 23 | """
|
6 | 24 | function LinearAlgebra.inv(c::CliffordOperator; phases=true)
|
7 | 25 | ci = zero(c)
|
|
24 | 42 |
|
25 | 43 | Based on [garcia2012efficient](@cite).
|
26 | 44 |
|
| 45 | +```jldoctest |
| 46 | +julia> using LinearAlgebra |
| 47 | +
|
| 48 | +julia> dot(S"Z", S"Z") |
| 49 | +1.0 |
| 50 | +
|
| 51 | +julia> dot(S"Z", S"Y") |
| 52 | +0.7071067811865476 |
| 53 | +``` |
| 54 | +
|
27 | 55 | See also: [`logdot`](@ref)"""
|
28 | 56 | function LinearAlgebra.dot(s1::AbstractStabilizer, s2::AbstractStabilizer)
|
29 | 57 | ld = logdot(s1,s2)
|
@@ -83,14 +111,104 @@ trusted_rank(s::Destabilizer) = length(s)
|
83 | 111 | trusted_rank(s::MixedStabilizer) = LinearAlgebra.rank(s)
|
84 | 112 | trusted_rank(s::MixedDestabilizer) = LinearAlgebra.rank(s)
|
85 | 113 |
|
86 |
| -"""Tensor product between operators or tableaux. See also [`tensor_pow`](@ref).""" |
| 114 | +"""Tensor product between operators or tableaux. |
| 115 | +
|
| 116 | +Tensor product between CiffordOperators: |
| 117 | +
|
| 118 | +```jldoctest |
| 119 | +julia> tensor(CliffordOperator(sCNOT), CliffordOperator(sCNOT)) |
| 120 | +X₁ ⟼ + XX__ |
| 121 | +X₂ ⟼ + _X__ |
| 122 | +X₃ ⟼ + __XX |
| 123 | +X₄ ⟼ + ___X |
| 124 | +Z₁ ⟼ + Z___ |
| 125 | +Z₂ ⟼ + ZZ__ |
| 126 | +Z₃ ⟼ + __Z_ |
| 127 | +Z₄ ⟼ + __ZZ |
| 128 | +``` |
| 129 | +
|
| 130 | +Tensor product between PauliOperators: |
| 131 | +
|
| 132 | +```jldoctest |
| 133 | +julia> tensor(P"-IXYZ", P"iIXYZ") |
| 134 | +-i_XYZ_XYZ |
| 135 | +``` |
| 136 | +
|
| 137 | +Tensor product between Tableaux: |
| 138 | +
|
| 139 | +```jldoctest |
| 140 | +julia> s = S"-XX |
| 141 | + +ZZ"; |
| 142 | +
|
| 143 | +julia> tensor(s, s, s) |
| 144 | +- XX____ |
| 145 | ++ ZZ____ |
| 146 | +- __XX__ |
| 147 | ++ __ZZ__ |
| 148 | +- ____XX |
| 149 | ++ ____ZZ |
| 150 | +
|
| 151 | +julia> s = S"+XZI |
| 152 | + -IZI"; |
| 153 | +
|
| 154 | +julia> tensor(s, s) |
| 155 | ++ XZ____ |
| 156 | +- _Z____ |
| 157 | ++ ___XZ_ |
| 158 | +- ____Z_ |
| 159 | +``` |
| 160 | +
|
| 161 | +See also [`tensor_pow`](@ref).""" |
87 | 162 | function tensor end
|
88 | 163 |
|
89 | 164 | function tensor(ops::AbstractStabilizer...) # TODO optimize this by doing conversion to common type to enable preallocation
|
90 | 165 | foldl(⊗, ops[2:end], init=ops[1])
|
91 | 166 | end
|
92 | 167 |
|
93 |
| -"""Repeated tensor product of an operators or a tableau. See also [`tensor`](@ref).""" |
| 168 | +"""Repeated tensor product of an operators or a tableau. |
| 169 | +
|
| 170 | +For `CliffordOperator`: |
| 171 | +
|
| 172 | +```jldoctest |
| 173 | +julia> tensor_pow(CliffordOperator(sHadamard), 3) |
| 174 | +X₁ ⟼ + Z__ |
| 175 | +X₂ ⟼ + _Z_ |
| 176 | +X₃ ⟼ + __Z |
| 177 | +Z₁ ⟼ + X__ |
| 178 | +Z₂ ⟼ + _X_ |
| 179 | +Z₃ ⟼ + __X |
| 180 | +``` |
| 181 | +
|
| 182 | +For `PauliOperator`: |
| 183 | +
|
| 184 | +```jldoctest |
| 185 | +julia> tensor_pow(P"IXYZ", 2) |
| 186 | ++ _XYZ_XYZ |
| 187 | +``` |
| 188 | +
|
| 189 | +For `Tableaux`: |
| 190 | +
|
| 191 | +```jldoctest |
| 192 | +julia> tensor_pow(S"Z", 4) |
| 193 | ++ Z___ |
| 194 | ++ _Z__ |
| 195 | ++ __Z_ |
| 196 | ++ ___Z |
| 197 | +
|
| 198 | +julia> s = S"+XZI |
| 199 | + +IZI"; |
| 200 | +
|
| 201 | +julia> tensor_pow(s, 3) |
| 202 | ++ XZ_______ |
| 203 | ++ _Z_______ |
| 204 | ++ ___XZ____ |
| 205 | ++ ____Z____ |
| 206 | ++ ______XZ_ |
| 207 | ++ _______Z_ |
| 208 | +``` |
| 209 | +
|
| 210 | +See also [`tensor`](@ref). |
| 211 | +""" |
94 | 212 | function tensor_pow(op::Union{<:AbstractStabilizer,<:AbstractCliffordOperator},power)
|
95 | 213 | if power==1
|
96 | 214 | return op
|
|
0 commit comments