Ground States and Area Laws
Area Laws
When a 1D Hamiltonian has a gap between the ground state energy and the first excited state then the entanglement entropy of the ground state satisfies:
for a bipartition of the system . This is proven in reference and is an example of more general area laws of entanglement entropy:
where is the volume of the system and its physical dimension. The idea is that for these special low-lying states, the only contributions to their entanglement entropy come from the area of contact between the subregion and its complement , not from the size of itself. In this tutorial we will explicitly investigate this bound in 1D systems.
Gapped Systems
A rich playground for studying gapped systems is spin chains, chains of localized spins that interact through some magnetic interactions. In this tutorial we will examine the 1D Heisenberg model:
with open boundary conditions. In the code below, we will consider , . For such a choice, the system has a gap which is a necessary ingredient to test the 1D scaling law of entanglement entropy. The energy gap also plays a crucial role in quantum phase transitions, as at the critical point of the transition the gap closes, i.e. . As such, extracting the gap information can help in identifying when a change of phase has occurred.
Make the Hamiltonian
We can construct the Hamiltonian with an operator_sum:
def make_hamiltonian(real j, real h, integer N)
{
var H = operator_sum(as_real)
for(var s = 0 ; s < N-1 ; ++s)
{
H += j * Splus(s)*Sminus(s+1) + j * Sminus(s)*Splus(s+1) + j * Z(s)*Z(s+1)
}
for(var s = 0 ; s < N ; ++s)
{
H += h * X(s) + h * Z(s)
}
return H
}
This function takes in our choice for the heisenberg interaction strength, the magnetic field strength , and the number of sites in the chain and returns .
Obtaining the Ground State with Exact Diagonalization
Once we have built our Hamiltonian, we can pass it our iterative eigensolvers to obtain a number of desired eigenvector and eigenvalue pairs
var options = ["is_hermitian" : true, "is_real" : true, "krylov_dimension": 6, "tolerance": 1.0e-6]
var results = iterative_eigensolver(H, 2**N, neig, options)
The first line builds the options map to pass to our solver, it helps in determining which solver to use to get the best performance. The Hamiltonian is Hermitian and comprised of only real valued operators and thus the solver will select the Lanczos algorithm to use. Specifying that the operator is real can provide a speed up in the computation as the storage of complex numbers is double that of real numbers. Moreover, as this algorithm uses a Krylov subspace method, we can also specify the number of Krylov vectors to use as well as the numerical precision we want to use. The error of this iterative method is controlled by the residual norm , the input precision establishes when this norm is considered small enough.
The second line calls the solver and begins the computation, taking the operator_sum, the total Hilbert space size, the number of eigenvalues to target and the options map. The results are stored in a list containing the energies and the eigenstates of that we will use for our study.
Getting the Entanglement Entropy
Next we need to calculate the entanglement entropy from the ground state we have just obtained. First we must perform the partial trace to part of our system to obtain the reduced density matrix for the sites we are interested in
This operation sums over the states of the Hilbert space corresponding the physical system we will be tracing out. The entanglement entropy of the subsystem is given by
where are the eigenvalues of . We can perform both of these calculations in aleph with two functions
var evec = results[1]
var rdm = reduced_density_matrix(evec.col(0),[0..5])
var EE = von_neumann_entropy(rdm)
The first line obtains by passing our ground state and the sites we are interested in, the non-included sites are traced over. In this case we are only studying the interval of sites . The second line calculates the entanglement entropy from the input density matrix.
Putting It All Together
We can now study the scaling of entanglement entropy of the ground state with system size by using the above code and making a for loop.
var j = 3.2
var h = 0.2
var Nmax = 20
for(N: [10..Nmax+1][::2])
{
var H = make_hamiltonian(j,h,N)
var options = ["is_hermitian" : true, "is_real" : true, "krylov_dimension": 6, "tolerance": 1.0e-6]
var results = iterative_eigensolver(H, 2**N, 2, options)
var eval = results[0]
var evec = results[1]
var rdm = reduced_density_matrix(evec.col(0),[0..5])
var ee = von_neumann_entropy(rdm)
var out = "N = ${N} , Gap = ${eval[1]-eval[0]}, S(rho) = ${ee}"
print(out)
}
What's Next?
- Can we conclude that the ground state satisfies an area law?
- Can we instead keep N fixed and grow our subregion size?
- What is the effect of changing the number of krylov vectors used?
- How does our choice of where we cut our subsystem affect the results?
- How big a system can be used for these calculations?
- How stable is this gap with system size? Should it remain in the thermodynamic limit?