Periodic XXZ chains¶
The anisotropy changes the equations and which quantum numbers belong to the supported real-root family. This guide starts with ground states, then builds up to excitation scans. Unlike XXX multiplet scans, XXZ states are labelled by magnetization Sz, not total spin S.
Model and supported regime¶
bethe-xxz-pbc is a separate periodic-chain front end for
The anisotropy is required. This periodic-chain implementation supports
ground states and magnetization-sector minima for every finite Delta>=0.
Even rings additionally support \(-1\lt \Delta \lt 0\) using rank-subtracted,
scaled equations. Negative-Delta odd rings are
deferred until needed;
their internal candidate solver is not exposed through this API or CLI.
They are explicitly rejected rather than assigned the wrong ground sector.
For \(0\le \Delta \le 1\) it also supports a restricted finite-real-root excitation
family, not the complete spectrum or strings. For open boundaries,
use the separate bethe-xxz-obc front end.
That free-end solver supports \(\Delta \gt -1\) ground states for either parity, including the
massive boundary root; its real-root excitation modes require \(0\le \Delta \le 1\).
Exactly Delta=-1 and lower anisotropies are not included. The
existing analytic thermodynamic bethe::xxz::spinon_energy retains its wider
\(-1 \lt \Delta \le 1\) domain; it is independent of this finite-size solver.
For zero-field infinite-chain curves, use the separate
bethe-xxz-dispersion: it supports Δ>-1, including
massive spinons, bulk energy and two-spinon continuum edges. This does not
extend the finite-ring excitation family described here.
A separate spin-helix library API constructs explicit eigenstates at commensurate couplings on either parity, including the isotropic endpoints. These are not general ground-state or excitation scans.
Ground states and sectors¶
bethe-xxz-pbc 64 --delta 0.5
bethe-xxz-pbc 65 --delta 0.5 --sz -1/2 --roots
bethe-xxz-pbc 16 --delta 0.75 --sectors --precision long-double
bethe-xxz-pbc 4 --delta 0 --format pretty
bethe-xxz-pbc 64 --delta 2 --roots
bethe-xxz-pbc 64 --delta -0.9 --roots
bethe-xxz-pbc 15 --delta 10 --sectors --precision long-double
# In a binary128-enabled build:
bethe-xxz-pbc 64 --delta 0.999999999999999999999999 --precision fp128
# With MPFR scalars enabled:
bethe-xxz-pbc 16 --delta -0.5 --precision digits-100
For ground-state and sector-minimum runs, --sz and --sectors work as in
the XXX programs. Precision, tolerance, update budgets, CPU time, roots,
and plain/pretty formatting use the shared controls.
Default precision is fp64. --sz and --sectors are mutually exclusive.
With neither ground-state selector, even N uses
Sz=0 and odd N returns one Sz=1/2 ground-state representative. Spin reversal
supplies negative sectors; the all-sector scan reuses those partners. At
generic anisotropy the states are labeled by Sz, not total spin S, and no
SU(2) multiplet degeneracies are inferred. --spin and --spinons are not
options of this front end; use --sz for excitation scans as described below.
Those scans have their own default sector, distinct from the ground-state default.
Arbitrary precision and composition¶
Both finite XXZ frontends accept --precision bits-N and digits-N in a
build with MPFR scalars.
This covers their existing ground states, sector minima, explicit real-root
states and excitation scans. Delta, tolerances, roots, energies, momentum and
diagnostics retain the requested precision, including zero-root states and
failed iterates. The negative-anisotropy Newton solver and massive open-chain
boundary-root solver use normal Uni20 LU dispatch, including CPU MPFR LU
when MPLAPACK is disabled.
The C++ interface requires finite precision in both the physical input and the controls. It rejects exact-only, unset or differently rounded input values; there is no ambient precision default:
using Real = uni20::mpreal;
auto precision = uni20::Precision::bits(256);
bethe::xxz::SolverOptions<Real> options(precision);
Real delta("0.5", precision);
auto state = bethe::xxz::ground_state(16, delta, options);
Increasing precision does not change the supported quantum-number window, add string states, or guarantee convergence within the iteration budget. The conservative near-infinity exclusion band uses epsilon at the requested precision. Only an exactly represented Delta=1 delegates to XXX; a nearby anisotropy remains an XXZ calculation. The same rule applies to Delta=0.
Excitation scans already use the shared bounded continuous scanner and accept
--threads N. Each state solve remains sequential. Independent ground-state
parameter/sector calculations can use
evaluate_observable_grid_async, capturing each input
and its options by value and waiting on the final operation result. Distinct
precisions can share a scheduler; the open-chain continuation steps within one
solve remain sequential. Sector scans reuse spin-reversed partners.
Regression tests compare 128-, 256- and 333-bit results with independent small Hamiltonians. The four-site periodic energy is \(E_0=-\Delta/2-\sqrt{\Delta^2/4+2}\). For four open sites, a separately evaluated three-dimensional Hamiltonian block supplies a 512-bit reference. These checks cover negative, gapless and massive coordinates, resolve energy shifts from anisotropies within \(10^{-60}\) of zero or one, and test accuracy growth beyond binary128. They establish these tested cases, not an accuracy guarantee at arbitrary length or near a singular branch endpoint.
Ground-state coordinates¶
For negative Delta, the CLI reports the scaled residual convention explicitly
and --roots prints both z and the native hyperbolic lambda. For even rings,
the ground-sector labels are symmetric and total momentum is pi for odd M,
zero for even M, with \(M =N /2-\lvert S^z \rvert\). The smallest-|Sz| ground-state rule is
not applied to negative-Delta odd rings: there the global minimum can
instead be polarized, and conjugate root pairs require a different representation.
Library usage¶
Library usage stays in the same bethe::bethe target:
#include <bethe/xxz.hpp>
auto gs = bethe::xxz::ground_state<long double>(64, 0.5L);
auto sector = bethe::xxz::sector_ground_state<long double>(65, 0.5L,
uni20::half_int::parse("-1/2"));
auto sectors = bethe::xxz::sector_ground_states<long double>(16, 0.75L);
bethe::xxz::SolverOptions<long double> options{.max_iterations = 20000};
auto precise = bethe::xxz::ground_state<long double>(64, 0.99L, options);
auto negative = bethe::xxz::ground_state<long double>(64, -0.9L, options);
Ground-state functions now return xxz::GroundState<Real> (or a vector of
it), distinct from xxz::RealState<Real> used by solve_real and excitation
scans. Both retain \(\delta\), scaled roots, Bethe quantum numbers, Sz,
spin-reversal flag, energy, momentum/index, and convergence diagnostics.
Ground results additionally retain log_rapidities for negative Delta,
GroundSolveStatus (converged, iteration limit, or stalled), and a
GroundResidualConvention tag (logarithmic_phase or negative_rank_scaled).
Do not reconstruct lambda from rounded z values. Nonnegative ground-state
results preserve all numerical values of the previous solver; their lambda
array is empty. There is no implicit conversion between ground results
and real excitation states. Code naming the old ground return type should
use GroundState or auto and inspect the residual convention.
The common iteration
options live in <bethe/solver.hpp> as bethe::SolverOptions<Real>; the
model-namespace aliases remain available. Numerical code has no CLI or
presentation dependency.
Scaled rapidities and Bethe equations¶
For \(0 \le \Delta \lt 1\), define \(\gamma =\arccos (\Delta)\) and store \(z =\tanh (\lambda)/\tan (\gamma /2)\), not the conventional rapidity lambda. The output labels this coordinate as scaled rapidity z. Its real branch has \((1-\Delta)\,z ^{2} \lt 1+\Delta\). In this coordinate the equations and energy are
The sector minimum has \(M =N /2-\lvert S^z \rvert\) roots and consecutive labels
I_i=i-(M-1)/2-(N mod 2)/2, with zero-based i. For odd N this selects the
reflection-related minimum with labels centered at -1/2. Momentum indices
are calculated with integer arithmetic. These ground-state labels do not
constitute an admissibility rule for XXZ excited states; the excitation window
is defined below.
This rational form is algebraically equivalent to the logarithmic hyperbolic Bethe equations, but avoids cancellation in expressions such as \(\cosh (2\,\lambda)-\Delta\) near Delta=1. At Delta=0 scattering vanishes and the free-fermion solution takes at most one update. At exactly Delta=1 the solver delegates to the existing XXX sector solver and returns its coordinate \(z =2\,\lambda_{\mathrm{XXX}}\); nearby anisotropies are not snapped to the endpoint. All calculations and parameter parsing use the selected real precision.
Easy-axis ground states: Delta>1¶
The massive regime has a different real-rapidity contour. Set \(\Delta =\cosh (\eta)\) and store \(z =\tan (\lambda)/\tanh (\eta /2)\), where \(-\pi /2\lt \lambda \lt \pi /2\). This z again tends to \(2\,\lambda_{\mathrm{XXX}}\) as Delta approaches one. Unlike the massless contour, it has no finite bound on z. The CLI continues to label the stored variable scaled rapidity z, not lambda.
The trigonometric Bethe equations are Eq. (1.2) of Dugave et al. at zero twist. Their Hamiltonian uses Pauli matrices; our spin-1/2 energy is one quarter of their J=1 energy at zero field. Algebraically, define the continuous real scattering phase
The same consecutive ground-state labels and momentum formula above apply. In conventional lambda coordinates, \(2\,\phi_{\mathrm{ij}}\) is the continuous lift of \(2\,\arctan (\tan (\lambda_{i} -\lambda_{j})/\tanh (\eta))\). Keeping the atan2 quadrant matters: root differences can exceed pi/2, so replacing it by a principal atan yields the wrong logarithmic branch. Dividing both atan2 arguments by Delta and collecting the explicit anisotropy term in E avoids avoidable large-Delta overflow. Nonrepresentable final energies remain errors.
All ground_state, sector_ground_state, and sector_ground_states entry
points support this regime, including odd N and spin-reversed sectors.
General solve_real, real_quantum_number_window, and excitation APIs still
reject Delta>1: validating a sector minimum does not classify excited labels.
The same restriction applies to --quantum-numbers and --excitations.
No strings, thermodynamic mode, or spontaneous-symmetry-broken state is implied.
Convergence and validation¶
For nonnegative Delta, convergence uses \(\max \lvert F \rvert /N\) with the same default 32-epsilon tolerance as XXX,
not an energy-error bound. Both residual and energy describe the returned
iterate, including on budget exhaustion. The solver starts at zero roots
and performs simultaneous updates. It uses O(M^2) work per sweep (O(M) at
Delta=0) and O(M) state storage; retaining every sector uses O(N^2) storage.
Invalid inputs throw std::invalid_argument; nonfinite arithmetic or leaving
the finite real-root branch throws std::runtime_error. CLI exit statuses
remain 0 for convergence, 2 for an unconverged result, and 1 for errors.
For \(-1\lt \Delta \lt 0\) on even rings, Newton solves the rank-subtracted equations
in lambda, scaled by \(s =\sqrt{(1+\Delta)/(1-\Delta)}\) to remain discriminating
near Delta=-1. The residual tag is negative_rank_scaled, meaning the
equations in the negative-anisotropy guide, not \(\max \lvert F \rvert /N\).
That guide derives the equations from Kozlowski,
whose periodic ground-state identification explicitly assumes even length.
This path starts from a free-fermion hyperbolic seed, uses O(M^2) workspace
and O(M^3) work per Newton update, and counts accepted updates against the
shared iteration budget. A stalled line search is distinguished from budget
exhaustion in the result and both CLI formats. Energy and residual always
refer to the returned coordinates at the requested Delta, even on failure.
Normalization checks include \(E_0 (N =2)=-1-\Delta /2\) (the periodic bond is
counted twice), \(E_0 (N =3)=-1/2-\Delta /4\), and
\(E_0 (N =4)=-(\Delta +\sqrt{\Delta ^{2}+8})/2\). Tests compare every sector minimum and
its momentum against independent bit-basis exact diagonalization through
N=9, verify the XX free-fermion and exact XXX limits, independently evaluate
the hyperbolic equations, and exercise native long-double/fp128 precision,
near-endpoint anisotropies, spin reversal, larger chains, and CLI formatting.
For Delta>1 the suite additionally checks the original complex trigonometric
equations (independent of atan2), including a state whose scattering phase
crosses the principal-atan boundary. Sector ED includes Delta=1.01,2,10;
larger systems through N=128 and native-precision approach to XXX are tested.
As Delta tends to infinity, the roots approach
lambda_j=pi*(I_j-sum(I)/N)/(N-M) and \(E /\Delta \to N /4-M\).
Tests check this limit in odd/even sectors and exercise finite answers near
the largest representable anisotropy, as well as explicit overflow errors.
Negative-Delta API tests compare every even-ring sector through N=8 with independent spin-basis energies and joint energy/translation spectra. Native two-/four-site formulas, both endpoints, spin reversal, failed iterates, and chains through N=64 are checked in all supported precisions. CLI tests preserve z/lambda digits in wide and narrow reports. Separate tests ensure the new ground result preserves nonnegative solver values exactly and cannot be implicitly converted to an excitation state. Negative excitation labels and negative odd-ring ground calls remain rejected, including vacua/scans.
Real-root excitations¶
This section applies only to \(0\le \Delta \le 1\).
bethe-xxz-pbc 64 --delta 0.5 --excitations 10
bethe-xxz-pbc 16 --delta 0.75 --sz -1 --excitations all --roots
bethe-xxz-pbc 8 --delta 0.5 --sz 2 --excitations all --max-candidates 100
bethe-xxz-pbc 8 --delta 0.5 --quantum-numbers -3/2,1/2
--excitations COUNT|all scans the entire supported quantum-number family,
retaining the lowest COUNT converged states or all of them. The sector minimum
is included. Without --sz, the excitation default is Sz=1 for even N and
Sz=1/2 for odd N. Negative Sz uses spin reversal with unchanged energy and
momentum. The reported gap is E-E0 relative to the global ground state,
not the minimum of the selected sector. Distinct degenerate states are kept.
--max-candidates defaults to 10000 and is checked before either a ground
solve or candidate allocation. all does not bypass it. Counting is
overflow-checked; limiting the returned count reduces retained storage, not
the number of solves. Failed candidates are excluded from ranking but counted
and reported, and make the ordering incomplete. If the ground solve fails,
valid candidate energies remain available but their gaps are unavailable.
Either failure gives exit status 2.
The anisotropy-dependent window¶
For M=N/2-|Sz|, use distinct sorted quantum numbers of parity
2*I == N-M-1 (mod 2). The supported family is the intersection
The second bound follows by sending one conventional rapidity to infinity while the others remain finite in the logarithmic equations. The code uses the equivalent \(2\,I_{\mathrm{infinity}} = N /2 + (N -2\,M +2)\,\arcsin (\Delta)/\pi\), evaluated in the selected precision. For 0<Delta<1, labels within a conservative \(32\,\epsilon \,\max (1,2\,I_{\mathrm{infinity}})\) band below this doubled bound are also excluded to keep marginal infinite roots out of the finite branch. Delta=0 uses exact integer comparisons; Delta=1 uses the existing XXX window exactly.
This is an explicitly restricted family, not a complete Sz spectrum or a
classification of every real solution. It excludes complex/string roots,
infinite rapidities, and at Delta=1 the SU(2) descendants. At Delta=0 it still
enumerates only the finite-real-rapidity subset, not the full free-fermion
spectrum. Family sizes can change with anisotropy as roots reach infinity.
For example, N=8, Sz=2 has 6 candidates at Delta=1/2 and 15 at Delta=1.
Even N at Sz=0 has only the single ground configuration in this family;
requesting all cannot produce excited states there.
Reports and specified states¶
The report displays the selected window, candidate/convergence counts,
Sz, momentum, energy, gap, and quantum numbers. --quantum-numbers solves one
explicit configuration in the same window, with M inferred from the list and
Sz=N/2-M; use none for the vacuum. It cannot be combined with --sz,
--sectors, or --excitations. Excitation scans likewise cannot be combined
with --sectors.
Excitation API¶
#include <bethe/xxz_excitations.hpp>
auto scan = bethe::xxz::real_excitations<long double>(
64, 0.5L, uni20::half_int{1}, {.count = 10, .max_candidates = 10000});
auto count = bethe::xxz::real_excitation_count(64, 0.5L, uni20::half_int{1});
auto window = bethe::xxz::real_quantum_number_window(64, 0.5L, uni20::half_int{1});
bethe::xxz::QuantumNumbers numbers{uni20::half_int::parse("-3/2"),
uni20::half_int::parse("1/2")};
auto state = bethe::xxz::solve_real<long double>(8, 0.5L, numbers);
solve_real also accepts solver options and an optional initial-root span in
the same scaled coordinate. Excitation enumeration, bounded energy ranking,
and convergence bookkeeping are shared with XXX; the anisotropy-dependent
window and state interpretation remain in the XXZ module. Retained scan
storage is O(min(COUNT,candidates)*M+N), including the ground reference.
Tests check every returned energy and momentum with ED multiplicities through
N=9, independently enumerate the window at Delta=0,1/2,1, test both sides of
an infinity threshold, and verify native-precision gaps and exact XXX matching.
Related: XXX conventions, analytic spinon dispersions, and References and provenance.