From 23e406f9aa060a95c2c49b03e31614d468c9ebac Mon Sep 17 00:00:00 2001 From: Fe-r-oz Date: Sun, 4 Aug 2024 00:57:17 +0500 Subject: [PATCH 1/6] adding new single-qubit gates --- src/QuantumClifford.jl | 1 + src/symbolic_cliffords.jl | 48 ++++++++++++++++++++++++++++----------- test/test_symcliff.jl | 2 +- 3 files changed, 37 insertions(+), 14 deletions(-) diff --git a/src/QuantumClifford.jl b/src/QuantumClifford.jl index 657710594..282165c13 100644 --- a/src/QuantumClifford.jl +++ b/src/QuantumClifford.jl @@ -48,6 +48,7 @@ export # Symbolic Clifford Ops AbstractSymbolicOperator, AbstractSingleQubitOperator, AbstractTwoQubitOperator, sHadamard, sPhase, sInvPhase, SingleQubitOperator, sId1, sX, sY, sZ, + sHadamardXY, sHadamardYZ, sV, sInvV, sSQRTY, sInvSQRTY, sCNOT, sCPHASE, sSWAP, sXCX, sXCY, sXCZ, sYCX, sYCY, sYCZ, sZCX, sZCY, sZCZ, sZCrY, diff --git a/src/symbolic_cliffords.jl b/src/symbolic_cliffords.jl index 0d2c26c40..b3bd83daf 100644 --- a/src/symbolic_cliffords.jl +++ b/src/symbolic_cliffords.jl @@ -85,12 +85,20 @@ macro qubitop1(name, kernel) end end -@qubitop1 Hadamard (z , x , x!=0 && z!=0) -@qubitop1 Phase (x , x⊻z , x!=0 && z!=0) -@qubitop1 InvPhase (x , x⊻z , x!=0 && z==0) -@qubitop1 X (x , z , z!=0) -@qubitop1 Y (x , z , (x⊻z)!=0) -@qubitop1 Z (x , z , x!=0) +@qubitop1 Hadamard (z , x , x!=0 && z!=0) +@qubitop1 Phase (x , x⊻z , x!=0 && z!=0) +@qubitop1 InvPhase (x , x⊻z , x!=0 && z==0) +@qubitop1 X (x , z , z!=0) +@qubitop1 Y (x , z , (x⊻z)!=0) +@qubitop1 Z (x , z , x!=0) +@qubitop1 HadamardXY (x⊻z , z , z!=0) +@qubitop1 HadamardYZ (x , x⊻z , x!=0) +@qubitop1 V (x , x⊻z , z!=0) +@qubitop1 InvV (x , x⊻z , x!=0 && z==0) +@qubitop1 CXYZ (x⊻z , x , x!=0 && z!=0) +@qubitop1 CZYX (z , x⊻z , x!=0 && z!=0) +@qubitop1 SQRTY (z , x , x!=0) +@qubitop1 InvSQRTY (z , x , z!=0) """A "symbolic" single-qubit Identity operation. @@ -177,13 +185,21 @@ function _apply!(stab::AbstractStabilizer, op::SingleQubitOperator; phases::Val{ stab end -SingleQubitOperator(h::sHadamard) = SingleQubitOperator(h.q, false, true , true , false, false, false) -SingleQubitOperator(p::sPhase) = SingleQubitOperator(p.q, true , true , false, true , false, false) -SingleQubitOperator(p::sInvPhase) = SingleQubitOperator(p.q, true , true , false, true , true , false) -SingleQubitOperator(p::sId1) = SingleQubitOperator(p.q, true , false, false, true , false, false) -SingleQubitOperator(p::sX) = SingleQubitOperator(p.q, true , false, false, true , false, true) -SingleQubitOperator(p::sY) = SingleQubitOperator(p.q, true , false, false, true , true , true) -SingleQubitOperator(p::sZ) = SingleQubitOperator(p.q, true , false, false, true , true , false) +SingleQubitOperator(h::sHadamard) = SingleQubitOperator(h.q, false, true , true , false, false, false) +SingleQubitOperator(p::sPhase) = SingleQubitOperator(p.q, true , true , false, true , false, false) +SingleQubitOperator(p::sInvPhase) = SingleQubitOperator(p.q, true , true , false, true , true , false) +SingleQubitOperator(p::sId1) = SingleQubitOperator(p.q, true , false, false, true , false, false) +SingleQubitOperator(p::sX) = SingleQubitOperator(p.q, true , false, false, true , false, true) +SingleQubitOperator(p::sY) = SingleQubitOperator(p.q, true , false, false, true , true , true) +SingleQubitOperator(p::sZ) = SingleQubitOperator(p.q, true , false, false, true , true , false) +SingleQubitOperator(p::sCXYZ) = SingleQubitOperator(p.q, true , true, true, false , false , false) +SingleQubitOperator(p::sCZYX) = SingleQubitOperator(p.q, false, true, true, true , false , false) +SingleQubitOperator(p::sHadamardXY) = SingleQubitOperator(p.q, true , true, false, true , false , true) +SingleQubitOperator(p::sHadamardYZ) = SingleQubitOperator(p.q, true , false, true, true , true , false) +SingleQubitOperator(p::sV) = SingleQubitOperator(p.q, true , false, true, true , false, true) +SingleQubitOperator(p::sInvV) = SingleQubitOperator(p.q, true , false, true, true , false , false) +SingleQubitOperator(p::sSQRTY) = SingleQubitOperator(p.q, false , true, true, false , true , false) +SingleQubitOperator(p::sInvSQRTY) = SingleQubitOperator(p.q, false , true, true, false , false , true) SingleQubitOperator(o::SingleQubitOperator) = o function SingleQubitOperator(op::CliffordOperator, qubit) nqubits(op)==1 || throw(DimensionMismatch("You are trying to convert a multiqubit `CliffordOperator` into a symbolic `SingleQubitOperator`.")) @@ -239,6 +255,12 @@ 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) +LinearAlgebra.inv(p::sHadamardXY) = sHadamardXY(p.q) +LinearAlgebra.inv(p::sHadamardYZ) = sHadamardYZ(p.q) +LinearAlgebra.inv(p::sV) = sInvV(p.q) +LinearAlgebra.inv(p::sInvV) = sV(p.q) +LinearAlgebra.inv(p::sSQRTY) = sInvSQRTY(p.q) +LinearAlgebra.inv(p::sInvSQRTY) = sSQRTY(p.q) ############################## # Two-qubit gates diff --git a/test/test_symcliff.jl b/test/test_symcliff.jl index 66ea60154..8db261ce5 100644 --- a/test/test_symcliff.jl +++ b/test/test_symcliff.jl @@ -66,7 +66,7 @@ end @testset "SingleQubitOperator inv methods" begin - for gate_type in [sHadamard, sX, sY, sZ, sId1 , sPhase, sInvPhase] + for gate_type in [sHadamard, sX, sY, sZ, sId1, sPhase, sInvPhase, sHadamardXY, sHadamardYZ, sV, sInvV, sSQRTY, sInvSQRTY] 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)) From f24951a1f6235b98518bfd86a398b9b565106079 Mon Sep 17 00:00:00 2001 From: Fe-r-oz Date: Sun, 4 Aug 2024 18:08:57 +0500 Subject: [PATCH 2/6] fix the wrong implementation of new single-qubit gates --- src/QuantumClifford.jl | 2 +- src/symbolic_cliffords.jl | 80 +++++++++++++++++++-------------------- 2 files changed, 41 insertions(+), 41 deletions(-) diff --git a/src/QuantumClifford.jl b/src/QuantumClifford.jl index 282165c13..b67887346 100644 --- a/src/QuantumClifford.jl +++ b/src/QuantumClifford.jl @@ -48,7 +48,7 @@ export # Symbolic Clifford Ops AbstractSymbolicOperator, AbstractSingleQubitOperator, AbstractTwoQubitOperator, sHadamard, sPhase, sInvPhase, SingleQubitOperator, sId1, sX, sY, sZ, - sHadamardXY, sHadamardYZ, sV, sInvV, sSQRTY, sInvSQRTY, + sHadamardXY, sHadamardYZ, sV, sInvV, sSQRTY, sInvSQRTY, sCXYZ, sCZYX, sCNOT, sCPHASE, sSWAP, sXCX, sXCY, sXCZ, sYCX, sYCY, sYCZ, sZCX, sZCY, sZCZ, sZCrY, diff --git a/src/symbolic_cliffords.jl b/src/symbolic_cliffords.jl index b3bd83daf..a599d3ee0 100644 --- a/src/symbolic_cliffords.jl +++ b/src/symbolic_cliffords.jl @@ -85,20 +85,20 @@ macro qubitop1(name, kernel) end end -@qubitop1 Hadamard (z , x , x!=0 && z!=0) -@qubitop1 Phase (x , x⊻z , x!=0 && z!=0) -@qubitop1 InvPhase (x , x⊻z , x!=0 && z==0) -@qubitop1 X (x , z , z!=0) -@qubitop1 Y (x , z , (x⊻z)!=0) -@qubitop1 Z (x , z , x!=0) -@qubitop1 HadamardXY (x⊻z , z , z!=0) -@qubitop1 HadamardYZ (x , x⊻z , x!=0) -@qubitop1 V (x , x⊻z , z!=0) -@qubitop1 InvV (x , x⊻z , x!=0 && z==0) -@qubitop1 CXYZ (x⊻z , x , x!=0 && z!=0) -@qubitop1 CZYX (z , x⊻z , x!=0 && z!=0) -@qubitop1 SQRTY (z , x , x!=0) -@qubitop1 InvSQRTY (z , x , z!=0) +@qubitop1 Hadamard (z ,x , x!=0 && z!=0) +@qubitop1 Phase (x ,x⊻z , x!=0 && z!=0) +@qubitop1 InvPhase (x ,x⊻z , x!=0 && z==0) +@qubitop1 X (x ,z , z!=0) +@qubitop1 Y (x ,z , (x⊻z)!=0) +@qubitop1 Z (x ,z , x!=0) +@qubitop1 HadamardXY (x ,x⊻z , x==0 && z!=0) +@qubitop1 HadamardYZ (x⊻z ,z , x!=0 && z==0) +@qubitop1 V (x⊻z ,z , x==0 && z!=0) +@qubitop1 InvV (x⊻z ,z , x!=0 && z!=0) +@qubitop1 CXYZ (x⊻z ,x , z==0 && x==0) +@qubitop1 CZYX (z ,x⊻z , z==0 && x==0) +@qubitop1 SQRTY (z ,x , z==0) +@qubitop1 InvSQRTY (z ,x , z!=0 && x==0) """A "symbolic" single-qubit Identity operation. @@ -185,21 +185,21 @@ function _apply!(stab::AbstractStabilizer, op::SingleQubitOperator; phases::Val{ stab end -SingleQubitOperator(h::sHadamard) = SingleQubitOperator(h.q, false, true , true , false, false, false) -SingleQubitOperator(p::sPhase) = SingleQubitOperator(p.q, true , true , false, true , false, false) -SingleQubitOperator(p::sInvPhase) = SingleQubitOperator(p.q, true , true , false, true , true , false) -SingleQubitOperator(p::sId1) = SingleQubitOperator(p.q, true , false, false, true , false, false) -SingleQubitOperator(p::sX) = SingleQubitOperator(p.q, true , false, false, true , false, true) -SingleQubitOperator(p::sY) = SingleQubitOperator(p.q, true , false, false, true , true , true) -SingleQubitOperator(p::sZ) = SingleQubitOperator(p.q, true , false, false, true , true , false) -SingleQubitOperator(p::sCXYZ) = SingleQubitOperator(p.q, true , true, true, false , false , false) -SingleQubitOperator(p::sCZYX) = SingleQubitOperator(p.q, false, true, true, true , false , false) -SingleQubitOperator(p::sHadamardXY) = SingleQubitOperator(p.q, true , true, false, true , false , true) -SingleQubitOperator(p::sHadamardYZ) = SingleQubitOperator(p.q, true , false, true, true , true , false) -SingleQubitOperator(p::sV) = SingleQubitOperator(p.q, true , false, true, true , false, true) -SingleQubitOperator(p::sInvV) = SingleQubitOperator(p.q, true , false, true, true , false , false) -SingleQubitOperator(p::sSQRTY) = SingleQubitOperator(p.q, false , true, true, false , true , false) -SingleQubitOperator(p::sInvSQRTY) = SingleQubitOperator(p.q, false , true, true, false , false , true) +SingleQubitOperator(h::sHadamard) = SingleQubitOperator(h.q, false, true , true , false, false, false) +SingleQubitOperator(p::sPhase) = SingleQubitOperator(p.q, true , true , false, true , false, false) +SingleQubitOperator(p::sInvPhase) = SingleQubitOperator(p.q, true , true , false, true , true , false) +SingleQubitOperator(p::sId1) = SingleQubitOperator(p.q, true , false, false, true , false, false) +SingleQubitOperator(p::sX) = SingleQubitOperator(p.q, true , false, false, true , false, true) +SingleQubitOperator(p::sY) = SingleQubitOperator(p.q, true , false, false, true , true , true) +SingleQubitOperator(p::sZ) = SingleQubitOperator(p.q, true , false, false, true , true , false) +SingleQubitOperator(p::sCXYZ) = SingleQubitOperator(p.q, true , true, true, false , false , false) +SingleQubitOperator(p::sCZYX) = SingleQubitOperator(p.q, false, true, true, true , false , false) +SingleQubitOperator(p::sHadamardXY) = SingleQubitOperator(p.q, true , true, false, true , false , true) +SingleQubitOperator(p::sHadamardYZ) = SingleQubitOperator(p.q, true , false, true, true , true , false) +SingleQubitOperator(p::sV) = SingleQubitOperator(p.q, true , false, true, true , false, true) +SingleQubitOperator(p::sInvV) = SingleQubitOperator(p.q, true , false, true, true , false , false) +SingleQubitOperator(p::sSQRTY) = SingleQubitOperator(p.q, false , true, true, false , true , false) +SingleQubitOperator(p::sInvSQRTY) = SingleQubitOperator(p.q, false , true, true, false , false , true) SingleQubitOperator(o::SingleQubitOperator) = o function SingleQubitOperator(op::CliffordOperator, qubit) nqubits(op)==1 || throw(DimensionMismatch("You are trying to convert a multiqubit `CliffordOperator` into a symbolic `SingleQubitOperator`.")) @@ -248,19 +248,19 @@ function LinearAlgebra.inv(op::SingleQubitOperator) 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) +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) LinearAlgebra.inv(p::sHadamardXY) = sHadamardXY(p.q) LinearAlgebra.inv(p::sHadamardYZ) = sHadamardYZ(p.q) -LinearAlgebra.inv(p::sV) = sInvV(p.q) -LinearAlgebra.inv(p::sInvV) = sV(p.q) -LinearAlgebra.inv(p::sSQRTY) = sInvSQRTY(p.q) -LinearAlgebra.inv(p::sInvSQRTY) = sSQRTY(p.q) +LinearAlgebra.inv(p::sV) = sInvV(p.q) +LinearAlgebra.inv(p::sInvV) = sV(p.q) +LinearAlgebra.inv(p::sSQRTY) = sInvSQRTY(p.q) +LinearAlgebra.inv(p::sInvSQRTY) = sSQRTY(p.q) ############################## # Two-qubit gates From 4bfd7c396a7f3f22971a9b0f089c87693d377ca6 Mon Sep 17 00:00:00 2001 From: Fe-r-oz Date: Tue, 6 Aug 2024 01:03:11 +0500 Subject: [PATCH 3/6] adding codereview suggestions --- src/QuantumClifford.jl | 2 +- src/symbolic_cliffords.jl | 23 ++++++++++++----------- test/test_symcliff.jl | 2 +- 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/src/QuantumClifford.jl b/src/QuantumClifford.jl index b67887346..59fd6f6d3 100644 --- a/src/QuantumClifford.jl +++ b/src/QuantumClifford.jl @@ -48,7 +48,7 @@ export # Symbolic Clifford Ops AbstractSymbolicOperator, AbstractSingleQubitOperator, AbstractTwoQubitOperator, sHadamard, sPhase, sInvPhase, SingleQubitOperator, sId1, sX, sY, sZ, - sHadamardXY, sHadamardYZ, sV, sInvV, sSQRTY, sInvSQRTY, sCXYZ, sCZYX, + sHadamardXY, sHadamardYZ, sSQRTX, sSQRTXDAG, sSQRTY, sSQRTYDAG, sCXYZ, sCZYX, sCNOT, sCPHASE, sSWAP, sXCX, sXCY, sXCZ, sYCX, sYCY, sYCZ, sZCX, sZCY, sZCZ, sZCrY, diff --git a/src/symbolic_cliffords.jl b/src/symbolic_cliffords.jl index a599d3ee0..7c4dd1b31 100644 --- a/src/symbolic_cliffords.jl +++ b/src/symbolic_cliffords.jl @@ -93,12 +93,12 @@ end @qubitop1 Z (x ,z , x!=0) @qubitop1 HadamardXY (x ,x⊻z , x==0 && z!=0) @qubitop1 HadamardYZ (x⊻z ,z , x!=0 && z==0) -@qubitop1 V (x⊻z ,z , x==0 && z!=0) -@qubitop1 InvV (x⊻z ,z , x!=0 && z!=0) +@qubitop1 SQRTX (x⊻z ,z , x==0 && z!=0) +@qubitop1 SQRTXDAG (x⊻z ,z , x!=0 && z!=0) @qubitop1 CXYZ (x⊻z ,x , z==0 && x==0) @qubitop1 CZYX (z ,x⊻z , z==0 && x==0) @qubitop1 SQRTY (z ,x , z==0) -@qubitop1 InvSQRTY (z ,x , z!=0 && x==0) +@qubitop1 SQRTYDAG (z ,x , z!=0 && x==0) """A "symbolic" single-qubit Identity operation. @@ -196,10 +196,10 @@ SingleQubitOperator(p::sCXYZ) = SingleQubitOperator(p.q, true , tr SingleQubitOperator(p::sCZYX) = SingleQubitOperator(p.q, false, true, true, true , false , false) SingleQubitOperator(p::sHadamardXY) = SingleQubitOperator(p.q, true , true, false, true , false , true) SingleQubitOperator(p::sHadamardYZ) = SingleQubitOperator(p.q, true , false, true, true , true , false) -SingleQubitOperator(p::sV) = SingleQubitOperator(p.q, true , false, true, true , false, true) -SingleQubitOperator(p::sInvV) = SingleQubitOperator(p.q, true , false, true, true , false , false) +SingleQubitOperator(p::sSQRTX) = SingleQubitOperator(p.q, true , false, true, true , false, true) +SingleQubitOperator(p::sSQRTXDAG) = SingleQubitOperator(p.q, true , false, true, true , false , false) SingleQubitOperator(p::sSQRTY) = SingleQubitOperator(p.q, false , true, true, false , true , false) -SingleQubitOperator(p::sInvSQRTY) = SingleQubitOperator(p.q, false , true, true, false , false , true) +SingleQubitOperator(p::sSQRTYDAG) = SingleQubitOperator(p.q, false , true, true, false , false , true) SingleQubitOperator(o::SingleQubitOperator) = o function SingleQubitOperator(op::CliffordOperator, qubit) nqubits(op)==1 || throw(DimensionMismatch("You are trying to convert a multiqubit `CliffordOperator` into a symbolic `SingleQubitOperator`.")) @@ -257,11 +257,12 @@ LinearAlgebra.inv(p::sY) = sY(p.q) LinearAlgebra.inv(p::sZ) = sZ(p.q) LinearAlgebra.inv(p::sHadamardXY) = sHadamardXY(p.q) LinearAlgebra.inv(p::sHadamardYZ) = sHadamardYZ(p.q) -LinearAlgebra.inv(p::sV) = sInvV(p.q) -LinearAlgebra.inv(p::sInvV) = sV(p.q) -LinearAlgebra.inv(p::sSQRTY) = sInvSQRTY(p.q) -LinearAlgebra.inv(p::sInvSQRTY) = sSQRTY(p.q) - +LinearAlgebra.inv(p::sSQRTX) = sSQRTXDAG(p.q) +LinearAlgebra.inv(p::sSQRTXDAG) = sSQRTX(p.q) +LinearAlgebra.inv(p::sSQRTY) = sSQRTYDAG(p.q) +LinearAlgebra.inv(p::sSQRTYDAG) = sSQRTY(p.q) +LinearAlgebra.inv(p::sCZYX) = sCXYZ(p.q) +LinearAlgebra.inv(p::sCXYZ) = sCZYX(p.q) ############################## # Two-qubit gates ############################## diff --git a/test/test_symcliff.jl b/test/test_symcliff.jl index 8db261ce5..42f717109 100644 --- a/test/test_symcliff.jl +++ b/test/test_symcliff.jl @@ -66,7 +66,7 @@ end @testset "SingleQubitOperator inv methods" begin - for gate_type in [sHadamard, sX, sY, sZ, sId1, sPhase, sInvPhase, sHadamardXY, sHadamardYZ, sV, sInvV, sSQRTY, sInvSQRTY] + for gate_type in filter(gate_type -> gate_type != SingleQubitOperator, subtypes(AbstractSingleQubitOperator)) 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)) From d7f51bc02287515151a6df5252ff27778b2c9985 Mon Sep 17 00:00:00 2001 From: Fe-r-oz Date: Wed, 14 Aug 2024 12:23:07 +0500 Subject: [PATCH 4/6] completing wonderful todo tasklist --- src/QuantumClifford.jl | 2 +- src/symbolic_cliffords.jl | 36 ++++++++++++++++++------------------ test/test_symcliff.jl | 11 +++++++++++ 3 files changed, 30 insertions(+), 19 deletions(-) diff --git a/src/QuantumClifford.jl b/src/QuantumClifford.jl index 59fd6f6d3..06d425867 100644 --- a/src/QuantumClifford.jl +++ b/src/QuantumClifford.jl @@ -48,7 +48,7 @@ export # Symbolic Clifford Ops AbstractSymbolicOperator, AbstractSingleQubitOperator, AbstractTwoQubitOperator, sHadamard, sPhase, sInvPhase, SingleQubitOperator, sId1, sX, sY, sZ, - sHadamardXY, sHadamardYZ, sSQRTX, sSQRTXDAG, sSQRTY, sSQRTYDAG, sCXYZ, sCZYX, + sHadamardXY, sHadamardYZ, sSQRTX, sInvSQRTX, sSQRTY, sInvSQRTY, sCXYZ, sCZYX, sCNOT, sCPHASE, sSWAP, sXCX, sXCY, sXCZ, sYCX, sYCY, sYCZ, sZCX, sZCY, sZCZ, sZCrY, diff --git a/src/symbolic_cliffords.jl b/src/symbolic_cliffords.jl index 7c4dd1b31..2d658ff96 100644 --- a/src/symbolic_cliffords.jl +++ b/src/symbolic_cliffords.jl @@ -86,19 +86,19 @@ macro qubitop1(name, kernel) end @qubitop1 Hadamard (z ,x , x!=0 && z!=0) +@qubitop1 HadamardXY (x ,x⊻z , x==0 && z!=0) +@qubitop1 HadamardYZ (x⊻z ,z , x!=0 && z==0) @qubitop1 Phase (x ,x⊻z , x!=0 && z!=0) @qubitop1 InvPhase (x ,x⊻z , x!=0 && z==0) @qubitop1 X (x ,z , z!=0) -@qubitop1 Y (x ,z , (x⊻z)!=0) +@qubitop1 Y (x ,z , (x⊻z)!=0) @qubitop1 Z (x ,z , x!=0) -@qubitop1 HadamardXY (x ,x⊻z , x==0 && z!=0) -@qubitop1 HadamardYZ (x⊻z ,z , x!=0 && z==0) @qubitop1 SQRTX (x⊻z ,z , x==0 && z!=0) -@qubitop1 SQRTXDAG (x⊻z ,z , x!=0 && z!=0) +@qubitop1 InvSQRTX (x⊻z ,z , x!=0 && z!=0) +@qubitop1 SQRTY (z ,x , z==0) +@qubitop1 InvSQRTY (z ,x , z!=0 && x==0) @qubitop1 CXYZ (x⊻z ,x , z==0 && x==0) @qubitop1 CZYX (z ,x⊻z , z==0 && x==0) -@qubitop1 SQRTY (z ,x , z==0) -@qubitop1 SQRTYDAG (z ,x , z!=0 && x==0) """A "symbolic" single-qubit Identity operation. @@ -192,14 +192,14 @@ SingleQubitOperator(p::sId1) = SingleQubitOperator(p.q, true , fa SingleQubitOperator(p::sX) = SingleQubitOperator(p.q, true , false, false, true , false, true) SingleQubitOperator(p::sY) = SingleQubitOperator(p.q, true , false, false, true , true , true) SingleQubitOperator(p::sZ) = SingleQubitOperator(p.q, true , false, false, true , true , false) -SingleQubitOperator(p::sCXYZ) = SingleQubitOperator(p.q, true , true, true, false , false , false) -SingleQubitOperator(p::sCZYX) = SingleQubitOperator(p.q, false, true, true, true , false , false) -SingleQubitOperator(p::sHadamardXY) = SingleQubitOperator(p.q, true , true, false, true , false , true) -SingleQubitOperator(p::sHadamardYZ) = SingleQubitOperator(p.q, true , false, true, true , true , false) -SingleQubitOperator(p::sSQRTX) = SingleQubitOperator(p.q, true , false, true, true , false, true) -SingleQubitOperator(p::sSQRTXDAG) = SingleQubitOperator(p.q, true , false, true, true , false , false) -SingleQubitOperator(p::sSQRTY) = SingleQubitOperator(p.q, false , true, true, false , true , false) -SingleQubitOperator(p::sSQRTYDAG) = SingleQubitOperator(p.q, false , true, true, false , false , true) +SingleQubitOperator(p::sCXYZ) = SingleQubitOperator(p.q, true , true , true , false, false, false) +SingleQubitOperator(p::sCZYX) = SingleQubitOperator(p.q, false, true , true , true , false, false) +SingleQubitOperator(p::sHadamardXY) = SingleQubitOperator(p.q, true , true , false, true , false, true) +SingleQubitOperator(p::sHadamardYZ) = SingleQubitOperator(p.q, true , false, true , true , true , false) +SingleQubitOperator(p::sSQRTX) = SingleQubitOperator(p.q, true , false, true , true , false, true) +SingleQubitOperator(p::sInvSQRTX) = SingleQubitOperator(p.q, true , false, true , true , false, false) +SingleQubitOperator(p::sSQRTY) = SingleQubitOperator(p.q, false, true , true , false, true , false) +SingleQubitOperator(p::sInvSQRTY) = SingleQubitOperator(p.q, false, true , true , false, false, true) SingleQubitOperator(o::SingleQubitOperator) = o function SingleQubitOperator(op::CliffordOperator, qubit) nqubits(op)==1 || throw(DimensionMismatch("You are trying to convert a multiqubit `CliffordOperator` into a symbolic `SingleQubitOperator`.")) @@ -257,10 +257,10 @@ LinearAlgebra.inv(p::sY) = sY(p.q) LinearAlgebra.inv(p::sZ) = sZ(p.q) LinearAlgebra.inv(p::sHadamardXY) = sHadamardXY(p.q) LinearAlgebra.inv(p::sHadamardYZ) = sHadamardYZ(p.q) -LinearAlgebra.inv(p::sSQRTX) = sSQRTXDAG(p.q) -LinearAlgebra.inv(p::sSQRTXDAG) = sSQRTX(p.q) -LinearAlgebra.inv(p::sSQRTY) = sSQRTYDAG(p.q) -LinearAlgebra.inv(p::sSQRTYDAG) = sSQRTY(p.q) +LinearAlgebra.inv(p::sSQRTX) = sInvSQRTX(p.q) +LinearAlgebra.inv(p::sInvSQRTX) = sSQRTX(p.q) +LinearAlgebra.inv(p::sSQRTY) = sInvSQRTY(p.q) +LinearAlgebra.inv(p::sInvSQRTY) = sSQRTY(p.q) LinearAlgebra.inv(p::sCZYX) = sCXYZ(p.q) LinearAlgebra.inv(p::sCXYZ) = sCZYX(p.q) ############################## diff --git a/test/test_symcliff.jl b/test/test_symcliff.jl index 42f717109..8c9a522c7 100644 --- a/test/test_symcliff.jl +++ b/test/test_symcliff.jl @@ -76,5 +76,16 @@ @test CliffordOperator(inv(random_op), i) == inv(CliffordOperator(random_op, i)) @test CliffordOperator(inv(SingleQubitOperator(random_op)), i) == inv(CliffordOperator(random_op, i)) end + + @testset "New single qubit gates consistency check" begin + # see https://github.com/quantumlib/Stim/blob/main/doc/gates.md + @test CliffordOperator(sCXYZ) == C"Y X" + @test CliffordOperator(sCZYX) == C"Z Y" + @test CliffordOperator(sSQRTX) == C"X -Y" + @test CliffordOperator(sSQRTY) == C"-Z X" + @test CliffordOperator(sInvSQRTX) == C"X Y" + @test CliffordOperator(sInvSQRTY) == C"Z -X" + @test CliffordOperator(sHadamardXY) == C"Y -Z" + @test CliffordOperator(sHadamardYZ) == C"-X Y" end end From 88af2f69bf5b1aa8525bfbb3be3b5f03a701cd97 Mon Sep 17 00:00:00 2001 From: Stefan Krastanov Date: Fri, 13 Sep 2024 23:37:03 -0400 Subject: [PATCH 5/6] minor test comment update --- test/test_symcliff.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test_symcliff.jl b/test/test_symcliff.jl index 8c9a522c7..487373f7d 100644 --- a/test/test_symcliff.jl +++ b/test/test_symcliff.jl @@ -77,7 +77,7 @@ @test CliffordOperator(inv(SingleQubitOperator(random_op)), i) == inv(CliffordOperator(random_op, i)) end - @testset "New single qubit gates consistency check" begin + @testset "Consistency checks with Stim" begin # see https://github.com/quantumlib/Stim/blob/main/doc/gates.md @test CliffordOperator(sCXYZ) == C"Y X" @test CliffordOperator(sCZYX) == C"Z Y" From 754b1d0e0f9c6bd5019bb0a0a68b27fe6f81404d Mon Sep 17 00:00:00 2001 From: Stefan Krastanov Date: Fri, 13 Sep 2024 23:38:08 -0400 Subject: [PATCH 6/6] changelog update --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index bf99894df..6348c37ec 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,10 @@ # News +## dev + +- Implementing many more named single-qubit gates following naming convention similar to the stim package in python. + ## v0.9.8 - 2024-08-03 - New group-theoretical tools: