PhysLean/HepLean/AnomalyCancellation/MSSMNu/SolsParameterization.lean
2024-04-17 16:23:40 -04:00

639 lines
24 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.
Authors: Joseph Tooby-Smith
-/
import HepLean.AnomalyCancellation.MSSMNu.Basic
import HepLean.AnomalyCancellation.MSSMNu.LineY3B3
import HepLean.AnomalyCancellation.MSSMNu.PlaneY3B3Orthog
import Mathlib.Tactic.Polyrith
/-!
# Parameterization of solutions to the MSSM anomaly cancellation equations
This file uses planes through $Y_3$ and $B_3$ to form solutions to the anomaly cancellation
conditions.
Split into four cases:
- The generic case.
- `case₁`: The case when the quadratic and cubic lines agree (if they exist uniquely).
- `case₂`: The case where the plane lies entirely within the quadratic.
- `case₃`: The case where the plane lies entirely within the cubic and quadratic.
# References
The main reference for the material in this file is:
- https://arxiv.org/pdf/2107.07926.pdf
-/
universe v u
namespace MSSMACC
open MSSMCharges
open MSSMACCs
open BigOperators
/-- Given a `R ∈ LinSols` perpendicular to $Y_3$, and $B_3$, a solution to the quadratic. -/
def genericQuad (R : MSSMACC.AnomalyFreePerp) : MSSMACC.QuadSols :=
lineQuad R
(3 * cubeTriLin (R.val, R.val, Y₃.val))
(3 * cubeTriLin (R.val, R.val, B₃.val))
(cubeTriLin (R.val, R.val, R.val))
lemma genericQuad_cube (R : MSSMACC.AnomalyFreePerp) :
accCube (genericQuad R).val = 0 := by
rw [genericQuad]
rw [lineQuad_val]
rw [planeY₃B₃_cubic]
ring
/-- Given a `R ∈ LinSols` perpendicular to $Y_3$, and $B_3$, a element of `Sols`. -/
def generic (R : MSSMACC.AnomalyFreePerp) : MSSMACC.Sols :=
AnomalyFreeMk'' (genericQuad R) (genericQuad_cube R)
lemma generic_eq_planeY₃B₃_on_α (R : MSSMACC.AnomalyFreePerp) :
(generic R).1.1 = planeY₃B₃ R (α₁ R) (α₂ R) (α₃ R) := by
change (planeY₃B₃ _ _ _ _) = _
apply planeY₃B₃_eq
rw [α₁, α₂, α₃]
ring_nf
simp
/-- Case₁ is when the quadratic and cubic lines in the plane agree, which occurs when
`α₁ R = 0`, `α₂ R = 0` and `α₃ R = 0` (if they exist uniquely). -/
def case₁prop (R : MSSMACC.AnomalyFreePerp) : Prop :=
α₁ R = 0 ∧ α₂ R = 0 ∧ α₃ R = 0
/-- Case₂ is defined when the plane lies entirely within the quadratic. -/
def case₂prop (R : MSSMACC.AnomalyFreePerp) : Prop :=
quadBiLin (R.val, R.val) = 0 ∧ quadBiLin (Y₃.val, R.val) = 0 ∧ quadBiLin (B₃.val, R.val) = 0
/-- Case₃ is defined when the plane lies entirely within the quadratic and cubic. -/
def case₃prop (R : MSSMACC.AnomalyFreePerp) : Prop :=
quadBiLin (R.val, R.val) = 0 ∧ quadBiLin (Y₃.val, R.val) = 0 ∧ quadBiLin (B₃.val, R.val) = 0 ∧
cubeTriLin (R.val, R.val, R.val) = 0 ∧ cubeTriLin (R.val, R.val, B₃.val) = 0 ∧
cubeTriLin (R.val, R.val, Y₃.val) = 0
instance (R : MSSMACC.AnomalyFreePerp) : Decidable (case₁prop R) := by
apply And.decidable
instance (R : MSSMACC.AnomalyFreePerp) : Decidable (case₂prop R) := by
apply And.decidable
instance (R : MSSMACC.AnomalyFreePerp) : Decidable (case₃prop R) := by
apply And.decidable
section proj
/-- On elements of `Sols`, `generic (proj _)` is equivalent to multiplying
by `genericProjCoeff`. -/
def genericProjCoeff (T : MSSMACC.Sols) : :=
dot (Y₃.val, B₃.val) * α₃ (proj T.1.1)
lemma generic_proj (T : MSSMACC.Sols) :
generic (proj T.1.1) = (genericProjCoeff T) • T := by
apply ACCSystem.Sols.ext
erw [generic_eq_planeY₃B₃_on_α]
rw [planeY₃B₃_val]
rw [Y₃_plus_B₃_plus_proj]
rw [α₁_proj, α₂_proj]
simp
rfl
lemma genericProjCoeff_ne_zero (T : MSSMACC.Sols) (hT : genericProjCoeff T ≠ 0 ) :
(genericProjCoeff T)⁻¹ • generic (proj T.1.1) = T := by
rw [generic_proj, ← MulAction.mul_smul, mul_comm, mul_inv_cancel hT]
simp
lemma genericProjCoeff_zero_α₃ (T : MSSMACC.Sols) (hT : genericProjCoeff T = 0) :
α₃ (proj T.1.1) = 0 := by
rw [genericProjCoeff, mul_eq_zero] at hT
rw [show dot (Y₃.val, B₃.val) = 108 by rfl] at hT
simp at hT
exact hT
lemma genericProjCoeff_zero_α₂ (T : MSSMACC.Sols) (hT : genericProjCoeff T = 0) :
α₂ (proj T.1.1) = 0 := by
rw [α₂_proj, genericProjCoeff_zero_α₃ T hT]
simp
lemma genericProjCoeff_zero_α₁ (T : MSSMACC.Sols) (hT : genericProjCoeff T = 0) :
α₁ (proj T.1.1) = 0 := by
rw [α₁_proj, genericProjCoeff_zero_α₃ T hT]
simp
lemma genericProjCoeff_zero (T : MSSMACC.Sols) :
genericProjCoeff T = 0 ↔ case₁prop (proj T.1.1) := by
apply Iff.intro
intro hT
rw [case₁prop]
rw [genericProjCoeff_zero_α₁ T hT, genericProjCoeff_zero_α₂ T hT, genericProjCoeff_zero_α₃ T hT]
simp only [and_self]
intro h
rw [case₁prop] at h
rw [genericProjCoeff]
rw [h.2.2]
simp
lemma genericProjCoeff_neq_zero_case₁ (T : MSSMACC.Sols) (hT : genericProjCoeff T ≠ 0) :
¬ case₁prop (proj T.1.1) :=
(genericProjCoeff_zero T).mpr.mt hT
lemma genericProjCoeff_neq_zero_case₂ (T : MSSMACC.Sols) (hT : genericProjCoeff T ≠ 0) :
¬ case₂prop (proj T.1.1) := by
by_contra hn
rw [case₂prop] at hn
rw [genericProjCoeff, α₃] at hT
simp_all
lemma genericProjCoeff_neq_zero_case₃ (T : MSSMACC.Sols) (hT : genericProjCoeff T ≠ 0) :
¬ case₃prop (proj T.1.1) := by
by_contra hn
rw [case₃prop] at hn
rw [genericProjCoeff, α₃] at hT
simp_all
end proj
/-- The case when the quadratic and cubic lines agree (if they exist uniquely). -/
def case₁ (R : MSSMACC.AnomalyFreePerp) (c₁ c₂ c₃ : )
(h : case₁prop R) : MSSMACC.Sols :=
AnomalyFreeMk'' (lineQuad R c₁ c₂ c₃)
(by
rw [lineQuad_cube]
rw [h.1, h.2.1, h.2.2]
simp)
lemma case₁_smul (R : MSSMACC.AnomalyFreePerp) (c₁ c₂ c₃ d : )
(h : case₁prop R) : case₁ R (d * c₁) (d * c₂) (d * c₃) h = d • case₁ R c₁ c₂ c₃ h := by
apply ACCSystem.Sols.ext
change (lineQuad _ _ _ _).val = _
rw [lineQuad_smul]
rfl
section proj
/-- The coefficent which multiplies a solution on passing through `case₁`. -/
def case₁ProjCoeff (T : MSSMACC.Sols) : :=
2 * (quadBiLin (Y₃.val, (proj T.1.1).val) ^ 2 +
quadBiLin (B₃.val, (proj T.1.1).val) ^ 2)
/-- The first parameter in case₁ needed to form an inverse on Proj. -/
def case₁ProjC₁ (T : MSSMACC.Sols) : := (quadBiLin (B₃.val, T.val))
/-- The second parameter in case₁ needed to form an inverse on Proj. -/
def case₁ProjC₂ (T : MSSMACC.Sols) : := (- quadBiLin (Y₃.val, T.val))
/-- The third parameter in case₁ needed to form an inverse on Proj. -/
def case₁ProjC₃ (T : MSSMACC.Sols) : :=
- quadBiLin (B₃.val, T.val) * ( dot (Y₃.val, T.val)- dot (B₃.val, T.val) )
- quadBiLin (Y₃.val, T.val) * ( dot (Y₃.val, T.val) - 2 * dot (B₃.val, T.val) )
lemma case₁_proj (T : MSSMACC.Sols) (h1 : genericProjCoeff T = 0) :
case₁ (proj T.1.1)
(case₁ProjC₁ T)
(case₁ProjC₂ T)
(case₁ProjC₃ T)
((genericProjCoeff_zero T).mp h1)
= (case₁ProjCoeff T) • T := by
apply ACCSystem.Sols.ext
change (lineQuad _ _ _ _).val = _
rw [lineQuad_val]
rw [planeY₃B₃_val]
rw [Y₃_plus_B₃_plus_proj]
rw [case₁ProjCoeff, case₁ProjC₁, case₁ProjC₂, case₁ProjC₃, quad_proj, quad_Y₃_proj, quad_B₃_proj]
ring_nf
simp
rfl
lemma case₁ProjCoeff_ne_zero (T : MSSMACC.Sols) (h1 : genericProjCoeff T = 0)
(hT : case₁ProjCoeff T ≠ 0 ) :
(case₁ProjCoeff T)⁻¹ • case₁ (proj T.1.1)
(case₁ProjC₁ T)
(case₁ProjC₂ T)
(case₁ProjC₃ T)
((genericProjCoeff_zero T).mp h1) = T := by
rw [case₁_proj T h1, ← MulAction.mul_smul, mul_comm, mul_inv_cancel hT]
simp
lemma case₁ProjCoeff_zero_Y₃_B₃ (T : MSSMACC.Sols) (h1 : case₁ProjCoeff T = 0) :
quadBiLin (Y₃.val, (proj T.1.1).val) = 0 ∧
quadBiLin (B₃.val, (proj T.1.1).val) = 0 := by
rw [case₁ProjCoeff, mul_eq_zero] at h1
simp only [OfNat.ofNat_ne_zero, Fin.isValue, Fin.reduceFinMk, false_or] at h1
have h : quadBiLin (Y₃.val, (proj T.1.1).val) ^ 2 = 0 ∧
quadBiLin (B₃.val, (proj T.1.1).val) ^ 2 = 0 :=
(add_eq_zero_iff' (sq_nonneg _) (sq_nonneg _)).mp h1
simp only [ Fin.isValue, Fin.reduceFinMk, ne_eq, OfNat.ofNat_ne_zero,
not_false_eq_true, pow_eq_zero_iff] at h
exact h
lemma case₁ProjCoeff_zero_Y₃ (T : MSSMACC.Sols) (h1 : case₁ProjCoeff T = 0) :
quadBiLin (Y₃.val, (proj T.1.1).val) = 0 :=
(case₁ProjCoeff_zero_Y₃_B₃ T h1).left
lemma case₁ProjCoeff_zero_B₃ (T : MSSMACC.Sols) (h1 : case₁ProjCoeff T = 0) :
quadBiLin (B₃.val, (proj T.1.1).val) = 0 :=
(case₁ProjCoeff_zero_Y₃_B₃ T h1).right
lemma case₁ProjCoeff_zero_T (T : MSSMACC.Sols) (h1 : case₁ProjCoeff T = 0) :
quadBiLin (T.val, (proj T.1.1).val) = 0 := by
have hY3 : quadBiLin (T.val, Y₃.val) = 0 := by
have h11 := case₁ProjCoeff_zero_Y₃ T h1
rw [quad_Y₃_proj] at h11
rw [show dot (Y₃.val, B₃.val) = 108 by rfl] at h11
simp only [ Fin.isValue, Fin.reduceFinMk, mul_eq_zero, OfNat.ofNat_ne_zero,
false_or] at h11
erw [quadBiLin.swap] at h11
exact h11
have hB3 : quadBiLin (T.val, B₃.val) = 0 := by
have h11 := case₁ProjCoeff_zero_B₃ T h1
rw [quad_B₃_proj] at h11
rw [show dot (Y₃.val, B₃.val) = 108 by rfl] at h11
simp only [ Fin.isValue, Fin.reduceFinMk, mul_eq_zero, OfNat.ofNat_ne_zero,
false_or] at h11
erw [quadBiLin.swap] at h11
exact h11
rw [proj_val]
rw [quadBiLin.map_add₂, quadBiLin.map_add₂]
rw [quadBiLin.map_smul₂, quadBiLin.map_smul₂, quadBiLin.map_smul₂]
rw [hY3, hB3]
erw [quadSol T.1]
simp
lemma case₁ProjCoeff_zero_self (T : MSSMACC.Sols) (h1 : case₁ProjCoeff T = 0) :
quadBiLin ((proj T.1.1).val, (proj T.1.1).val) = 0 := by
nth_rewrite 1 [proj_val]
rw [quadBiLin.map_add₁, quadBiLin.map_add₁]
rw [quadBiLin.map_smul₁, quadBiLin.map_smul₁, quadBiLin.map_smul₁]
rw [case₁ProjCoeff_zero_Y₃ T h1, case₁ProjCoeff_zero_B₃ T h1, case₁ProjCoeff_zero_T T h1]
simp
lemma case₁ProjCoeff_zero (T : MSSMACC.Sols) :
case₁ProjCoeff T = 0 ↔ case₂prop (proj T.1.1) := by
apply Iff.intro
intro h1
rw [case₂prop]
rw [case₁ProjCoeff_zero_self T h1, case₁ProjCoeff_zero_Y₃ T h1, case₁ProjCoeff_zero_B₃ T h1]
simp only [and_self]
intro h
rw [case₂prop] at h
rw [case₁ProjCoeff]
rw [h.2.1, h.2.2]
simp
lemma case₁ProjCoeff_ne_zero_case₂ (T : MSSMACC.Sols) (h1 : case₁ProjCoeff T ≠ 0) :
¬ case₂prop (proj T.1.1) :=
(case₁ProjCoeff_zero T).mpr.mt h1
lemma case₁ProjCoeff_ne_zero_case₃ (T : MSSMACC.Sols) (h1 : case₁ProjCoeff T ≠ 0) :
¬ case₃prop (proj T.1.1) := by
by_contra hn
rw [case₃prop] at hn
rw [case₁ProjCoeff] at h1
simp_all
end proj
/-- The case where the plane lies entirely within the quadratic. -/
def case₂ (R : MSSMACC.AnomalyFreePerp) (a₁ a₂ a₃ : )
(h : case₂prop R) : MSSMACC.Sols :=
AnomalyFreeMk' (lineCube R a₁ a₂ a₃)
(by
erw [planeY₃B₃_quad]
rw [h.1, h.2.1, h.2.2]
simp)
(lineCube_cube R a₁ a₂ a₃)
lemma case₂_smul (R : MSSMACC.AnomalyFreePerp) (c₁ c₂ c₃ d : )
(h : case₂prop R) : case₂ R (d * c₁) (d * c₂) (d * c₃) h = d • case₂ R c₁ c₂ c₃ h := by
apply ACCSystem.Sols.ext
change (lineCube _ _ _ _).val = _
rw [lineCube_smul]
rfl
section proj
/-- The coefficent which multiplies a solution on passing through `case₂`. -/
def case₂ProjCoeff (T : MSSMACC.Sols) : :=
3 * dot (Y₃.val, B₃.val) ^ 3 * (cubeTriLin (T.val, T.val, Y₃.val) ^ 2 +
cubeTriLin (T.val, T.val, B₃.val) ^ 2 )
/-- The first parameter in `case₂` needed to form an inverse on `Proj`. -/
def case₂ProjC₁ (T : MSSMACC.Sols) : := cubeTriLin (T.val, T.val, B₃.val)
/-- The second parameter in `case₂` needed to form an inverse on `Proj`. -/
def case₂ProjC₂ (T : MSSMACC.Sols) : := - cubeTriLin (T.val, T.val, Y₃.val)
/-- The third parameter in `case₂` needed to form an inverse on `Proj`. -/
def case₂ProjC₃ (T : MSSMACC.Sols) : :=
(- cubeTriLin (T.val, T.val, B₃.val) * (dot (Y₃.val, T.val) - dot (B₃.val, T.val))
- cubeTriLin (T.val, T.val, Y₃.val) * (dot (Y₃.val, T.val) - 2 * dot (B₃.val, T.val)))
lemma case₂_proj (T : MSSMACC.Sols) (h1 : case₁ProjCoeff T = 0) :
case₂ (proj T.1.1)
(case₂ProjC₁ T)
(case₂ProjC₂ T)
(case₂ProjC₃ T)
((case₁ProjCoeff_zero T).mp h1) = (case₂ProjCoeff T) • T := by
apply ACCSystem.Sols.ext
change (planeY₃B₃ _ _ _ _).val = _
rw [planeY₃B₃_val]
rw [Y₃_plus_B₃_plus_proj]
rw [case₂ProjCoeff, case₂ProjC₁, case₂ProjC₂, case₂ProjC₃, cube_proj, cube_proj_proj_B₃,
cube_proj_proj_Y₃]
ring_nf
simp
rfl
lemma case₂ProjCoeff_ne_zero (T : MSSMACC.Sols) (h1 : case₁ProjCoeff T = 0)
(hT : case₂ProjCoeff T ≠ 0 ) :
(case₂ProjCoeff T)⁻¹ • case₂ (proj T.1.1)
(case₂ProjC₁ T)
(case₂ProjC₂ T)
(case₂ProjC₃ T)
((case₁ProjCoeff_zero T).mp h1) = T := by
rw [case₂_proj T h1, ← MulAction.mul_smul, mul_comm, mul_inv_cancel hT]
simp
lemma case₂ProjCoeff_zero_Y₃_B₃ (T : MSSMACC.Sols) (h1 : case₂ProjCoeff T = 0) :
cubeTriLin ((proj T.1.1).val, (proj T.1.1).val, Y₃.val) = 0 ∧
cubeTriLin ((proj T.1.1).val, (proj T.1.1).val, B₃.val) = 0 := by
rw [case₂ProjCoeff, mul_eq_zero] at h1
rw [show dot (Y₃.val, B₃.val) = 108 by rfl] at h1
simp at h1
have h : cubeTriLin (T.val, T.val, Y₃.val) ^ 2 = 0 ∧
cubeTriLin (T.val, T.val, B₃.val) ^ 2 = 0 :=
(add_eq_zero_iff' (sq_nonneg _) (sq_nonneg _)).mp h1
simp at h
have h1 := cube_proj_proj_B₃ T.1.1
erw [h.2] at h1
have h2 := cube_proj_proj_Y₃ T.1.1
erw [h.1] at h2
simp_all
lemma case₂ProjCoeff_zero_Y₃ (T : MSSMACC.Sols) (h1 : case₂ProjCoeff T = 0) :
cubeTriLin ((proj T.1.1).val, (proj T.1.1).val, Y₃.val) = 0 :=
(case₂ProjCoeff_zero_Y₃_B₃ T h1).left
lemma case₂ProjCoeff_zero_B₃ (T : MSSMACC.Sols) (h1 : case₂ProjCoeff T = 0) :
cubeTriLin ((proj T.1.1).val, (proj T.1.1).val, B₃.val) = 0 :=
(case₂ProjCoeff_zero_Y₃_B₃ T h1).right
lemma case₂ProjCoeff_zero_T (T : MSSMACC.Sols) (h1 : case₂ProjCoeff T = 0) :
cubeTriLin ((proj T.1.1).val, (proj T.1.1).val, T.val) = 0 := by
rw [cube_proj_proj_self]
have hr : cubeTriLin (T.val, T.val, Y₃.val) = 0 := by
have h11 := case₂ProjCoeff_zero_Y₃ T h1
rw [cube_proj_proj_Y₃] at h11
rw [show dot (Y₃.val, B₃.val) = 108 by rfl] at h11
simp at h11
exact h11
have h2 : cubeTriLin (T.val, T.val, B₃.val) = 0 := by
have h11 := case₂ProjCoeff_zero_B₃ T h1
rw [cube_proj_proj_B₃] at h11
rw [show dot (Y₃.val, B₃.val) = 108 by rfl] at h11
simp at h11
exact h11
rw [hr, h2]
simp
lemma case₂ProjCoeff_zero_self (T : MSSMACC.Sols) (h1 : case₂ProjCoeff T = 0) :
cubeTriLin ((proj T.1.1).val, (proj T.1.1).val, (proj T.1.1).val) = 0 := by
nth_rewrite 3 [proj_val]
rw [cubeTriLin.map_add₃, cubeTriLin.map_add₃]
rw [cubeTriLin.map_smul₃, cubeTriLin.map_smul₃, cubeTriLin.map_smul₃]
rw [case₂ProjCoeff_zero_Y₃ T h1, case₂ProjCoeff_zero_B₃ T h1, case₂ProjCoeff_zero_T T h1]
simp
lemma case₂ProjCoeff_zero (T : MSSMACC.Sols) :
(case₁ProjCoeff T = 0 ∧ case₂ProjCoeff T = 0) ↔ case₃prop (proj T.1.1) := by
apply Iff.intro
intro h1
rw [case₃prop]
rw [case₂ProjCoeff_zero_self T h1.2, case₂ProjCoeff_zero_Y₃ T h1.2, case₂ProjCoeff_zero_B₃ T h1.2]
rw [case₁ProjCoeff_zero_self T h1.1, case₁ProjCoeff_zero_Y₃ T h1.1, case₁ProjCoeff_zero_B₃ T h1.1]
simp only [and_self]
intro h
rw [case₃prop] at h
rw [case₁ProjCoeff, case₂ProjCoeff]
simp_all only [ne_eq, OfNat.ofNat_ne_zero, not_false_eq_true, zero_pow, add_zero,
mul_zero, mul_eq_zero, pow_eq_zero_iff, false_or, true_and]
erw [show dot (Y₃.val, B₃.val) = 108 by rfl]
simp only [OfNat.ofNat_ne_zero, false_or]
have h1' := cube_proj_proj_B₃ T.1.1
have h2' := cube_proj_proj_Y₃ T.1.1
erw [show dot (Y₃.val, B₃.val) = 108 by rfl] at h1' h2'
simp_all
lemma case₂ProjCoeff_ne_zero_case₃ (T : MSSMACC.Sols) (h1 : case₂ProjCoeff T ≠ 0) :
¬ case₃prop (proj T.1.1) := by
have h1 : ¬ (case₁ProjCoeff T = 0 ∧ case₂ProjCoeff T = 0) := by
simp_all
exact (case₂ProjCoeff_zero T).mpr.mt h1
end proj
/-- The case where the plane lies entirely within the quadratic and cubic. -/
def case₃ (R : MSSMACC.AnomalyFreePerp) (b₁ b₂ b₃ : )
(h₃ : case₃prop R) :
MSSMACC.Sols :=
AnomalyFreeMk' (planeY₃B₃ R b₁ b₂ b₃)
(by
rw [planeY₃B₃_quad]
rw [h₃.1, h₃.2.1, h₃.2.2.1]
simp)
(by
rw [planeY₃B₃_cubic]
rw [h₃.2.2.2.1, h₃.2.2.2.2.1, h₃.2.2.2.2.2]
simp)
lemma case₃_smul (R : MSSMACC.AnomalyFreePerp) (c₁ c₂ c₃ d : )
(h : case₃prop R) : case₃ R (d * c₁) (d * c₂) (d * c₃) h = d • case₃ R c₁ c₂ c₃ h := by
apply ACCSystem.Sols.ext
change (planeY₃B₃ _ _ _ _).val = _
rw [planeY₃B₃_smul]
rfl
section proj
/-- The coefficent which multiplies a solution on passing through `case₃`. -/
def case₃ProjCoeff : := dot (Y₃.val, B₃.val)
/-- The first parameter in `case₃` needed to form an inverse on `Proj`. -/
def case₃ProjC₁ (T : MSSMACC.Sols) : := (dot (Y₃.val, T.val) - dot (B₃.val, T.val))
/-- The second parameter in `case₃` needed to form an inverse on `Proj`. -/
def case₃ProjC₂ (T : MSSMACC.Sols) : := (2 * dot (B₃.val, T.val) - dot (Y₃.val, T.val))
lemma case₃_proj (T : MSSMACC.Sols) (h0 : case₁ProjCoeff T = 0) (h1 : case₂ProjCoeff T = 0) :
case₃ (proj T.1.1)
(case₃ProjC₁ T)
(case₃ProjC₂ T)
1
((case₂ProjCoeff_zero T).mp (And.intro h0 h1)) = case₃ProjCoeff • T := by
apply ACCSystem.Sols.ext
change (planeY₃B₃ _ _ _ _).val = _
rw [planeY₃B₃_val]
rw [Y₃_plus_B₃_plus_proj]
rw [case₃ProjC₁, case₃ProjC₂]
ring_nf
simp
rfl
lemma case₃_smul_coeff (T : MSSMACC.Sols) (h0 : case₁ProjCoeff T = 0) (h1 : case₂ProjCoeff T = 0) :
case₃ProjCoeff⁻¹ • case₃ (proj T.1.1)
(case₃ProjC₁ T)
(case₃ProjC₂ T)
1
((case₂ProjCoeff_zero T).mp (And.intro h0 h1)) = T := by
rw [case₃_proj T h0 h1]
rw [← MulAction.mul_smul, mul_comm, mul_inv_cancel]
simp only [one_smul]
rw [case₃ProjCoeff]
rw [show dot (Y₃.val, B₃.val) = 108 by rfl]
simp only [ne_eq, OfNat.ofNat_ne_zero, not_false_eq_true]
end proj
/-- A map from `MSSMACC.AnomalyFreePerp × × × ` to `MSSMACC.Sols`.
This allows generation of solutions given elements of `MSSMACC.AnomalyFreePerp` and
three rational numbers. -/
def parameterization :
MSSMACC.AnomalyFreePerp × × × → MSSMACC.Sols := fun A =>
if h₃ : case₃prop A.1 then
case₃ A.1 A.2.1 A.2.2.1 A.2.2.2 h₃
else
if h₂ : case₂prop A.1 then
case₂ A.1 A.2.1 A.2.2.1 A.2.2.2 h₂
else
if h₁ : case₁prop A.1 then
case₁ A.1 A.2.1 A.2.2.1 A.2.2.2 h₁
else
A.2.1 • generic A.1
lemma parameterization_smul (R : MSSMACC.AnomalyFreePerp) (a b c d : ) :
parameterization (R, d * a, d * b, d * c) = d • parameterization (R, a, b, c) := by
rw [parameterization, parameterization]
by_cases h₃ : case₃prop R
rw [dif_pos h₃, dif_pos h₃]
rw [case₃_smul]
rw [dif_neg h₃, dif_neg h₃]
by_cases h₂ : case₂prop R
rw [dif_pos h₂, dif_pos h₂]
rw [case₂_smul]
rw [dif_neg h₂, dif_neg h₂]
by_cases h₁ : case₁prop R
rw [dif_pos h₁, dif_pos h₁]
rw [case₁_smul]
rw [dif_neg h₁, dif_neg h₁]
rw [mul_smul]
lemma parameterization_not₁₂₃ (R : MSSMACC.AnomalyFreePerp) (a b c : )
(h1 : ¬ case₁prop R) (h2 : ¬ case₂prop R) (h3 : ¬ case₃prop R) :
parameterization (R, a, b, c) = a • generic R := by
rw [parameterization]
rw [dif_neg h3]
rw [dif_neg h2]
rw [dif_neg h1]
lemma parameterization_is₁_not₂₃ (R : MSSMACC.AnomalyFreePerp) (a b c : )
(h1 : case₁prop R) (h2 : ¬ case₂prop R) (h3 : ¬ case₃prop R) :
parameterization (R, a, b, c) = case₁ R a b c h1:= by
rw [parameterization]
rw [dif_neg h3]
rw [dif_neg h2]
rw [dif_pos h1]
lemma parameterization_is₁₂_not₃ (R : MSSMACC.AnomalyFreePerp) (a b c : ) (h2 : case₂prop R)
(h3 : ¬ case₃prop R) : parameterization (R, a, b, c) = case₂ R a b c h2 := by
rw [parameterization]
rw [dif_neg h3]
rw [dif_pos h2]
lemma parameterization_is₃ (R : MSSMACC.AnomalyFreePerp) (a b c : ) (h3 : case₃prop R) :
parameterization (R, a, b, c) = case₃ R a b c h3 := by
rw [parameterization]
rw [dif_pos h3]
/-- A right inverse of `parameterizaiton`. -/
def inverse (R : MSSMACC.Sols) : MSSMACC.AnomalyFreePerp × × × :=
if genericProjCoeff R ≠ 0 then
(proj R.1.1, (genericProjCoeff R)⁻¹, 0, 0)
else
if case₁ProjCoeff R ≠ 0 then
(proj R.1.1, (case₁ProjCoeff R)⁻¹ * case₁ProjC₁ R, (case₁ProjCoeff R)⁻¹ * case₁ProjC₂ R,
(case₁ProjCoeff R)⁻¹ * case₁ProjC₃ R)
else
if case₂ProjCoeff R ≠ 0 then
(proj R.1.1, (case₂ProjCoeff R)⁻¹ * case₂ProjC₁ R, (case₂ProjCoeff R)⁻¹ * case₂ProjC₂ R,
(case₂ProjCoeff R)⁻¹ * case₂ProjC₃ R)
else
(proj R.1.1, (case₃ProjCoeff)⁻¹ * case₃ProjC₁ R, (case₃ProjCoeff)⁻¹ * case₃ProjC₂ R,
(case₃ProjCoeff)⁻¹ * 1)
lemma inverse_generic (R : MSSMACC.Sols) (h : genericProjCoeff R ≠ 0) :
inverse R = (proj R.1.1, (genericProjCoeff R)⁻¹, 0, 0) := by
rw [inverse, if_pos h]
lemma inverse_case₁ (R : MSSMACC.Sols) (h0 : genericProjCoeff R = 0)
(h1 : case₁ProjCoeff R ≠ 0) : inverse R = (proj R.1.1, (case₁ProjCoeff R)⁻¹ * case₁ProjC₁ R,
(case₁ProjCoeff R)⁻¹ * case₁ProjC₂ R, (case₁ProjCoeff R)⁻¹ * case₁ProjC₃ R) := by
rw [inverse]
simp_all
lemma inverse_case₂ (R : MSSMACC.Sols) (h0 : genericProjCoeff R = 0)
(h1 : case₁ProjCoeff R = 0) (h2 : case₂ProjCoeff R ≠ 0) : inverse R = (proj R.1.1,
(case₂ProjCoeff R)⁻¹ * case₂ProjC₁ R,
(case₂ProjCoeff R)⁻¹ * case₂ProjC₂ R, (case₂ProjCoeff R)⁻¹ * case₂ProjC₃ R) := by
rw [inverse]
simp_all
lemma inverse_case₃ (R : MSSMACC.Sols) (h0 : genericProjCoeff R = 0)
(h1 : case₁ProjCoeff R = 0) (h2 : case₂ProjCoeff R = 0) :
inverse R = (proj R.1.1, (case₃ProjCoeff)⁻¹ * case₃ProjC₁ R,
(case₃ProjCoeff)⁻¹ * case₃ProjC₂ R,
(case₃ProjCoeff)⁻¹ * 1) := by
rw [inverse]
simp_all
lemma inverse_parameterization (R : MSSMACC.Sols) :
parameterization (inverse R) = R := by
by_cases h0 : genericProjCoeff R ≠ 0
rw [inverse_generic R h0]
rw [parameterization_not₁₂₃ _ _ _ _ (genericProjCoeff_neq_zero_case₁ R h0)
(genericProjCoeff_neq_zero_case₂ R h0) (genericProjCoeff_neq_zero_case₃ R h0)]
rw [genericProjCoeff_ne_zero R h0]
by_cases h1 : case₁ProjCoeff R ≠ 0
simp at h0
rw [inverse_case₁ R h0 h1]
rw [parameterization_smul]
rw [parameterization_is₁_not₂₃ _ _ _ _ ((genericProjCoeff_zero R).mp h0)
(case₁ProjCoeff_ne_zero_case₂ R h1) (case₁ProjCoeff_ne_zero_case₃ R h1)]
rw [case₁ProjCoeff_ne_zero R h0 h1]
simp at h0 h1
by_cases h2 : case₂ProjCoeff R ≠ 0
rw [inverse_case₂ R h0 h1 h2]
rw [parameterization_smul]
rw [parameterization_is₁₂_not₃ _ _ _ _ ((case₁ProjCoeff_zero R).mp h1)
(case₂ProjCoeff_ne_zero_case₃ R h2)]
rw [case₂ProjCoeff_ne_zero R h1 h2]
simp at h2
rw [inverse_case₃ R h0 h1 h2]
rw [parameterization_smul]
rw [parameterization_is₃ _ _ _ _ ((case₂ProjCoeff_zero R).mp (And.intro h1 h2))]
rw [case₃_smul_coeff R h1 h2]
theorem parameterization_surjective : Function.Surjective parameterization := by
intro T
use inverse T
exact inverse_parameterization T
end MSSMACC