feynlag.vacuum.diagonalize.diagonalize_svd_2x2

feynlag.vacuum.diagonalize.diagonalize_svd_2x2(M, left_fields, right_fields, new_left, new_right, angle_left=None, angle_right=None)[source]

Analytic biunitary SVD of a real 2×2 Dirac mass matrix.

θ_L diagonalizes M·Mᵀ via diagonalize_orthogonal_2x2() — the clean symbolic route (diagonalize_svd’s Matrix.diagonalize(normalize=True) path returns unusable nested-sqrt/Abs forms for symbolic entries). θ_R is then derived from θ_L and M directly (N = R(θ_L)·M; since N·Nᵀ is diagonal by construction, N’s rows are automatically orthogonal, so θ_R = atan(N[0,1]/N[0,0]) biunitarily pairs with θ_L by construction) rather than solved independently from Mᵀ·M: solving the two angles independently only fixes each up to its own sign/eigenvector-ordering convention, and those two conventions can disagree — for a generic (non-symmetric) M this silently produces an anti-diagonal (row-swapped) U_L·M·U_Rᵀ for roughly half of parameter space, not merely a sign flip. Deriving θ_R from θ_L guarantees U_L·M·U_Rᵀ is exactly diagonal always (the off-diagonal vanishing is an algebraic identity, not dependent on the sign pattern of M’s entries) — verified in tests/test_fermion_sector.py/tests/test_vll.py both symbolically and at random numeric points per CONVENTIONS.md.

Parameters:
  • M – real 2×2 mass matrix (rows = bar/left legs, cols = right legs).

  • right_fields (left_fields /) – 2 weak-basis symbols each.

  • new_right (new_left /) – 2 physical-basis symbols each.

  • angle_right (angle_left /) – optional angle symbols; if given, the rotations carry them with the defining tan 2θ relation attached (.angle_relation / .angle_solution).

Returns:

(rot_left, rot_right) Rotation objects.