**Edit: a sparse array version for larger chains is given at the end.** Since you're specifically asking about $SU(2)$, we have a convenient representation in the form of the $2\times 2$ Pauli matrices. This makes it seem very beneficial to map your problem onto a matrix multiplication. Here is how you can do it. First I define the three single spin matrices, then embed them into the product space of the $N$ spin system using the functions `sZ`, `sPlus` and `sMinus` which take the dimension `N` as the first argument and the site index `j` as the second argument. There is an *ambiguity* here in that we can come up with different ways of defining the larger matrices satisfying the given commutation relations. But I will use some additional physics to assume that we are working in the $2^N$ dimensional space of spins of the sites. This means I will use `KroneckerProduct` to construct matrices that act like the identity on all but one spin, and there will be an identity of dimension $2^N$ that multiplies the factors $1/4$ in your expression, too. Adding this, I get the following: {sx, sy, sz} = 1/2 PauliMatrix[{1, 2, 3}]; sP = sx + I sy; sM = sx - I sy; sZ[n_, j_] := KroneckerProduct @@ Insert[Table[IdentityMatrix[2], {n - 1}], sz, Mod[j, n, 1]] sPlus[n_, j_] := KroneckerProduct @@ Insert[Table[IdentityMatrix[2], {n - 1}], sP, Mod[j, n, 1]] sMinus[n_, j_] := KroneckerProduct @@ Insert[Table[IdentityMatrix[2], {n - 1}], sM, Mod[j, n, 1]] id[n_] := KroneckerProduct @@ Table[IdentityMatrix[2], {n}] Now verify for an example (site `1` in a 2-spin system) that the commutation relations hold, including the boundary condition that maps `j=3` to `j=1`: sZ[2, 3].sPlus[2, 1] - sPlus[2, 1].sZ[2, 1] == sPlus[2, 1] (* ==> True *) sZ[2, 1].sMinus[2, 1] - sMinus[2, 1].sZ[2, 1] == -sMinus[2, 1] (* ==> True *) sPlus[2, 1].sMinus[2, 1] - sMinus[2, 1].sPlus[2, 1] == 2 sZ[2, 1] (* ==> True *) Finally, define the commutator and the two operators of interest: comm[a_, b_] := a.b - b.a a = With[{n = 3}, Sum[j (Δ (sZ[n, j].sZ[n, j + 1] - 1/4 id[n]) + 1/2 (sPlus[n, j].sMinus[n, j + 1] + sMinus[n, j].sPlus[n, j + 1])), {j, 1, n}]]; b = With[{n = 3}, Sum[Δ (sZ[n, j].sZ[n, j + 1] - 1/4 id[n]) + 1/2 (sPlus[n, j].sMinus[n, j + 1] + sMinus[n, j].sPlus[n, j + 1]), {j, 1, n}]]; comm[a, b] (* ==> {{0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 1/2 - Δ/2, 0, 1/4 - Δ/4, 0, 0, 0}, {0, -(1/2) + Δ/2, 0, 0, -(1/4) + Δ/4, 0, 0, 0}, {0, 0, 0, 0, 0, 1/4 - Δ/4, -(1/4) + Δ/4, 0}, {0, -(1/4) + Δ/4, 1/4 - Δ/4, 0, 0, 0, 0, 0}, {0, 0, 0, -(1/4) + Δ/4, 0, 0, -(1/2) + Δ/2, 0}, {0, 0, 0, 1/4 - Δ/4, 0, 1/2 - Δ/2, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}} *) This is the result for the commutator. **Edit** Now the goal of the question is to get an algebraic result, not a big matrix. However, this can also be achieved within the above matrix method, by reversing the translation from operator language to matrices. The idea is that a basis of the single-spin $2\times 2$ matrix space is formed by the four elements of `singleBasis` defined below. From this, we can construct a basis of the $2^N$ dimensional matrix space acting on the product of $n$ spin spaces, again using `KroneckerProduct`. This works because there are $4$ elements to choose from for each of the $N$ spins, giving $4^N = 2^{2N}$ `KroneckerProduct`s, just as many as there are entries in a $2^N$ dimensional square matrix. The central ingredient is the function `basis` which creates a `LinearSolveFunction` based on the `KroneckerProduct` basis matrices just described. I use memoization to remember the calculation once it has been called for a particular dimension $N$, because presumably one wants to simplify more than one expression with the same $N$. The linear solver is invoked here to find the **expansion coefficients** of a given matrix like the output from the commutator above, in the basis of the product matrix space. The next step is then done in `pauliReduce`, which takes a specific more or less complicated large matrix coming from a calculation like the one above, and then uses the basis expansion coefficients to rewrite that matrix as a compact symbolic sum over the spin operators. The output uses the function `basisNames` which creates a list of symbols in the same order as the list of `KroneckerProduct` basis matrices. The formatted set of names for the spin operators is defined in `singleBasisSymbols`. The output uses regular sums and commutative products because *after the simplifications* each term in the sum will have *only* one operator for each site, and the operators for different sites commute anyway. singleBasis = {IdentityMatrix[2], sP, sM, sz}; singleBasisSymbols = {1 &, \!\( \*SubsuperscriptBox[\("\<S\>"\), \(#\), \("\<+\>"\)] &\), \!\( \*SubsuperscriptBox[\("\<S\>"\), \(#\), \("\<-\>"\)] &\), \!\( \*SubsuperscriptBox[\("\<S\>"\), \(#\), \("\<z\>"\)] &\)}; ClearAll[basis]; basis[n_] := basis[n] = LinearSolve@ Transpose[ Map[Flatten, KroneckerProduct @@ singleBasis[[#]] & /@ Tuples[Table[Range[1, 4], {n}]]]] names[indexList_List] := Times @@ MapIndexed[singleBasisSymbols[[#]][#2[[1]]] &, indexList] basisNames[n_] := names /@ Tuples[Table[Range[1, 4], {n}]] Clear[pauliReduce]; pauliReduce[matrix_?MatrixQ] := Module[{n = Log[2, Length[matrix]]}, Simplify[Total[basis[n][Flatten[matrix]] basisNames[n]]] ] Next, do some tests, among them some commutation relations. Then apply it to the commutator expression in the question: pauliReduce[sZ[3, 1].sMinus[3, 1]] > $-\frac{\text{S}_1^-}{2}$ pauliReduce[comm[sPlus[3, 1], sMinus[3, 1]]] > $2 \text{S}_1^{\text{z}}$ pauliReduce[comm[sPlus[3, 2], sMinus[3, 1]]] > $0$ pauliReduce[comm[a, b]] > $$-\frac{1}{2} (\Delta -1) \left(\text{S}_1^- \left(\text{S}_2^+ \text{S}_3^{\text{z}}-\text{S}_3^+ \text{S}_2^{\text{z}}\right)+\text{S}_1^+ \left(\text{S}_3^- \text{S}_2^{\text{z}}-\text{S}_2^- \text{S}_3^{\text{z}}\right)+2 \text{S}_1^{\text{z}} \left(\text{S}_3^- \text{S}_2^+-\text{S}_2^- \text{S}_3^+\right)\right)$$ This is the most reduced form in which the commutator expression can be written, and I didn't need to define any commutator algebra. The only price to pay is that the matrix space whose basis I have to keep track of becomes exponentially large with increasing number of sites, $N$. The benefit is that all the algebra is done as matrix manipulations and hence requires no additional thought per se. **Update: reducing memory consumption** For larger `n`, the exponential growth of the basis size makes the computation very memory hungry and slow. But this can be alleviated by a combination of two additional tricks: **First**, I use `SparseArray` in all the matrices. This means I had to rewrite all the definitions above. The explanations don't change, so I'll just list the modified definitions below. **Second**, I avoid the use of `LinearSolve` completely by using the orthogonality relation for the Pauli matrices, Table[2 Tr[ConjugateTranspose[#[[i]]].#[[j]]], {i, 1, 4}, {j, 1, 4}] &[ 1/2 PauliMatrix[{0, 1, 2, 3}]] // MatrixForm > $$\left( \begin{array}{cccc} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \\ \end{array} \right)$$ which in traditional form reads $2\text{Trace}(\sigma_i^{\dagger}\sigma_j) = \delta_{i,j}$. The `ConjugateTranspose` is needed to insure that the result is always non-negative in the vector space of the complex numbers, as required for a unitary scalar product. This means that the coefficient of any particular product of Pauli matrices in the complete expression can be obtained by a projection using this scalar product. As a result, the computation first determines the expansion in the Pauli matrices, not the ladder operators. Then, I add a function `ladderReduce` that substitutes the ladder operators $S_i^{\pm}$ for $\sigma_i^{x/y}$. {sx, sy, sz} = Map[SparseArray, 1/2 PauliMatrix[{1, 2, 3}]]; sP = sx + I sy; sM = sx - I sy; sZ[n_, j_] := KroneckerProduct @@ Insert[SparseArray@Table[IdentityMatrix[2], {n - 1}], sz, Mod[j, n, 1]] sPlus[n_, j_] := KroneckerProduct @@ Insert[SparseArray@Table[IdentityMatrix[2], {n - 1}], sP, Mod[j, n, 1]] sMinus[n_, j_] := KroneckerProduct @@ Insert[SparseArray@Table[IdentityMatrix[2], {n - 1}], sM, Mod[j, n, 1]] id[n_] := KroneckerProduct @@ SparseArray@Table[IdentityMatrix[2], {n}] singleBasis = {SparseArray[1/2 IdentityMatrix[2]], sx, sy, sz}; singleBasisSymbols = {1/2 &, Subsuperscript["σ", #, "x"] &, Subsuperscript["σ", #, "y"] &, Subsuperscript["σ", #, "z"] &}; ClearAll[basis]; basis[n_] := Function[{mat}, 2 Map[Tr[ConjugateTranspose[ Apply[KroneckerProduct, singleBasis[[#]]]].mat] &, Tuples[Table[Range[1, 4], {n}]]]] names[indexList_List] := Times @@ MapIndexed[singleBasisSymbols[[#]][#2[[1]]] &, indexList] basisNames[n_] := names /@ Tuples[Table[Range[1, 4], {n}]] Clear[pauliReduce]; pauliReduce[matrix_?MatrixQ] := Module[{n = Log[2, Length[matrix]]}, Simplify[Total[basis[n][matrix] basisNames[n]]] ] ladderReduce[pauli_] := Simplify[pauli /. {Subsuperscript["σ", i_, "x"] :> (Subsuperscript["S", i, "+"] + Subsuperscript["S", i, "-"]), Subsuperscript["σ", i_, "y"] :> 1/I (Subsuperscript["S", i, "+"] - Subsuperscript["S", i, "-"]), Subsuperscript["σ", i_, "z"] :> Subsuperscript["S", i, "z"]} ] This set of functions can now handle the example mentioned in the comment, where `n =7`: $Assumptions = Δ > 0; a = With[{n = 7}, Sum[j (Δ (sZ[n, j].sZ[n, j + 1] - 1/4 id[n]) + 1/2 (sPlus[n, j].sMinus[n, j + 1] + sMinus[n, j].sPlus[n, j + 1])), {j, 1, n}]]; b = With[{n = 7}, Sum[Δ (sZ[n, j].sZ[n, j + 1] - 1/4 id[n]) + 1/2 (sPlus[n, j].sMinus[n, j + 1] + sMinus[n, j].sPlus[n, j + 1]), {j, 1, n}]]; pauliExpression=pauliReduce[comm[a,b]] ![sigmas][1] The calculation takes a few seconds, but is much more efficient than before (with `n=7`, the first version of the code ran so long that I aborted it before it completed). Finally, convert this to the basis of ladder operators: ladderReduce[pauliExpression] ![ladder][2] [1]: https://i.sstatic.net/k41qa.png [2]: https://i.sstatic.net/hCZYf.png