# Spin-1/2 Heisenberg chain and its integrals of motion

The spin-1/2 Heisenberg chain is a textbook example of an integrable quantum system. Its Hamiltonian

$\hat H = g \sum_i \mathbf{S}_i \cdot \mathbf{S}_{i+1}$

conserves three projections of the total spin

$\mathbf{S} = \sum_i \mathbf{S}_i$

as well as a series of higher order charges $$Q_n$$. Existence of these charges can be derived from the transfer matrix theory. Explicit expressions for $$Q_n$$ were obtained in [GM94]. The following program constructs Hamiltonian of the Heisenberg chain with periodic boundary conditions and checks that $$[\hat H, \mathbf{S}] = 0$$, $$[\hat H, Q_n] = 0$$ and $$[Q_n, Q_m] = 0$$ for $$m,n = 3,4,5$$.

  1#include <array>
2#include <iostream>
3#include <vector>
4
5#include <libcommute/libcommute.hpp>
6
7using namespace libcommute;
8
9// Type of the spin-1/2 Heisenberg Hamiltonian and its charges.
10// All spin operators are going to carry one integer index - the site index.
11using expr_t = static_indices::expr_complex<int>;
12
13// Spins S_i are operator-valued 3-dimensional vectors. Here, we use std::array
14// as a simplistic implementation of such vectors.
15using vector_expr_t = std::array<expr_t, 3>;
16
17// Addition of two vectors.
18vector_expr_t operator+(vector_expr_t const& S1, vector_expr_t const& S2) {
19  return {S1[0] + S2[0], S1[1] + S2[1], S1[2] + S2[2]};
20}
21
22// Scalar product of two vectors.
23expr_t dot(vector_expr_t const& S1, vector_expr_t const& S2) {
24  return S1[0] * S2[0] + S1[1] * S2[1] + S1[2] * S2[2];
25}
26
27// Cross product of two vectors
28vector_expr_t cross(vector_expr_t const& S1, vector_expr_t const& S2) {
29  return {S1[1] * S2[2] - S1[2] * S2[1],
30          S1[2] * S2[0] - S1[0] * S2[2],
31          S1[0] * S2[1] - S1[1] * S2[0]};
32}
33
34int main() {
35
36  // For functions S_x(), S_y() and S_z().
37  // Note that the x/y functions exist only for the complex expressions.
38  using namespace static_indices;
39
40  // Number of spins in the chain
41  int const N = 20;
42  // Heisenberg exchange constant
43  double const g = 2;
44
45  // List of spin operators {S_0, S_1, ..., S_{N-1}}
46  std::vector<vector_expr_t> S;
47  S.reserve(N);
48  for(int i = 0; i < N; ++i)
49    S.push_back({S_x(i), S_y(i), S_z(i)});
50
51  // Hamiltonian of the spin-1/2 Heisenberg chain.
52  expr_t H;
53  for(int i = 0; i < N; ++i) {
54    // Index shift modulo N ensures periodic boundary conditions.
55    H += g * dot(S[i], S[(i + 1) % N]);
56  }
57
58  // Total spin of the chain
59  vector_expr_t S_tot;
60  for(int i = 0; i < N; ++i)
61    S_tot = S_tot + S[i];
62
63  // All three components of S commute with the Hamiltonian.
64  std::cout << "[H, S_x] = " << (H * S_tot[0] - S_tot[0] * H) << '\n';
65  std::cout << "[H, S_y] = " << (H * S_tot[1] - S_tot[1] * H) << '\n';
66  std::cout << "[H, S_z] = " << (H * S_tot[2] - S_tot[2] * H) << '\n';
67
68  // Higher charge Q_3 (1st line of Eq. (10)).
69  expr_t Q3;
70  for(int i = 0; i < N; ++i) {
71    Q3 += dot(cross(S[i], S[(i + 1) % N]), S[(i + 2) % N]);
72  }
73  std::cout << "[H, Q3] = " << (H * Q3 - Q3 * H) << '\n';
74
75  // Higher charge Q_4 (2nd line of Eq. (10)).
76  expr_t Q4;
77  for(int i = 0; i < N; ++i) {
78    Q4 += 4.0 * dot(cross(cross(S[i], S[(i + 1) % N]), S[(i + 2) % N]),
79                    S[(i + 3) % N]);
80    Q4 += dot(S[i], S[(i + 2) % N]);
81  }
82  std::cout << "[H, Q4] = " << (H * Q4 - Q4 * H) << '\n';
83
84  // Higher charge Q_5 (3rd line of Eq. (10)).
85  expr_t Q5;
86  for(int i = 0; i < N; ++i) {
87    Q5 += 4.0 * dot(cross(cross(cross(S[i], S[(i + 1) % N]), S[(i + 2) % N]),
88                          S[(i + 3) % N]),
89                    S[(i + 4) % N]);
90    Q5 += dot(cross(S[i], S[(i + 2) % N]), S[(i + 3) % N]);
91    Q5 += dot(cross(S[i], S[(i + 1) % N]), S[(i + 3) % N]);
92  }
93  std::cout << "[H, Q5] = " << (H * Q5 - Q5 * H) << '\n';
94
95  // Check that the higher charges pairwise commute.
96  std::cout << "[Q3, Q4] = " << (Q3 * Q4 - Q4 * Q3) << '\n';
97  std::cout << "[Q3, Q5] = " << (Q3 * Q5 - Q5 * Q3) << '\n';
98  std::cout << "[Q4, Q5] = " << (Q4 * Q5 - Q5 * Q4) << '\n';
99
100  return 0;
101}

[GM94]

“Quantum Integrals of Motion for the Heisenberg Spin Chain”, M. P. Grabowski and P. Mathieu, Mod. Phys. Lett. A, Vol. 09, No. 24, pp. 2197-2206 (1994), https://doi.org/10.1142/S0217732394002057