feynlag.vacuum.diagonalize

Rotations from the weak basis to the physical (mass) basis.

  • Rotation: holds new = R · old, produces the substitution dict old → Rᵀ·new for rewriting the Lagrangian, and verifies that it actually diagonalizes a given mass matrix (the tan-2θ verification rule of CONVENTIONS.md is enforced by construction here: angles come from the off-diagonal condition, and Rotation.check() re-verifies).

  • 2×2 analytic orthogonal diagonalization (the BSM workhorse).

  • Larger symbolic matrices: use a rotation_2x2()-style user ansatz and solve_mixing_angle_2x2 per block, or numeric diagonalization at export time — never rely on symbolic eigenvects for >2×2 (see plan risks).

SVD (Dirac) and Takagi (Majorana) arrive with the fermion sector (Phase 4).

Functions

diagonalize_orthogonal_2x2(M, old_fields, ...)

Diagonalize a real symmetric 2×2 mass matrix.

diagonalize_svd(M, left_fields, ...)

Singular-value decomposition for a Dirac mass matrix.

diagonalize_svd_2x2(M, left_fields, ...[, ...])

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

diagonalize_takagi(M[, old_fields, new_fields])

Takagi factorization of a (real) symmetric Majorana mass matrix.

rotation_2x2(theta)

R(θ) = [[cosθ, sinθ], [−sinθ, cosθ]] — new₁ = cθ old₁ + sθ old₂, new₂ = −sθ old₁ + cθ old₂.

solve_mixing_angle_2x2(M[, positive_denominator])

Mixing angle of a real symmetric 2×2 matrix from the off-diagonal condition (R M Rᵀ)₁₂ = 0: tan 2θ = 2 M₁₂ / (M₁₁ − M₂₂).

Classes

MajoranaRotation(U, nuL, nuR, nuLbar, ...)

Rotate weak-basis neutrinos to physical Majorana mass eigenstates.

Rotation(old_fields, new_fields, matrix[, kind])

A change of basis new = R · old.