3. Coupling and Recoupling Coefficients

3.1. Selection Rules First

Angular-momentum coefficients are sparse. Before evaluating a large table, it is often clearer to construct only admissible labels with triangle_condition, allowed_couplings, and allowed_projections. Direct numerical calls remain safe for forbidden tuples and return zero.

3.2. Wigner 3j and Clebsch-Gordan

wigner_3j accepts either six doubled integers or wigner_3j_args. The value vanishes unless every (j,m) pair is valid, the three angular momenta satisfy the triangle condition, and \(m_1+m_2+m_3=0\).

const wigner::wigner_3j_args args{
    1, 1, 0,
    1, -1, 0
};
const double symbol = wigner::wigner_3j(args);

clebsch_gordan is evaluated from the same 3j implementation and phase convention. Use it when the coupled-state interpretation is more natural than the symmetric 3j notation:

const double cg = wigner::clebsch_gordan(
    1, 1,       // j1=1/2, m1=1/2
    1, -1,      // j2=1/2, m2=-1/2
    0, 0);      // J=0, M=0

3.3. Wigner 6j, Racah-W, and Recoupling

wigner_6j describes a change in the order used to couple three angular momenta. It accepts positional values or wigner_6j_args. The four triangle conditions represented by the tetrahedral arrangement are enforced by the evaluator.

racah_w supplies the corresponding Racah notation with the phase fixed in Conventions. For basis transformations, the higher-level functions are usually more readable:

  • recoupling_12_23 transforms the (12)3 scheme to 1(23);

  • recoupling_12_13 transforms the (12)3 scheme to (13)2;

  • recoupling_13_23 transforms the (13)2 scheme to 1(23); and

  • recoupling is the established alias for recoupling_12_23.

For example:

const double change_of_basis = wigner::recoupling_12_23(
    two_j1, two_j2, two_j12,
    two_j3, two_J, two_j23);

These functions include the square-root dimension factors and phase. Do not multiply them by an additional Racah normalization.

3.4. Wigner 9j

wigner_9j represents recoupling between four-angular-momentum schemes and is arranged as

\[\begin{split}\left\{\begin{matrix} a&b&c\\d&e&f\\g&h&i \end{matrix}\right\}.\end{split}\]

The named struct is particularly useful here:

const wigner::wigner_9j_args args{
    two_a, two_b, two_c,
    two_d, two_e, two_f,
    two_g, two_h, two_i
};
const double value = wigner::wigner_9j(args);

3.5. Wigner 12j

The package includes first- and second-kind 12j symbols through wigner_12j_first and wigner_12j_second. Both use ring-ordered argument structs so the twelve entries cannot be mistaken for an undocumented positional convention.

These implementations have selection-rule, symmetry, and internal factorization tests. Their current validation is less extensive than for the 3j, 6j, and 9j families. Consult Numerical Design and Validation before using them outside low-angular-momentum exploratory work.

3.6. Triangle Coefficient

triangle_coefficient evaluates

\[\Delta(a,b,c)=\sqrt{ \frac{(a+b-c)!(a-b+c)!(-a+b+c)!} {(a+b+c+1)!}}\]

and returns zero when the triple is not admissible. It is exposed because it is useful in direct formula checks and in algorithms built from the same normalization as the Wigner-symbol backend.

3.7. Choosing an Interface

Use direct symbols when implementing an equation written in 3nj notation. Use Clebsch-Gordan or recoupling functions when code represents a physical basis transformation. This keeps dimension factors and phases in one tested place and makes the intended coupling scheme visible to readers.