mirror of
https://github.com/qwjyh/QuantumLegos.jl.git
synced 2024-11-24 16:01:04 +09:00
202 lines
8.8 KiB
Markdown
202 lines
8.8 KiB
Markdown
|
```@meta
|
|||
|
CurrentModule = QuantumLegos
|
|||
|
```
|
|||
|
|
|||
|
# QuantumLegos
|
|||
|
|
|||
|
Documentation for QuantumLegos.
|
|||
|
|
|||
|
All contents:
|
|||
|
|
|||
|
```@contents
|
|||
|
```
|
|||
|
|
|||
|
# Example
|
|||
|
|
|||
|
## CheckMatrix and defining Lego
|
|||
|
```jldoctest
|
|||
|
julia> using QuantumLegos
|
|||
|
|
|||
|
julia> stabilizers = pauliop.(["IIXXXX", "IIZZZZ", "ZIZZII", "IZZIZI", "IXXXII", "XIXIXI"])
|
|||
|
6-element Vector{StaticArraysCore.SVector{6, QuantumLegos.PauliOps.SinglePauliOp}}:
|
|||
|
pauliop("IIXXXX")
|
|||
|
pauliop("IIZZZZ")
|
|||
|
pauliop("ZIZZII")
|
|||
|
pauliop("IZZIZI")
|
|||
|
pauliop("IXXXII")
|
|||
|
pauliop("XIXIXI")
|
|||
|
|
|||
|
julia> cmat = checkmatrix(stabilizers)
|
|||
|
CheckMatrix with 6 generators, 6 legs:
|
|||
|
0 0 1 1 1 1 | 0 0 0 0 0 0
|
|||
|
0 0 0 0 0 0 | 0 0 1 1 1 1
|
|||
|
0 0 0 0 0 0 | 1 0 1 1 0 0
|
|||
|
0 0 0 0 0 0 | 0 1 1 0 1 0
|
|||
|
0 1 1 1 0 0 | 0 0 0 0 0 0
|
|||
|
1 0 1 0 1 0 | 0 0 0 0 0 0
|
|||
|
|
|||
|
|
|||
|
julia> cmat.nlegs
|
|||
|
6
|
|||
|
|
|||
|
julia> cmat.ngens
|
|||
|
6
|
|||
|
|
|||
|
julia> cmat.cmat
|
|||
|
6×12 Matrix{Bool}:
|
|||
|
0 0 1 1 1 1 0 0 0 0 0 0
|
|||
|
0 0 0 0 0 0 0 0 1 1 1 1
|
|||
|
0 0 0 0 0 0 1 0 1 1 0 0
|
|||
|
0 0 0 0 0 0 0 1 1 0 1 0
|
|||
|
0 1 1 1 0 0 0 0 0 0 0 0
|
|||
|
1 0 1 0 1 0 0 0 0 0 0 0
|
|||
|
|
|||
|
julia> # define lego
|
|||
|
|
|||
|
julia> lego = Lego(stabilizers)
|
|||
|
Lego{6}(6, StaticArraysCore.SVector{6, QuantumLegos.PauliOps.SinglePauliOp}[pauliop("IIXXXX"), pauliop("IIZZZZ"), pauliop("ZIZZII"), pauliop("IZZIZI"), pauliop("IXXXII"), pauliop("XIXIXI")])
|
|||
|
|
|||
|
julia> lego.stabgens |> checkmatrix
|
|||
|
CheckMatrix with 6 generators, 6 legs:
|
|||
|
0 0 1 1 1 1 | 0 0 0 0 0 0
|
|||
|
0 0 0 0 0 0 | 0 0 1 1 1 1
|
|||
|
0 0 0 0 0 0 | 1 0 1 1 0 0
|
|||
|
0 0 0 0 0 0 | 0 1 1 0 1 0
|
|||
|
0 1 1 1 0 0 | 0 0 0 0 0 0
|
|||
|
1 0 1 0 1 0 | 0 0 0 0 0 0
|
|||
|
|
|||
|
```
|
|||
|
|
|||
|
- [`pauliop`](@ref)
|
|||
|
- [`checkmatrix`](@ref) and [`CheckMatrix`](@ref)
|
|||
|
- [`Lego`](@ref)
|
|||
|
|
|||
|
## Defining and Updating State
|
|||
|
```jldoctest
|
|||
|
julia> using QuantumLegos
|
|||
|
|
|||
|
julia> stabilizers = pauliop.(["IIXXXX", "IIZZZZ", "ZIZZII", "IZZIZI", "IXXXII", "XIXIXI"])
|
|||
|
6-element Vector{StaticArraysCore.SVector{6, QuantumLegos.PauliOps.SinglePauliOp}}:
|
|||
|
pauliop("IIXXXX")
|
|||
|
pauliop("IIZZZZ")
|
|||
|
pauliop("ZIZZII")
|
|||
|
pauliop("IZZIZI")
|
|||
|
pauliop("IXXXII")
|
|||
|
pauliop("XIXIXI")
|
|||
|
|
|||
|
julia> lego = Lego(stabilizers)
|
|||
|
Lego{6}(6, StaticArraysCore.SVector{6, QuantumLegos.PauliOps.SinglePauliOp}[pauliop("IIXXXX"), pauliop("IIZZZZ"), pauliop("ZIZZII"), pauliop("IZZIZI"), pauliop("IXXXII"), pauliop("XIXIXI")])
|
|||
|
|
|||
|
julia> # state with 1 lego, 0 leg
|
|||
|
|
|||
|
julia> st = State([lego, ], Tuple{LegoLeg, LegoLeg}[])
|
|||
|
State(Lego[Lego{6}(6, StaticArraysCore.SVector{6, QuantumLegos.PauliOps.SinglePauliOp}[pauliop("IIXXXX"), pauliop("IIZZZZ"), pauliop("ZIZZII"), pauliop("IZZIZI"), pauliop("IXXXII"), pauliop("XIXIXI")])], Tuple{LegoLeg, LegoLeg}[], CheckMatrix(Bool[0 0 … 0 0; 0 0 … 1 1; … ; 0 1 … 0 0; 1 0 … 0 0], 6, 6))
|
|||
|
|
|||
|
julia> st.cmat.cmat
|
|||
|
6×12 Matrix{Bool}:
|
|||
|
0 0 1 1 1 1 0 0 0 0 0 0
|
|||
|
0 0 0 0 0 0 0 0 1 1 1 1
|
|||
|
0 0 0 0 0 0 1 0 1 1 0 0
|
|||
|
0 0 0 0 0 0 0 1 1 0 1 0
|
|||
|
0 1 1 1 0 0 0 0 0 0 0 0
|
|||
|
1 0 1 0 1 0 0 0 0 0 0 0
|
|||
|
|
|||
|
julia> add_lego!(st, lego)
|
|||
|
State(Lego[Lego{6}(6, StaticArraysCore.SVector{6, QuantumLegos.PauliOps.SinglePauliOp}[pauliop("IIXXXX"), pauliop("IIZZZZ"), pauliop("ZIZZII"), pauliop("IZZIZI"), pauliop("IXXXII"), pauliop("XIXIXI")]), Lego{6}(6, StaticArraysCore.SVector{6, QuantumLegos.PauliOps.SinglePauliOp}[pauliop("IIXXXX"), pauliop("IIZZZZ"), pauliop("ZIZZII"), pauliop("IZZIZI"), pauliop("IXXXII"), pauliop("XIXIXI")])], Tuple{LegoLeg, LegoLeg}[], CheckMatrix(Bool[0 0 … 0 0; 0 0 … 0 0; … ; 0 0 … 0 0; 0 0 … 0 0], 12, 12))
|
|||
|
|
|||
|
julia> st.cmat.cmat
|
|||
|
12×24 Matrix{Bool}:
|
|||
|
0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
|||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0
|
|||
|
0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0
|
|||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0
|
|||
|
0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
|||
|
1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
|||
|
0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
|
|||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1
|
|||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0
|
|||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0
|
|||
|
0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
|||
|
0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
|
|||
|
|
|||
|
julia> # state with 2 legos, 0 leg
|
|||
|
|
|||
|
julia> st2 = State([lego, lego], Tuple{LegoLeg, LegoLeg}[])
|
|||
|
State(Lego[Lego{6}(6, StaticArraysCore.SVector{6, QuantumLegos.PauliOps.SinglePauliOp}[pauliop("IIXXXX"), pauliop("IIZZZZ"), pauliop("ZIZZII"), pauliop("IZZIZI"), pauliop("IXXXII"), pauliop("XIXIXI")]), Lego{6}(6, StaticArraysCore.SVector{6, QuantumLegos.PauliOps.SinglePauliOp}[pauliop("IIXXXX"), pauliop("IIZZZZ"), pauliop("ZIZZII"), pauliop("IZZIZI"), pauliop("IXXXII"), pauliop("XIXIXI")])], Tuple{LegoLeg, LegoLeg}[], CheckMatrix(Bool[0 0 … 0 0; 0 0 … 0 0; … ; 0 0 … 0 0; 0 0 … 0 0], 12, 12))
|
|||
|
|
|||
|
julia> st == st2
|
|||
|
true
|
|||
|
```
|
|||
|
|
|||
|
## 2 Lego 1 edge state
|
|||
|
```jldoctest
|
|||
|
julia> using QuantumLegos
|
|||
|
|
|||
|
julia> stabilizers = pauliop.(["IIXXXX", "IIZZZZ", "ZIZZII", "IZZIZI", "IXXXII", "XIXIXI"])
|
|||
|
6-element Vector{StaticArraysCore.SVector{6, QuantumLegos.PauliOps.SinglePauliOp}}:
|
|||
|
pauliop("IIXXXX")
|
|||
|
pauliop("IIZZZZ")
|
|||
|
pauliop("ZIZZII")
|
|||
|
pauliop("IZZIZI")
|
|||
|
pauliop("IXXXII")
|
|||
|
pauliop("XIXIXI")
|
|||
|
|
|||
|
julia> lego = Lego(stabilizers)
|
|||
|
Lego{6}(6, StaticArraysCore.SVector{6, QuantumLegos.PauliOps.SinglePauliOp}[pauliop("IIXXXX"), pauliop("IIZZZZ"), pauliop("ZIZZII"), pauliop("IZZIZI"), pauliop("IXXXII"), pauliop("XIXIXI")])
|
|||
|
|
|||
|
julia> state = State([lego, lego], edge.([((1, 3), (2, 3))]))
|
|||
|
State(Lego[Lego{6}(6, StaticArraysCore.SVector{6, QuantumLegos.PauliOps.SinglePauliOp}[pauliop("IIXXXX"), pauliop("IIZZZZ"), pauliop("ZIZZII"), pauliop("IZZIZI"), pauliop("IXXXII"), pauliop("XIXIXI")]), Lego{6}(6, StaticArraysCore.SVector{6, QuantumLegos.PauliOps.SinglePauliOp}[pauliop("IIXXXX"), pauliop("IIZZZZ"), pauliop("ZIZZII"), pauliop("IZZIZI"), pauliop("IXXXII"), pauliop("XIXIXI")])], Tuple{LegoLeg, LegoLeg}[(LegoLeg(1, 3), LegoLeg(2, 3))], CheckMatrix(Bool[1 0 … 0 0; 0 1 … 0 0; … ; 0 0 … 1 1; 0 0 … 0 1], 10, 10))
|
|||
|
|
|||
|
julia> state.cmat
|
|||
|
CheckMatrix with 10 generators, 10 legs:
|
|||
|
1 0 1 0 1 0 0 0 0 0 | 0 0 0 0 0 0 0 0 0 0
|
|||
|
0 1 0 1 1 0 0 0 0 0 | 0 0 0 0 0 0 0 0 0 0
|
|||
|
0 0 1 1 1 0 0 1 1 1 | 0 0 0 0 0 0 0 0 0 0
|
|||
|
0 0 0 0 0 1 0 1 0 1 | 0 0 0 0 0 0 0 0 0 0
|
|||
|
0 0 0 0 0 0 1 0 1 1 | 0 0 0 0 0 0 0 0 0 0
|
|||
|
0 0 0 0 0 0 0 0 0 0 | 1 0 0 1 1 0 0 0 0 0
|
|||
|
0 0 0 0 0 0 0 0 0 0 | 0 1 1 0 1 0 0 0 0 0
|
|||
|
0 0 0 0 0 0 0 0 0 0 | 0 0 1 1 1 0 0 1 1 1
|
|||
|
0 0 0 0 0 0 0 0 0 0 | 0 0 0 0 0 1 0 0 1 1
|
|||
|
0 0 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 1 1 0 1
|
|||
|
|
|||
|
|
|||
|
julia> pg = state.cmat |> generators |> GeneratedPauliGroup
|
|||
|
GeneratedPauliGroup{10}(StaticArraysCore.SVector{10, QuantumLegos.PauliOps.SinglePauliOp}[pauliop("XIXIXIIIII"), pauliop("IXIXXIIIII"), pauliop("IIXXXIIXXX"), pauliop("IIIIIXIXIX"), pauliop("IIIIIIXIXX"), pauliop("ZIIZZIIIII"), pauliop("IZZIZIIIII"), pauliop("IIZZZIIZZZ"), pauliop("IIIIIZIIZZ"), pauliop("IIIIIIZZIZ")], IterTools.Subsets{Vector{StaticArraysCore.SVector{N, QuantumLegos.PauliOps.SinglePauliOp} where N}}(StaticArraysCore.SVector{N, QuantumLegos.PauliOps.SinglePauliOp} where N[pauliop("XIXIXIIIII"), pauliop("IXIXXIIIII"), pauliop("IIXXXIIXXX"), pauliop("IIIIIXIXIX"), pauliop("IIIIIIXIXX"), pauliop("ZIIZZIIIII"), pauliop("IZZIZIIIII"), pauliop("IIZZZIIZZZ"), pauliop("IIIIIZIIZZ"), pauliop("IIIIIIZZIZ")]))
|
|||
|
|
|||
|
julia> pauliop("XIIXIXIIXI") in pg
|
|||
|
true
|
|||
|
|
|||
|
```
|
|||
|
|
|||
|
# Internal(how it works)
|
|||
|
|
|||
|
## Notes on Overall flow
|
|||
|
Details on [^1]
|
|||
|
- state is translated to a single check matrix
|
|||
|
- the size is ≤ $N \times 2N$ where $N$ is maximum number of lego logs.
|
|||
|
- any contraction can be performed on this single check matrix
|
|||
|
- if the check matrix can be represented as direct sum of matrices with $k N$ columns where $k ∈ ℕ$, then they are not contracted
|
|||
|
|
|||
|
### Construction of State
|
|||
|
Construction of `State` is completed by calling `State` constructor recursively.
|
|||
|
|
|||
|
1. Construct `State` without edge. Just adding legos. Checkmatrix is just a direct sum of each lego's checkmatrix
|
|||
|
2. Concatenate each edges. During this operation, self tracing of checkmatrix is evaluated.
|
|||
|
|
|||
|
Each constructor calls action function (which is a map from `State` to `State`).
|
|||
|
Therefore, action functions can be used both for direct construction of `State` and action application to `State` during the game.
|
|||
|
|
|||
|
# API
|
|||
|
|
|||
|
```@index
|
|||
|
```
|
|||
|
|
|||
|
```@autodocs
|
|||
|
Modules = [QuantumLegos]
|
|||
|
Pages = ["game.jl"]
|
|||
|
```
|
|||
|
|
|||
|
[^1]: [C. Cao and B. Lackey, ‘Approximate Bacon-Shor code and holography’, J. High Energ. Phys., vol. 2021, no. 5, p. 127, May 2021, doi: 10.1007/JHEP05(2021)127.](https://doi.org/10.1007/JHEP05(2021)127)
|
|||
|
|