Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

inv implementation for SingleQubitOperator #314

Merged
merged 15 commits into from
Jul 17, 2024
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,10 @@

# News

## v0.9.6 - 2024-07-12

- `inv` implementation for single-qubit "symbolic" Clifford operators (subtypes of `AbstractSingleQubitOperator`).

## v0.9.5 - 2024-07-04

- Implementation of random all-to-all and brickwork Clifford circuits and corresponding ECC codes.
Expand Down
2 changes: 1 addition & 1 deletion Project.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
name = "QuantumClifford"
uuid = "0525e862-1e90-11e9-3e4d-1b39d7109de1"
authors = ["Stefan Krastanov <[email protected]> and QuantumSavory community members"]
version = "0.9.5"
version = "0.9.6"

[deps]
Combinatorics = "861a8166-3701-5b0c-9a16-15d98fcdc6aa"
Expand Down
13 changes: 13 additions & 0 deletions src/symbolic_cliffords.jl
Original file line number Diff line number Diff line change
Expand Up @@ -227,6 +227,19 @@ function random_clifford1(rng::AbstractRNG, qubit)
end
random_clifford1(qubit) = random_clifford1(GLOBAL_RNG, qubit)

function LinearAlgebra.inv(op::SingleQubitOperator)
c = LinearAlgebra.inv(CliffordOperator(SingleQubitOperator(op), 1, compact=true))
return SingleQubitOperator(c, op.q)
end

LinearAlgebra.inv(h::sHadamard) = sHadamard(h.q)
LinearAlgebra.inv(p::sPhase) = sInvPhase(p.q)
LinearAlgebra.inv(p::sInvPhase) = sPhase(p.q)
LinearAlgebra.inv(p::sId1) = sId1(p.q)
LinearAlgebra.inv(p::sX) = sX(p.q)
LinearAlgebra.inv(p::sY) = sY(p.q)
LinearAlgebra.inv(p::sZ) = sZ(p.q)

##############################
# Two-qubit gates
##############################
Expand Down
14 changes: 13 additions & 1 deletion test/test_symcliff.jl
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
using Random
using QuantumClifford

using QuantumClifford: stab_looks_good, destab_looks_good, mixed_stab_looks_good, mixed_destab_looks_good
using QuantumClifford: apply_single_x!, apply_single_y!, apply_single_z!
using InteractiveUtils
Expand Down Expand Up @@ -66,3 +65,16 @@ end
@test op1 == op2
end
end

@testset "SingleQubitOperator inv methods" begin
for gate_type in [sHadamard, sX, sY, sZ, sId1 , sPhase, sInvPhase]
n = rand(1:10)
@test CliffordOperator(inv(SingleQubitOperator(gate_type(n))), n) == inv(CliffordOperator(gate_type(n), n))
@test CliffordOperator(inv(gate_type(n)), n) == inv(CliffordOperator(gate_type(n), n))
end
for i in 1:10
random_op = random_clifford1(i)
@test CliffordOperator(inv(random_op), i) == inv(CliffordOperator(random_op, i))
@test CliffordOperator(inv(SingleQubitOperator(random_op)), i) == inv(CliffordOperator(random_op, i))
end
end
Loading