Show the SymPy code
import sympy as sp
from sympy import symbols, Matrix, simplify, factor, trace, expand
from IPython.display import display, Math
# --- Symbols ----------------------------------------------------------------
# We use real variables for each complex field and its conjugate.
phi10, phi10c = symbols('phi10 phi10c', real=True) # phi_1^0, phi_1^{0*}
phi20, phi20c = symbols('phi20 phi20c', real=True) # phi_2^0, phi_2^{0*}
phi1m, phi1mc = symbols('phi1m phi1mc', real=True) # phi_1^-, phi_1^+
phi2m, phi2mc = symbols('phi2m phi2mc', real=True) # phi_2^-, phi_2^+
chiL, chiLc = symbols('chiL chiLc', real=True) # chi_L^+, chi_L^-
chiR, chiRc = symbols('chiR chiRc', real=True) # chi_R^+, chi_R^-
chiLn, chiLnc = symbols('chiLn chiLnc', real=True) # chi_L^0, chi_L^{0*}
chiRn, chiRnc = symbols('chiRn chiRnc', real=True) # chi_R^0, chi_R^{0*}
mu1sq, mu2sq = symbols('{{\\mu_{1}^2}} {{\\mu_{2}^2}}', positive=True)
lam1, lam2, lam3, lam4, lam5, lam6 = symbols('lambda_1 lambda_2 lambda_3 lambda_4 lambda_5 lambda_6', real=True)
rho1, rho2 = symbols('rho1 rho2', real=True)
alpha1, alpha2, alpha3 = symbols('alpha1 alpha2 alpha3', real=True)
k1, k2, vL, vR = symbols('k_1 k_2 v_L v_R', positive=True)
# --- Bidoublet and doublet matrices -----------------------------------------
# Phi = [phi_1, i*sigma2*phi_2^*]
Phi = Matrix([
[phi10, phi2mc],
[phi1m, -phi20c]
])
Phi_dag = Matrix([
[phi10c, phi1mc],
[phi2m, -phi20]
])
I = sp.I
sigma2 = Matrix([[0, -I], [I, 0]])
Phi_star = Matrix([[phi10c, phi2m], [phi1mc, -phi20]])
tilde_Phi = sigma2 * Phi_star * sigma2
tilde_Phi_dag = sigma2 * Phi.T * sigma2
chi_L = Matrix([[chiL], [chiLn]])
chi_L_dag = Matrix([[chiLc, chiLnc]])
chi_R = Matrix([[chiR], [chiRn]])
chi_R_dag = Matrix([[chiRc, chiRnc]])
# --- Scalar potential ---------------------------------------------------------
V_Phi = (
-mu1sq * trace(Phi_dag * Phi)
+ lam1 * trace(Phi_dag * Phi)**2
+ lam2 * trace(Phi_dag * Phi * Phi_dag * Phi)
+ sp.Rational(1,2) * lam3 * (trace(Phi_dag * tilde_Phi) + trace(tilde_Phi_dag * Phi))**2
+ sp.Rational(1,2) * lam4 * (trace(Phi_dag * tilde_Phi) - trace(tilde_Phi_dag * Phi))**2
+ lam5 * trace(Phi_dag * Phi * tilde_Phi_dag * tilde_Phi)
+ sp.Rational(1,2) * lam6 * (trace(Phi_dag * tilde_Phi * Phi_dag * tilde_Phi)
+ trace(tilde_Phi_dag * Phi * tilde_Phi_dag * Phi))
)
V_chi = (
-mu2sq * (chi_L_dag.dot(chi_L) + chi_R_dag.dot(chi_R))
+ rho1 * (chi_L_dag.dot(chi_L)**2 + chi_R_dag.dot(chi_R)**2)
+ rho2 * (chi_L_dag.dot(chi_L)) * (chi_R_dag.dot(chi_R))
)
V_Phi_chi = (
alpha1 * trace(Phi_dag * Phi) * (chi_L_dag.dot(chi_L) + chi_R_dag.dot(chi_R))
+ alpha2 * (chi_L_dag * Phi * Phi_dag * chi_L + chi_R_dag * Phi_dag * Phi * chi_R)[0]
+ alpha3 * (chi_L_dag * tilde_Phi * tilde_Phi_dag * chi_L
+ chi_R_dag * tilde_Phi_dag * tilde_Phi * chi_R)[0]
)
V = expand(V_Phi + V_chi + V_Phi_chi)
# --- Tadpole: verification against Eq. (9) of the paper ---------------------
VEV_all = {
phi10: k1, phi10c: k1, phi20: k2, phi20c: k2,
phi1m: 0, phi1mc: 0, phi2m: 0, phi2mc: 0,
chiL: 0, chiLc: 0, chiR: 0, chiRc: 0,
chiLn: vL, chiLnc: vL, chiRn: vR, chiRnc: vR
}
V0 = V.subs(VEV_all)
lam12 = lam1 + lam2
lam1356 = lam1 + 4*lam3 + lam5 + lam6
alpha12 = alpha1 + alpha2
alpha13 = alpha1 + alpha3
paper_tadpoles = {
'k1': 2*k1*(-mu1sq + 2*k1**2*lam12 + 2*k2**2*lam1356 + (vL**2 + vR**2)*alpha13),
'k2': 2*k2*(-mu1sq + 2*k1**2*lam1356 + 2*k2**2*lam12 + (vL**2 + vR**2)*alpha12),
'vL': 2*vL*(-mu2sq + 2*rho1*vL**2 + rho2*vR**2 + k1**2*alpha13 + k2**2*alpha12),
'vR': 2*vR*(-mu2sq + 2*rho1*vR**2 + rho2*vL**2 + k1**2*alpha13 + k2**2*alpha12),
}
tadpoles = {
'k1': sp.diff(V0, k1),
'k2': sp.diff(V0, k2),
'vL': sp.diff(V0, vL),
'vR': sp.diff(V0, vR),
}
for key in tadpoles:
diff = simplify(tadpoles[key] - paper_tadpoles[key])
assert diff == 0, f"Tadpole {key} does not match the literature: {diff}"
print("✓ Tadpole conditions: match Eq. (9) of Zeleny-Mora et al. (2026)\n")
for label, key in [(r"k_1", "k1"), (r"k_2", "k2"), (r"v_L", "vL"), (r"v_R", "vR")]:
display(Math(rf"\frac{{\partial V}}{{\partial {label}}} = " + sp.latex(factor(tadpoles[key]))))
# --- Solve for mu1^2 and mu2^2 in the vL = k2 = 0 limit ----------------------
mu1sq_sol = sp.solve(sp.Eq(tadpoles['k1'].subs({k2:0, vL:0}), 0), mu1sq)[0]
mu2sq_sol = sp.solve(sp.Eq(tadpoles['vR'].subs({k2:0, vL:0}), 0), mu2sq)[0]
assert simplify(mu1sq_sol - (2*k1**2*lam12 + vR**2*alpha13)) == 0
assert simplify(mu2sq_sol - (2*rho1*vR**2 + k1**2*alpha13)) == 0
print("✓ Mass parameters in the $v_L = k_2 = 0$ limit:\n")
display(Math(r"\mu_1^2 = " + sp.latex(mu1sq_sol)))
display(Math(r"\mu_2^2 = " + sp.latex(mu2sq_sol)))
# --- Charged scalar mass matrix ---------------------------------------------
# Basis c+ = (phi2+, chiL+, phi1+, chiR+)
# Mapping: phi2+ = phi2mc, chiL+ = chiL, phi1+ = phi1mc, chiR+ = chiR
c_plus = [phi2mc, chiL, phi1mc, chiR]
c_minus = [phi2m, chiLc, phi1m, chiRc]
M_charged = Matrix([[sp.diff(V, c_plus[i], c_minus[j]) for j in range(4)] for i in range(4)])
VEV_charged = {
phi10: k1, phi10c: k1, phi20: 0, phi20c: 0,
phi1m: 0, phi1mc: 0, phi2m: 0, phi2mc: 0,
chiL: 0, chiLc: 0, chiR: 0, chiRc: 0,
chiLn: 0, chiLnc: 0, chiRn: vR, chiRnc: vR
}
M_charged = M_charged.subs(VEV_charged).subs({mu1sq: mu1sq_sol, mu2sq: mu2sq_sol})
M_charged = simplify(M_charged)
print("\nCharged scalar mass matrix (basis $c^+ = (\\phi_2^+, \\chi_L^+, \\phi_1^+, \\chi_R^+)$):")
display(Math(r"M_+^2 = " + sp.latex(M_charged)))
# --- Physical verification: masses and Goldstones ---------------------------
alpha23 = alpha2 - alpha3
rho21 = rho2 - 2*rho1
# Physical masses expected from Eq. (13)
mH1_sq = k1**2*alpha23 + vR**2*rho21
mH2_sq = alpha23*(k1**2 + vR**2)
# Physical verification: two Goldstones and two correct physical masses.
# The characteristic polynomial must be lambda^2 * (lambda - mH1^2) * (lambda - mH2^2).
# This is more robust than counting zero eigenvalues symbolically,
# because SymPy may return a complicated expression that simplifies to zero.
lam = symbols('lam')
char_poly = M_charged.charpoly(lam).as_expr()
expected_poly = lam**2 * (lam - mH1_sq) * (lam - mH2_sq)
assert simplify(expand(char_poly - expected_poly)) == 0
print("\n✓ Characteristic polynomial: $\\lambda^2 (\\lambda - m^2_{H_L})(\\lambda - m^2_{H_R})$")
print(" → two zero eigenvalues (Goldstones) and two physical masses\n")
print("Physical charged masses:")
display(Math(r"m^2_{H_L^\pm} = " + sp.latex(mH1_sq)))
display(Math(r"m^2_{H_R^\pm} = " + sp.latex(mH2_sq)))✓ Tadpole conditions: match Eq. (9) of Zeleny-Mora et al. (2026)
\(\displaystyle \frac{\partial V}{\partial k_1} = 2 k_{1} \left(\alpha_{1} v_{L}^{2} + \alpha_{1} v_{R}^{2} + \alpha_{3} v_{L}^{2} + \alpha_{3} v_{R}^{2} + 2 k_{1}^{2} \lambda_{1} + 2 k_{1}^{2} \lambda_{2} + 2 k_{2}^{2} \lambda_{1} + 8 k_{2}^{2} \lambda_{3} + 2 k_{2}^{2} \lambda_{5} + 2 k_{2}^{2} \lambda_{6} - {{\mu_{1}^2}}\right)\)
\(\displaystyle \frac{\partial V}{\partial k_2} = 2 k_{2} \left(\alpha_{1} v_{L}^{2} + \alpha_{1} v_{R}^{2} + \alpha_{2} v_{L}^{2} + \alpha_{2} v_{R}^{2} + 2 k_{1}^{2} \lambda_{1} + 8 k_{1}^{2} \lambda_{3} + 2 k_{1}^{2} \lambda_{5} + 2 k_{1}^{2} \lambda_{6} + 2 k_{2}^{2} \lambda_{1} + 2 k_{2}^{2} \lambda_{2} - {{\mu_{1}^2}}\right)\)
\(\displaystyle \frac{\partial V}{\partial v_L} = 2 v_{L} \left(\alpha_{1} k_{1}^{2} + \alpha_{1} k_{2}^{2} + \alpha_{2} k_{2}^{2} + \alpha_{3} k_{1}^{2} + 2 \rho_{1} v_{L}^{2} + \rho_{2} v_{R}^{2} - {{\mu_{2}^2}}\right)\)
\(\displaystyle \frac{\partial V}{\partial v_R} = 2 v_{R} \left(\alpha_{1} k_{1}^{2} + \alpha_{1} k_{2}^{2} + \alpha_{2} k_{2}^{2} + \alpha_{3} k_{1}^{2} + 2 \rho_{1} v_{R}^{2} + \rho_{2} v_{L}^{2} - {{\mu_{2}^2}}\right)\)
✓ Mass parameters in the $v_L = k_2 = 0$ limit:
\(\displaystyle \mu_1^2 = \alpha_{1} v_{R}^{2} + \alpha_{3} v_{R}^{2} + 2 k_{1}^{2} \lambda_{1} + 2 k_{1}^{2} \lambda_{2}\)
\(\displaystyle \mu_2^2 = \alpha_{1} k_{1}^{2} + \alpha_{3} k_{1}^{2} + 2 \rho_{1} v_{R}^{2}\)
Charged scalar mass matrix (basis $c^+ = (\phi_2^+, \chi_L^+, \phi_1^+, \chi_R^+)$):
\(\displaystyle M_+^2 = \left[\begin{matrix}v_{R}^{2} \left(\alpha_{2} - \alpha_{3}\right) & 0 & 0 & k_{1} v_{R} \left(\alpha_{2} - \alpha_{3}\right)\\0 & \alpha_{2} k_{1}^{2} - \alpha_{3} k_{1}^{2} - 2 \rho_{1} v_{R}^{2} + \rho_{2} v_{R}^{2} & 0 & 0\\0 & 0 & 0 & 0\\k_{1} v_{R} \left(\alpha_{2} - \alpha_{3}\right) & 0 & 0 & k_{1}^{2} \left(\alpha_{2} - \alpha_{3}\right)\end{matrix}\right]\)
✓ Characteristic polynomial: $\lambda^2 (\lambda - m^2_{H_L})(\lambda - m^2_{H_R})$
→ two zero eigenvalues (Goldstones) and two physical masses
Physical charged masses:
\(\displaystyle m^2_{H_L^\pm} = k_{1}^{2} \left(\alpha_{2} - \alpha_{3}\right) + v_{R}^{2} \left(- 2 \rho_{1} + \rho_{2}\right)\)
\(\displaystyle m^2_{H_R^\pm} = \left(\alpha_{2} - \alpha_{3}\right) \left(k_{1}^{2} + v_{R}^{2}\right)\)