12. Gauge-Anomaly Cancellation

Note

Like 11. Suggesting Invariant Terms, this is a model-building check that sits beside the declaration stage rather than inside the Feynman-rule pipeline: given only the fermion representations, it decides whether the gauge theory is even quantum-mechanically consistent — before any Lagrangian is written.

Physics statement

A chiral gauge theory is consistent only if its triangle anomalies cancel. Each anomaly is a sum over the (Weyl) fermion content of a group-theory factor times the fermions’ charges; if any sum fails to vanish the gauge current is not conserved at the quantum level and the theory is inconsistent. For a new U(1) — a \(Z'\), gauged \(B-L\), a flavour symmetry — anomaly cancellation is the first non-trivial constraint on the allowed charge assignment, and with a symbolic charge it becomes a set of polynomial equations to solve.

feynlag.anomalies computes every coefficient symbolically straight from the representations already declared for a Model, so it works hand-in-hand with the symbolic-charge models the rest of the library supports (e.g. examples/sm_u1x.py’s \(X=aY+b(B-L)\)).

Conventions

Everything is reduced to left-handed Weyl fermions. A field declared chirality='R' is the conjugate of a left-handed field, so in the reduction all its U(1) charges flip sign and every non-abelian representation goes to its conjugate. The Dynkin index \(T(R)=T(\bar R)\) is conjugation-invariant, so only the cubic \([SU(N)]^3\) anomaly (\(A(\bar R)=-A(R)\)) and the charge signs feel the flip.

Coefficients

For non-abelian groups \(G\) (with Dynkin index \(T\) and cubic index \(A\)) and abelian factors \(U(1)_a\), over all left-reduced fermions with total multiplicity \(M\) (flavours × product of representation dimensions):

Anomaly

Coefficient

\([U(1)_a][U(1)_b][U(1)_c]\)

\(\sum M\, q_a q_b q_c\)

\(\mathrm{grav}^2\text{–}U(1)_a\)

\(\sum M\, q_a\)

\([G]^2\text{–}U(1)_a\)

\(\sum (M/\dim G)\, T(R_G)\, q_a\)

\([G]^3\)

\(\sum (M/\dim G)\, \mathrm{sign}\, A(R_G)\)

Witten–\(G\) (SU(2) only)

number of doublets (must be even)

The Dynkin index is computed generically from the generators as \(T(R)=\frac{1}{\dim G}\sum_a \mathrm{Tr}(T^a T^a)\); the cubic index is non-zero only for a complex representation — among the supported reps that is the SU(3) fundamental (\(A(\mathbf 3)=1\)).

Usage

from feynlag import Model, check_anomaly_free, anomaly_coefficients

model = Model("SM_BL", gauge_groups=[SU3c, SU2L, U1Y, U1BL], fields=fermions)

report = check_anomaly_free(model)     # AnomalyReport
report.ok                              # True for the SM + 3 nuR
report.nonzero                         # {} — nothing failed

coeffs = anomaly_coefficients(model)   # {name: symbolic coefficient}
coeffs["[U1BL][U1BL][U1BL]"]           # 0  (cancels only once nuR is added)

With a symbolic charge the coefficient is a polynomial constraint: coeffs["[U1X][U1X][U1X]"] for a single right-handed field of charge \(x\) is \(-x^3\), i.e. the anomaly-free condition is a genuine equation in \(x\) rather than a number. This is the ingredient for solving for anomaly-free \(Z'\) charge assignments symbolically.

Verification

tests/test_anomalies.py pins the textbook results: the Standard Model with three right-handed neutrinos is anomaly-free under \(SU(3)_c\times SU(2)_L\times U(1)_Y\times U(1)_{B-L}\); every individual coefficient (including the mixed \([SU(N)]^2\)–U(1) and the colour cubic) vanishes exactly; dropping \(\nu_R\) leaves \([U(1)_{B-L}]^3\neq 0\); and a mistuned hypercharge breaks cancellation.