Exact diagonalization of the S=1/2 Heisenberg chain
(using semi-momentum states)

Program: hchan_mkp

Note that except for k=0 and k=pi (integer label k=N/2), the symmetric (p=1) and anti-symmetric (p=-1) states are degenerate (just as regular momentum states with momentum k and -k are degenerate). The program therefore does the calculation for both p=-1 and p=+1 only for k=0 and pi, and only p=+1 for other momenta.

Running instructions

Input: File read.in containing:
Column 1: System size N (integer)
Column 2: Estimated maximum block hilbert space size rm (integer)

Example read.in (N=8, rm=20)

    8  20

Output: File eig.dat containing:
For each sector of fixed number of up spins nu and momentum k (integer, k=0,...,N/2), and p (-1 and +1):
Line 1: nu,k,p and the block size nst, followed by nst lines with:
Column 1: Eigenvalue number (integer)
Column 2: Energy eigenvalue (real)
Column 3: Spin quantum number (real)

File low.dat containing lowest eigenstate for each sector:
Column 1: nu (integer)
Column 2: k (integer)
Column 3: p (integer)
Column 4: Energy eigenvalue (real)
Column 5: Spin quantum number (real)

Examples and comments

Following are results for N=6. Note that for this small system many sectors do not have any states. The file eig.dat:

nu = 0 k =  0 p = -1   nst =   0
nu = 0 k =  0 p =  1   nst =   1
    0      0.0000000000      3.0000000000
nu = 0 k =  1 p =  1   nst =   0
nu = 0 k =  2 p =  1   nst =   0
nu = 0 k =  3 p = -1   nst =   0
nu = 0 k =  3 p =  1   nst =   0
nu = 1 k =  0 p = -1   nst =   0
nu = 1 k =  0 p =  1   nst =   1
    0      0.0000000000      3.0000000000
nu = 1 k =  1 p =  1   nst =   1
    0      0.0000000000      2.0000000000
nu = 1 k =  2 p =  1   nst =   1
    0      0.0000000000      2.0000000000
nu = 1 k =  3 p = -1   nst =   1
    0      0.0000000000      2.0000000000
nu = 1 k =  3 p =  1   nst =   0
nu = 2 k =  0 p = -1   nst =   0
nu = 2 k =  0 p =  1   nst =   3
    0     -2.1180339887      1.0000000000
    1      0.1180339887      1.0000000000
    2      0.0000000000      3.0000000000
nu = 2 k =  1 p =  1   nst =   2
    0     -1.0000000000      1.0000000000
    1      1.0000000000      2.0000000000
nu = 2 k =  2 p =  1   nst =   3
    0     -1.2807764064      1.0000000000
    1      0.0000000000      2.0000000000
    2      0.0000000000      1.0000000000
nu = 2 k =  3 p = -1   nst =   1
    0      0.0000000000      2.0000000000
nu = 2 k =  3 p =  1   nst =   1
    0      0.0000000000      1.0000000000
nu = 3 k =  0 p = -1   nst =   1
    0      0.0000000000      0.0000000000
nu = 3 k =  0 p =  1   nst =   3
    0     -2.1180339887      1.0000000000
    1      0.1180339887      1.0000000000
    2      0.0000000000      3.0000000000
nu = 3 k =  1 p =  1   nst =   3
    0     -1.0000000000      1.0000000000
    1     -0.5000000000      0.0000000000
    2      0.0000000000      2.0000000000
nu = 3 k =  2 p =  1   nst =   3
    0     -1.2807764064      1.0000000000
    1     -0.0000000000      2.0000000000
    2      0.0000000000      1.0000000000
nu = 3 k =  3 p = -1   nst =   3
    0     -2.8027756377      0.0000000000
    1     -0.5000000000      2.0000000000
    2      0.0000000000      0.0000000000
nu = 3 k =  3 p =  1   nst =   1
    0      0.0000000000      1.0000000000

The file low.dat (lowest-energy state in each sector containing states):

    0    0    1    0.0000000000    3.0000000000         1
    1    0    1    0.0000000000    3.0000000000         1
    1    1    1    0.0000000000    2.0000000000         1
    1    2    1    0.0000000000    2.0000000000         1
    1    3   -1    0.0000000000    2.0000000000         1
    2    0    1   -2.1180339887    1.0000000000         3
    2    1    1   -1.0000000000    1.0000000000         2
    2    2    1   -1.2807764064    1.0000000000         3
    2    3   -1    0.0000000000    2.0000000000         1
    2    3    1    0.0000000000    1.0000000000         1
    3    0   -1    0.0000000000    0.0000000000         1
    3    0    1   -2.1180339887    1.0000000000         3
    3    1    1   -1.0000000000    1.0000000000         3
    3    2    1   -1.2807764064    1.0000000000         3
    3    3   -1   -2.8027756377    0.0000000000         3
    3    3    1    0.0000000000    1.0000000000         1

It is interesting to look at the states with nu=2 and k=pi for N=8. When parity is not used, there are 3 degenerate states with energy E=0 and different total spin. A diagonalization then delivers non-integer S, as discussed with the program hchain_mk;

 nu = 2  k =  4    nst = 4
    0     -0.0000000000      2.0009877794
    1      0.0000000000      2.9990995860
    2      0.0000000000      2.0002724281
    3      1.0000000000      2.0000000000

When parity is used, some of this degeneracy is lifted. The states in the p=-1 and p=+1 sectors are

nu = 2, k =  4, p = -1,  nst =   2
    0      0.0000000000      2.7015621187
    1      0.0000000000      2.3722813233
nu = 2, k =  4, p =  1,  nst =   2
    0      0.0000000000      2.0000000000
    1      1.0000000000      2.0000000000

There is one state with E=0 in the p=+1 sector, with spin S=2. In the p=-1 sector there are still 2 degenerate states with different spins that are not resolved by this diagonalization (although based on the information obtained we could still in principle compute the spins, since only one particular mixing of two integer spins could give the expectation values delivered by the program).