EntanglementDetection.jl
This package provides tools for certifying entanglement and separability in multipartite quantum systems with arbitrary local dimensions.
The original article introducing this package can be found here:
[1] A Unified Toolbox for Multipartite Entanglement Certification.
The method for separability certification was first introduced in
[2] Convex optimization over classes of multiparticle entanglement.
Installation
The most recent release is available via the julia package manager, e.g., with
using Pkg
Pkg.add("EntanglementDetection")
or the main branch:
Pkg.add(url="https://github.com/ZIB-IOL/EntanglementDetection.jl", rev="main")
Getting started
We demonstrate how to analyze the entanglement property of the two-qubit maximally entangled state with white noise. Using EntanglementDetection.jl
, here is what the code looks like.
julia> using EntanglementDetection, Ket, LinearAlgebra
julia> d = 2; # qubit system
julia> N = 2; # bipartite scenario
julia> p = 0.2; # white noise strength
julia> ρ = Ket.state_ghz(d, N; v = 1 - p) # two-qubit maximally entangled state with white noise
4×4 Hermitian{ComplexF64, Matrix{ComplexF64}}:
0.45+0.0im 0.0+0.0im 0.0+0.0im 0.4+0.0im
0.0-0.0im 0.05+0.0im 0.0+0.0im 0.0+0.0im
0.0-0.0im 0.0-0.0im 0.05+0.0im 0.0+0.0im
0.4-0.0im 0.0-0.0im 0.0-0.0im 0.45+0.0im
julia> dims = Tuple(fill(d, N)); # the entanglement structure 2 × 2
julia> res = separable_distance(ρ, dims); # compute the distance to the separable set
Iteration Primal Dual gap #Atoms
1 1.6600e+00 4.0000e+00 1
10000 3.2667e-01 6.1346e-08 10
20000 3.2667e-01 6.1346e-08 10
30000 3.2667e-01 6.1346e-08 10
40000 3.2667e-01 6.1346e-08 10
50000 3.2667e-01 6.1346e-08 10
60000 3.2667e-01 6.1346e-08 10
70000 3.2667e-01 6.1346e-08 10
80000 3.2667e-01 6.1346e-08 10
90000 3.2667e-01 6.1346e-08 10
100000 3.2667e-01 6.1346e-08 10
Last 3.2667e-01 9.3576e-08 10
[ Info: Stop: maximum iteration reached
For the state $ρ$, as the distance to the separable set res.primal
is significantly greater than 0, practically, we can detect the entanglement of the state with confidence (technically speaking, $Primal$ $\gg$ $Dual gap$).
Rapid entanglement detection
In principle, if $Primal$ > $Dual gap$, the state lies outside the separable set and is therefore entangled. However, since the default method in our algorithm is heuristic, the reported $Dual gap$ is only a lower bound on the true value. Empirically, requiring $Primal$ ≥ 5 × $Dual gap$ is often sufficient for robust detection, especially in noisy but clearly experimental entangled states.
To support this, we provide a shortcut mode that speeds up the detection process. The package also accepts raw experimental input in the form of a correlation tensor from standard full state tomography.
# the tensor of the density matrix; can be replaced by real experimental data
julia> C = correlation_tensor(ρ, dims)
4×4 Matrix{Float64}:
1.0 0.0 0.0 0.0
0.0 0.2 0.0 0.0
0.0 0.0 -0.2 0.0
0.0 0.0 0.0 0.2
# the default basis is the generalized Gell-Mann basis (Pauli basis for qubits)
# any informationally complete basis with normalization 2 can be used
julia> basis = EntanglementDetection._gellmann(ComplexF64, dims);
julia> res = separable_distance(C, basis; shortcut=true);
Iteration Primal Dual gap #Atoms
1 1.6600e+00 4.0000e+00 1
Last 3.2672e-01 1.1695e-02 6
[ Info: Stop: primal great larger than dual gap (shortcut)
The shortcut mode stops early once entanglement can be reliably confirmed.
Rigorous entanglement certification
When heuristic detection is not sufficient, a rigorous certificate can be constructed via an entanglement witness:
julia> witness = entanglement_witness(ρ, res.σ, dims); # construct a rigorous entanglement witness
julia> real(dot(witness.W, ρ)) < 0 # if Tr(Wρ) < 0, then the state ρ is entangled
true
Separability certification
Now consider a noisier version of the same state:
julia> d = 2; N = 2; p = 0.8; ρ = Ket.state_ghz(d, N; v = 1 - p) # with more white noise
4×4 Hermitian{ComplexF64, Matrix{ComplexF64}}:
0.3+0.0im 0.0+0.0im 0.0+0.0im 0.1+0.0im
0.0-0.0im 0.2+0.0im 0.0+0.0im 0.0+0.0im
0.0-0.0im 0.0-0.0im 0.2+0.0im 0.0+0.0im
0.1-0.0im 0.0-0.0im 0.0-0.0im 0.3+0.0im
julia> res = separable_distance(ρ, dims); # compute the distance to the separable set
Iteration Primal Dual gap #Atoms
1 1.3600e+00 4.0000e+00 1
Last 7.7981e-07 1.0612e-03 14
[ Info: Stop: primal small enough
In this case, $Primal$ is much smaller than $Dual gap$, which cannot be detected as an entangled state, and also cannot be confirmed by entanglement witness:
julia> witness = entanglement_witness(ρ, res.σ, dims); # construct a rigorous entanglement witness
julia> real(dot(witness.W, ρ)) < 0 # if Tr(Wρ) > 0, then the state ρ could be entangled or separable.
false
In order to certify separability, a geometric reconstruction procedure was introduced in Ref. [2] and is also provided in our package to build a unified toolbox for entanglement analysis:
julia> sep = separability_certification(ρ, dims; verbose = 0); # certify separability by geometric reconstruction
julia> sep.sep
true
This confirms that the state lies inside the separable set, completing the analysis.
Under the hood
The computation is based on an efficient variant of the Frank-Wolfe algorithm to iteratively find the separable state closest to the input quantum state based on correlation tensor. See this recent review for an introduction to the method, the article for the details on the latest improvements used in our case, and the package FrankWolfe.jl for the implementation on which this package relies.
Going further
More examples can be found in the corresponding folder of the package. They include the application on a 10-qubit system (with a shortcut method for early stop) and multipartite systems with different entanglement structures.