PhysLean/HepLean/FlavorPhysics/CKMMatrix/Rows.lean
2024-07-12 16:39:44 -04:00

360 lines
14 KiB
Text
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/-
Copyright (c) 2024 Joseph Tooby-Smith. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Joseph Tooby-Smith
-/
import HepLean.FlavorPhysics.CKMMatrix.Basic
import Mathlib.Analysis.SpecialFunctions.Complex.Arg
import Mathlib.LinearAlgebra.CrossProduct
/-!
# Rows for the CKM Matrix
This file contains the definition extracting the rows of the CKM matrix and
proves some properties between them.
The first row can be extracted as `[V]u` for a CKM matrix `V`.
-/
open Matrix Complex
open ComplexConjugate
noncomputable section
namespace CKMMatrix
/-- The `u`th row of the CKM matrix. -/
def uRow (V : CKMMatrix) : Fin 3 → := ![[V]ud, [V]us, [V]ub]
/-- The `u`th row of the CKM matrix. -/
scoped[CKMMatrix] notation (name := u_row) "[" V "]u" => uRow V
/-- The `c`th row of the CKM matrix. -/
def cRow (V : CKMMatrix) : Fin 3 → := ![[V]cd, [V]cs, [V]cb]
/-- The `c`th row of the CKM matrix. -/
scoped[CKMMatrix] notation (name := c_row) "[" V "]c" => cRow V
/-- The `t`th row of the CKM matrix. -/
def tRow (V : CKMMatrix) : Fin 3 → := ![[V]td, [V]ts, [V]tb]
/-- The `t`th row of the CKM matrix. -/
scoped[CKMMatrix] notation (name := t_row) "[" V "]t" => tRow V
lemma uRow_normalized (V : CKMMatrix) : conj [V]u ⬝ᵥ [V]u = 1 := by
simp only [vec3_dotProduct, Fin.isValue, Pi.conj_apply]
have hV := V.prop
rw [mem_unitaryGroup_iff] at hV
have ht := congrFun (congrFun hV 0) 0
simp [Matrix.mul_apply, Fin.sum_univ_three] at ht
rw [mul_comm (V.1 0 0) _, mul_comm (V.1 0 1) _, mul_comm (V.1 0 2) _] at ht
exact ht
lemma cRow_normalized (V : CKMMatrix) : conj [V]c ⬝ᵥ [V]c = 1 := by
simp only [vec3_dotProduct, Fin.isValue, Pi.conj_apply]
have hV := V.prop
rw [mem_unitaryGroup_iff] at hV
have ht := congrFun (congrFun hV 1) 1
simp only [Fin.isValue, mul_apply, star_apply, RCLike.star_def, Fin.sum_univ_three,
one_apply_eq] at ht
rw [mul_comm (V.1 1 0) _, mul_comm (V.1 1 1) _, mul_comm (V.1 1 2) _] at ht
exact ht
lemma uRow_cRow_orthog (V : CKMMatrix) : conj [V]u ⬝ᵥ [V]c = 0 := by
simp only [vec3_dotProduct, Fin.isValue, Pi.conj_apply]
have hV := V.prop
rw [mem_unitaryGroup_iff] at hV
have ht := congrFun (congrFun hV 1) 0
simp only [Fin.isValue, mul_apply, star_apply, RCLike.star_def, Fin.sum_univ_three, ne_eq,
one_ne_zero, not_false_eq_true, one_apply_ne] at ht
rw [mul_comm (V.1 _ 0) _, mul_comm (V.1 _ 1) _, mul_comm (V.1 _ 2) _] at ht
exact ht
lemma uRow_tRow_orthog (V : CKMMatrix) : conj [V]u ⬝ᵥ [V]t = 0 := by
simp only [vec3_dotProduct, Fin.isValue, Pi.conj_apply]
have hV := V.prop
rw [mem_unitaryGroup_iff] at hV
have ht := congrFun (congrFun hV 2) 0
simp only [Fin.isValue, mul_apply, star_apply, RCLike.star_def, Fin.sum_univ_three, ne_eq,
Fin.reduceEq, not_false_eq_true, one_apply_ne] at ht
rw [mul_comm (V.1 _ 0) _, mul_comm (V.1 _ 1) _, mul_comm (V.1 _ 2) _] at ht
exact ht
lemma cRow_uRow_orthog (V : CKMMatrix) : conj [V]c ⬝ᵥ [V]u = 0 := by
simp only [vec3_dotProduct, Fin.isValue, Pi.conj_apply]
have hV := V.prop
rw [mem_unitaryGroup_iff] at hV
have ht := congrFun (congrFun hV 0) 1
simp only [Fin.isValue, mul_apply, star_apply, RCLike.star_def, Fin.sum_univ_three, ne_eq,
zero_ne_one, not_false_eq_true, one_apply_ne] at ht
rw [mul_comm (V.1 _ 0) _, mul_comm (V.1 _ 1) _, mul_comm (V.1 _ 2) _] at ht
exact ht
lemma cRow_tRow_orthog (V : CKMMatrix) : conj [V]c ⬝ᵥ [V]t = 0 := by
simp only [vec3_dotProduct, Fin.isValue, Pi.conj_apply]
have hV := V.prop
rw [mem_unitaryGroup_iff] at hV
have ht := congrFun (congrFun hV 2) 1
simp only [Fin.isValue, mul_apply, star_apply, RCLike.star_def, Fin.sum_univ_three, ne_eq,
Fin.reduceEq, not_false_eq_true, one_apply_ne] at ht
rw [mul_comm (V.1 _ 0) _, mul_comm (V.1 _ 1) _, mul_comm (V.1 _ 2) _] at ht
exact ht
lemma tRow_normalized (V : CKMMatrix) : conj [V]t ⬝ᵥ [V]t = 1 := by
simp only [vec3_dotProduct, Fin.isValue, Pi.conj_apply]
have hV := V.prop
rw [mem_unitaryGroup_iff] at hV
have ht := congrFun (congrFun hV 2) 2
simp only [Fin.isValue, mul_apply, star_apply, RCLike.star_def, Fin.sum_univ_three,
one_apply_eq] at ht
rw [mul_comm (V.1 2 0) _, mul_comm (V.1 2 1) _, mul_comm (V.1 2 2) _] at ht
exact ht
lemma tRow_uRow_orthog (V : CKMMatrix) : conj [V]t ⬝ᵥ [V]u = 0 := by
simp only [vec3_dotProduct, Fin.isValue, Pi.conj_apply]
have hV := V.prop
rw [mem_unitaryGroup_iff] at hV
have ht := congrFun (congrFun hV 0) 2
simp only [Fin.isValue, mul_apply, star_apply, RCLike.star_def, Fin.sum_univ_three, ne_eq,
Fin.reduceEq, not_false_eq_true, one_apply_ne] at ht
rw [mul_comm (V.1 _ 0) _, mul_comm (V.1 _ 1) _, mul_comm (V.1 _ 2) _] at ht
exact ht
lemma tRow_cRow_orthog (V : CKMMatrix) : conj [V]t ⬝ᵥ [V]c = 0 := by
simp only [vec3_dotProduct, Fin.isValue, Pi.conj_apply]
have hV := V.prop
rw [mem_unitaryGroup_iff] at hV
have ht := congrFun (congrFun hV 1) 2
simp only [Fin.isValue, mul_apply, star_apply, RCLike.star_def, Fin.sum_univ_three, ne_eq,
Fin.reduceEq, not_false_eq_true, one_apply_ne] at ht
rw [mul_comm (V.1 _ 0) _, mul_comm (V.1 _ 1) _, mul_comm (V.1 _ 2) _] at ht
exact ht
lemma uRow_cross_cRow_conj (V : CKMMatrix) : conj (conj [V]u ×₃ conj [V]c) = [V]u ×₃ [V]c := by
simp only [crossProduct, Nat.succ_eq_add_one, Nat.reduceAdd, Fin.isValue, LinearMap.mk₂_apply,
Pi.conj_apply]
funext i
fin_cases i <;> simp
lemma cRow_cross_tRow_conj (V : CKMMatrix) : conj (conj [V]c ×₃ conj [V]t) = [V]c ×₃ [V]t := by
simp only [crossProduct, Nat.succ_eq_add_one, Nat.reduceAdd, Fin.isValue, LinearMap.mk₂_apply,
Pi.conj_apply]
funext i
fin_cases i <;> simp
lemma uRow_cross_cRow_normalized (V : CKMMatrix) :
conj (conj [V]u ×₃ conj [V]c) ⬝ᵥ (conj [V]u ×₃ conj [V]c) = 1 := by
rw [uRow_cross_cRow_conj, cross_dot_cross, dotProduct_comm, uRow_normalized,
dotProduct_comm, cRow_normalized, dotProduct_comm, cRow_uRow_orthog,
dotProduct_comm, uRow_cRow_orthog]
simp
lemma cRow_cross_tRow_normalized (V : CKMMatrix) :
conj (conj [V]c ×₃ conj [V]t) ⬝ᵥ (conj [V]c ×₃ conj [V]t) = 1 := by
rw [cRow_cross_tRow_conj, cross_dot_cross, dotProduct_comm, cRow_normalized,
dotProduct_comm, tRow_normalized, dotProduct_comm, tRow_cRow_orthog,
dotProduct_comm, cRow_tRow_orthog]
simp
/-- A map from `Fin 3` to each row of a CKM matrix. -/
@[simp]
def rows (V : CKMMatrix) : Fin 3 → Fin 3 → := fun i =>
match i with
| 0 => uRow V
| 1 => cRow V
| 2 => tRow V
lemma rows_linearly_independent (V : CKMMatrix) : LinearIndependent (rows V) := by
apply Fintype.linearIndependent_iff.mpr
intro g hg
rw [Fin.sum_univ_three] at hg
simp only [Fin.isValue, rows] at hg
have h0 := congrArg (fun X => conj [V]u ⬝ᵥ X) hg
have h1 := congrArg (fun X => conj [V]c ⬝ᵥ X) hg
have h2 := congrArg (fun X => conj [V]t ⬝ᵥ X) hg
simp only [Fin.isValue, dotProduct_add, dotProduct_smul, Pi.conj_apply,
smul_eq_mul, dotProduct_zero] at h0 h1 h2
rw [uRow_normalized, uRow_cRow_orthog, uRow_tRow_orthog] at h0
rw [cRow_normalized, cRow_uRow_orthog, cRow_tRow_orthog] at h1
rw [tRow_normalized, tRow_uRow_orthog, tRow_cRow_orthog] at h2
simp only [Fin.isValue, mul_one, mul_zero, add_zero, zero_add] at h0 h1 h2
intro i
fin_cases i
· exact h0
· exact h1
· exact h2
lemma rows_card : Fintype.card (Fin 3) = FiniteDimensional.finrank (Fin 3 → ) := by
simp
/-- The rows of a CKM matrix as a basis of `ℂ³`. -/
@[simps!]
noncomputable def rowBasis (V : CKMMatrix) : Basis (Fin 3) (Fin 3 → ) :=
basisOfLinearIndependentOfCardEqFinrank (rows_linearly_independent V) rows_card
lemma cRow_cross_tRow_eq_uRow (V : CKMMatrix) :
∃ (κ : ), [V]u = cexp (κ * I) • (conj [V]c ×₃ conj [V]t) := by
obtain ⟨g, hg⟩ := (mem_span_range_iff_exists_fun ).mp (Basis.mem_span (rowBasis V)
(conj [V]c ×₃ conj [V]t))
simp only [Fin.sum_univ_three, rowBasis, Fin.isValue,
coe_basisOfLinearIndependentOfCardEqFinrank, rows] at hg
have h0 := congrArg (fun X => conj [V]c ⬝ᵥ X) hg
have h1 := congrArg (fun X => conj [V]t ⬝ᵥ X) hg
simp only [Fin.isValue, dotProduct_add, dotProduct_smul, Pi.conj_apply,
smul_eq_mul, dotProduct_zero] at h0 h1
rw [cRow_normalized, cRow_uRow_orthog, cRow_tRow_orthog, dot_self_cross] at h0
rw [tRow_normalized, tRow_uRow_orthog, tRow_cRow_orthog, dot_cross_self] at h1
simp only [Fin.isValue, mul_zero, mul_one, zero_add, add_zero] at h0 h1 hg
simp only [h0, h1, zero_smul, add_zero] at hg
have h2 := congrArg (fun X => conj X ⬝ᵥ X) hg
simp only [Fin.isValue, dotProduct_smul, Pi.conj_apply, Pi.smul_apply,
smul_eq_mul, _root_.map_mul, cRow_cross_tRow_normalized] at h2
have h3 : conj (g 0 • [V]u) = conj (g 0) • conj [V]u := by
funext i
fin_cases i <;> simp
simp only [h3, Fin.isValue, smul_dotProduct, Pi.conj_apply, smul_eq_mul,
uRow_normalized, Fin.isValue, mul_one, mul_conj, ← Complex.sq_abs] at h2
simp at h2
cases' h2 with h2 h2
swap
have hx : Complex.abs (g 0) = -1 := by
simp [← ofReal_inj, Fin.isValue, ofReal_neg, ofReal_one, h2]
have h3 := Complex.abs.nonneg (g 0)
simp_all
have h4 : (0 : ) < 1 := by norm_num
· exact False.elim (lt_iff_not_le.mp h4 h3)
have hx : [V]u = (g 0)⁻¹ • (conj ([V]c) ×₃ conj ([V]t)) := by
rw [← hg, smul_smul, inv_mul_cancel, one_smul]
by_contra hn
simp [hn] at h2
have hg2 : Complex.abs (g 0)⁻¹ = 1 := by
simp [@map_inv₀, h2]
have hg22 : ∃ (τ : ), (g 0)⁻¹ = Complex.exp (τ * I) := by
rw [← abs_mul_exp_arg_mul_I (g 0)⁻¹, hg2]
use arg (g 0)⁻¹
simp
obtain ⟨τ, hτ⟩ := hg22
use τ
rw [hx, hτ]
lemma uRow_cross_cRow_eq_tRow (V : CKMMatrix) :
∃ (τ : ), [V]t = cexp (τ * I) • (conj ([V]u) ×₃ conj ([V]c)) := by
obtain ⟨g, hg⟩ := (mem_span_range_iff_exists_fun ).mp (Basis.mem_span (rowBasis V)
(conj ([V]u) ×₃ conj ([V]c)))
rw [Fin.sum_univ_three, rowBasis] at hg
simp at hg
have h0 := congrArg (fun X => conj [V]u ⬝ᵥ X) hg
have h1 := congrArg (fun X => conj [V]c ⬝ᵥ X) hg
simp only [Fin.isValue, dotProduct_add, dotProduct_smul, Pi.conj_apply,
smul_eq_mul, dotProduct_zero] at h0 h1
rw [uRow_normalized, uRow_cRow_orthog, uRow_tRow_orthog, dot_self_cross] at h0
rw [cRow_normalized, cRow_uRow_orthog, cRow_tRow_orthog, dot_cross_self] at h1
simp only [Fin.isValue, mul_one, mul_zero, add_zero, zero_add] at h0 h1
simp only [Fin.isValue, h0, zero_smul, h1, add_zero, zero_add] at hg
have h2 := congrArg (fun X => conj X ⬝ᵥ X) hg
simp only [Fin.isValue, dotProduct_smul, Pi.conj_apply, Pi.smul_apply,
smul_eq_mul, _root_.map_mul] at h2
rw [uRow_cross_cRow_normalized] at h2
have h3 : conj (g 2 • [V]t) = conj (g 2) • conj [V]t := by
funext i
fin_cases i <;> simp
simp only [h3, Fin.isValue, smul_dotProduct, Pi.conj_apply, smul_eq_mul, tRow_normalized,
Fin.isValue, mul_one, mul_conj, ← Complex.sq_abs, ofReal_pow, sq_eq_one_iff,
ofReal_eq_one] at h2
cases' h2 with h2 h2
swap
have hx : Complex.abs (g 2) = -1 := by
simp [h2, ← ofReal_inj, Fin.isValue, ofReal_neg, ofReal_one]
have h3 := Complex.abs.nonneg (g 2)
simp_all
have h4 : (0 : ) < 1 := by norm_num
exact False.elim (lt_iff_not_le.mp h4 h3)
have hx : [V]t = (g 2)⁻¹ • (conj ([V]u) ×₃ conj ([V]c)) := by
rw [← hg, @smul_smul, inv_mul_cancel, one_smul]
by_contra hn
simp [hn] at h2
have hg2 : Complex.abs (g 2)⁻¹ = 1 := by
simp [@map_inv₀, h2]
have hg22 : ∃ (τ : ), (g 2)⁻¹ = Complex.exp (τ * I) := by
rw [← abs_mul_exp_arg_mul_I (g 2)⁻¹]
use arg (g 2)⁻¹
simp [hg2]
obtain ⟨τ, hτ⟩ := hg22
use τ
rw [hx, hτ]
lemma ext_Rows {U V : CKMMatrix} (hu : [U]u = [V]u) (hc : [U]c = [V]c) (ht : [U]t = [V]t) :
U = V := by
apply CKMMatrix_ext
funext i j
fin_cases i
have h1 := congrFun hu j
fin_cases j <;> simpa using h1
have h1 := congrFun hc j
fin_cases j <;> simpa using h1
have h1 := congrFun ht j
fin_cases j <;> simpa using h1
end CKMMatrix
namespace phaseShiftApply
open CKMMatrix
variable (V : CKMMatrix) (a b c d e f : )
/-- The cross product of the conjugate of the `u` and `c` rows of a CKM matrix. -/
def ucCross : Fin 3 → :=
conj [phaseShiftApply V a b c d e f]u ×₃ conj [phaseShiftApply V a b c d e f]c
lemma ucCross_fst (V : CKMMatrix) : (ucCross V a b c d e f) 0 =
cexp ((- a * I) + (- b * I) + (- e * I) + (- f * I)) * (conj [V]u ×₃ conj [V]c) 0 := by
simp [ucCross, crossProduct, Nat.succ_eq_add_one, Nat.reduceAdd, Fin.isValue,
LinearMap.mk₂_apply, Pi.conj_apply, cons_val_zero, neg_mul, uRow, us, ub, cRow, cs, cb,
exp_add, exp_sub, ← exp_conj, conj_ofReal]
ring
lemma ucCross_snd (V : CKMMatrix) : (ucCross V a b c d e f) 1 =
cexp ((- a * I) + (- b * I) + (- d * I) + (- f * I)) * (conj [V]u ×₃ conj [V]c) 1 := by
simp [ucCross, crossProduct, uRow, us, ub, cRow, cs, cb, ud, cd, exp_add,
exp_sub, ← exp_conj, conj_ofReal]
ring
lemma ucCross_thd (V : CKMMatrix) : (ucCross V a b c d e f) 2 =
cexp ((- a * I) + (- b * I) + (- d * I) + (- e * I)) * (conj [V]u ×₃ conj [V]c) 2 := by
simp [ucCross, crossProduct, uRow, us, ub, cRow, cs, cb, ud, cd, exp_add, exp_sub,
← exp_conj, conj_ofReal]
ring
lemma uRow_mul (V : CKMMatrix) (a b c : ) :
[phaseShiftApply V a b c 0 0 0]u = cexp (a * I) • [V]u := by
funext i
simp only [Pi.smul_apply, smul_eq_mul]
fin_cases i <;>
change (phaseShiftApply V a b c 0 0 0).1 0 _ = _
simp [ud, uRow, ofReal_zero, zero_mul, add_zero, Fin.isValue, Fin.zero_eta, cons_val_zero]
simp [us, uRow, ofReal_zero, zero_mul, add_zero, Fin.isValue, Fin.mk_one, cons_val_one, head_cons]
simp [ub, uRow]
lemma cRow_mul (V : CKMMatrix) (a b c : ) :
[phaseShiftApply V a b c 0 0 0]c = cexp (b * I) • [V]c := by
funext i
simp only [Pi.smul_apply, smul_eq_mul]
fin_cases i <;>
change (phaseShiftApply V a b c 0 0 0).1 1 _ = _
simp [cd, cRow, ofReal_zero, zero_mul, add_zero, Fin.isValue, Fin.zero_eta, cons_val_zero]
simp [cs, cRow, ofReal_zero, zero_mul, add_zero, Fin.isValue, Fin.mk_one, cons_val_one, head_cons]
simp [cb, cRow]
lemma tRow_mul (V : CKMMatrix) (a b c : ) :
[phaseShiftApply V a b c 0 0 0]t = cexp (c * I) • [V]t := by
funext i
simp only [Pi.smul_apply, smul_eq_mul]
fin_cases i <;>
change (phaseShiftApply V a b c 0 0 0).1 2 _ = _
simp [td, tRow, ofReal_zero, zero_mul, add_zero, Fin.isValue, Fin.zero_eta, cons_val_zero]
simp [ts, tRow, ofReal_zero, zero_mul, add_zero, Fin.isValue, Fin.mk_one, cons_val_one, head_cons]
simp [tb, tRow]
end phaseShiftApply
end