2.6 KiB
| title | author | published | references | ||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Computing the Wigner 9j Symbols Efficiently | Thomas (Tom) C. Gorordo | false |
|
As a test post, here's a transcription of some notes I have laying around from writing an add9j PR
for Jutho/WignerSymbols.jl.
Wigner Symbols Formulae
The Wigner 3x\text{j} symbols are all exactly representable in the form
W_{3x} = \frac{n\sqrt{s}}{q}\hspace{1cm} n,s,q\in\mathbb{Z}
So, if one can use exact integer arithmetic in computing the three components, a computer implementation of the symbols should be able to incur at-worst typical floating point root and ratio errors.
This requires the usage of formulae that are amenible to such integer manipulations.
3j Formula
Let \delta(j_1, j_2, j_3) = (j_1 \leq j_2 + j_3)\bigwedge (j_2 \leq j_1 + j_3)\bigwedge (j_3 \leq j_1 + j_2)\bigwedge(j_1 + j_2 + j_3\in\mathbb{Z})
for j_i\in\frac{1}{2}\mathbb{Z} a half-integer be called the "triangle condition". If not satisfied, a symbol is zero.
The 3j symbol can be computed according to:
6j Formula
The 6j symbol, similarly, can be computed as:
Define the Wei square brackets purely in terms of binomial coefficients by
9j Formula
The 9j formula has a few additional pieces.
One might have some fun manipulating some of these forms using the tricks in [@GrahamKnuthPatashnik1994ConcreteMathematics2e].
Calculation and Tabulation
For fast, exact evaluation, the main integer-arithmetic idea is to simplify the evaluation of the various sums of ratios of (potentially large) factorials by using prime factorizations of those factorials to reduce ratios by an LCD ad extract common factors across the sums. Remaining arithmetic can be done via a big integer implementation.
The core of this approach uses that prime factorizations of factorials are conveniently obtained recursively (and thus, to tabulate). The crux is:
Euclid's Lemma
If
p | abfor primep, thenp|aorp|b.
\impliesIf primep|n!thenp|kfork\leq none of the factors.
More specifically, Legendre's Theorem says:
\sharp_p(n!) = \sum_{k=1} \sharp_p(k) = \sum_{k=1}^{\lfloor\log_p(n)\rfloor} \lfloor\frac{n}{p^k}\rfloor
where \sharp_p(k) gives the number of times p divides k.