11/-
22Copyright (c) 2026 Yury G. Kudryashov. All rights reserved.
33Released under Apache 2.0 license as described in the file LICENSE.
4- Authors: Yury G. Kudryashov
4+ Authors: Yury G. Kudryashov, Edison Xie
55-/
66module
77
@@ -17,11 +17,22 @@ In this file we define `Matrix.ProjGenLinGroup n R` as the quotient of `GL n R`
1717We introduce notation `PGL(n, R)` for this group,
1818which works if `n` is either a finite type or a natural number.
1919If `n` is a number, then `PGL(n, R)` is interpreted as `PGL(Fin n, R)`.
20+
21+ ## Main definitions
22+
23+ * `Matrix.SpecialLinearGroup.toPGL` is the natural map from `SL(n, R)` to `PGL(n, R)`.
24+
25+ * `Matrix.ProjectiveSpecialLinearGroup.toPGL` is the natural
26+ inclusion from `PSL(n, R)` to `PGL(n, R)`.
27+
28+ * `Matrix.ProjectiveSpecialLinearGroup.isoPSLOfAlgClosed` is an isomorphism between
29+ `PGL(n, F)` and `PSL(n, F)` in the case of an algebraically closed field.
30+
2031 -/
2132
2233open scoped MatrixGroups
2334
24- public section
35+ @[expose] public section
2536
2637namespace Matrix
2738
@@ -61,6 +72,9 @@ theorem ker_mk : mk.ker = Subgroup.center (GL n R) := QuotientGroup.ker_mk' _
6172theorem mk_eq_one {g : GL n R} : mk g = 1 ↔ g ∈ Subgroup.center (GL n R) := by
6273 rw [← MonoidHom.mem_ker, ker_mk]
6374
75+ @[simp]
76+ lemma mk_one : mk (1 : GL n R) = 1 := rfl
77+
6478@[simp]
6579theorem mk_scalar (u : Rˣ) : mk (.scalar n u) = 1 := by
6680 rw [← MonoidHom.mem_ker, ker_mk, GeneralLinearGroup.center_eq_range_scalar]
@@ -71,41 +85,43 @@ theorem induction_on {motive : PGL(n, R) → Prop} (g : PGL(n, R))
7185 (mk : ∀ g : GL n R, motive (ProjGenLinGroup.mk g)) : motive g :=
7286 Quotient.inductionOn g mk
7387
88+ end ProjGenLinGroup
89+
7490section isoPSL
7591
92+ variable {n R : Type *} [Fintype n] [DecidableEq n] [CommRing R]
93+
94+ open Matrix.ProjGenLinGroup
95+
96+ namespace SpecialLinearGroup
97+
98+ /-- The natural map from `SL(n, R)` to `PGL(n, R)` by composing the maps from `SL` to `GL` and the
99+ quotient map from `GL` to `PGL`. -/
100+ abbrev toPGL : SpecialLinearGroup n R →* PGL(n, R) := mk.comp toGL
101+
102+ lemma toPGL_ker : toPGL.ker = Subgroup.center (SpecialLinearGroup n R) := by
103+ ext; simp [toGL_mem_center_iff]
104+
105+ end SpecialLinearGroup
106+
107+ namespace ProjectiveSpecialLinearGroup
108+
76109open Matrix.SpecialLinearGroup
77110
78111/-- The natural inclusion map from `PSL(n, R)` to `PGL(n, R)` induced by the inclusion
79112 map from `SL(n, R)` to `GL(n, R)`. -/
80- @[expose]
81- def _root_.Matrix.ProjectiveSpecialLinearGroup.toPGL :
82- ProjectiveSpecialLinearGroup n R →* PGL(n, R) :=
83- QuotientGroup.lift _ (mk.comp toGL) fun x hx ↦ by
84- simp only [mem_center_iff, scalar_apply, MonoidHom.mem_ker, MonoidHom.coe_comp,
85- Function.comp_apply, mk_eq_one, GeneralLinearGroup.mem_center_iff_val_mem_range_scalar,
86- coe_GL_coe_matrix, Set.mem_range] at hx ⊢
87- exact ⟨hx.choose, hx.choose_spec.2 ⟩
113+ def toPGL : ProjectiveSpecialLinearGroup n R →* PGL(n, R) :=
114+ QuotientGroup.lift _ SpecialLinearGroup.toPGL <| le_of_eq toPGL_ker.symm
88115
89116@[simp]
90- lemma _root_.Matrix.ProjectiveSpecialLinearGroup. toPGL_mk (g : SpecialLinearGroup n R) :
117+ lemma toPGL_mk (g : SpecialLinearGroup n R) :
91118 ProjectiveSpecialLinearGroup.toPGL g = mk (toGL g) := rfl
92119
93- lemma _root_.Matrix.ProjectiveSpecialLinearGroup.toPGL_injective :
94- Function.Injective (ProjectiveSpecialLinearGroup.toPGL (n := n) (R := R)) := fun x y h ↦ by
95- induction x using QuotientGroup.induction_on with | H x =>
96- induction y using QuotientGroup.induction_on with | H y =>
97- simp only [ProjectiveSpecialLinearGroup.toPGL_mk, mk_eq_mk_iff] at h
98- rw [← QuotientGroup.mk'_apply, ← QuotientGroup.mk'_apply]
99- simp only [QuotientGroup.mk'_eq_mk', mem_center_iff]
100- obtain ⟨u, hu'⟩ := h
101- have hu : u.1 ^ Fintype.card n = 1 := by
102- simpa [Units.ext_iff] using congr(Matrix.GeneralLinearGroup.det $hu')
103- set z : SpecialLinearGroup n R := ⟨scalar n u.1 , by simpa using hu⟩ with hz_eq
104- have hz : (GeneralLinearGroup.scalar n) u = toGL z := by ext; simp [hz_eq]
105- refine ⟨z, ⟨u.1 , hu, by simp [hz_eq]⟩, ?_⟩
106- rwa [hz, ← map_mul, toGL_inj] at hu'
107-
108- lemma _root_.Matrix.ProjectiveSpecialLinearGroup.toPGL_surj_of_roots
120+ lemma toPGL_injective :
121+ Function.Injective (ProjectiveSpecialLinearGroup.toPGL (n := n) (R := R)) :=
122+ QuotientGroup.injective_lift_iff _ _ _ |>.2 toPGL_ker.symm
123+
124+ lemma toPGL_surj_of_roots
109125 (hR : ∀ r : Rˣ, ∃ k : Rˣ, k ^ Fintype.card n = r) :
110126 Function.Surjective (ProjectiveSpecialLinearGroup.toPGL (n := n) (R := R)) := fun g ↦ by
111127 induction g using Matrix.ProjGenLinGroup.induction_on with | mk g =>
@@ -117,10 +133,10 @@ lemma _root_.Matrix.ProjectiveSpecialLinearGroup.toPGL_surj_of_roots
117133 use QuotientGroup.mk ⟨r.1 • g.1 , hr⟩
118134 simp only [ProjectiveSpecialLinearGroup.toPGL_mk, mk_eq_mk_iff]
119135 refine ⟨r⁻¹, Units.ext ?_⟩
120- simp only [Units.val_mul, coe_GL_coe_matrix,GeneralLinearGroup.val_scalar_apply ]
136+ simp only [Units.val_mul, coe_GL_coe_matrix, GeneralLinearGroup.coe_scalar ]
121137 simp [← Matrix.mul_smul, ← Matrix.diagonal_smul, Pi.smul_def, smul_eq_mul]
122138
123- lemma _root_.Matrix.ProjectiveSpecialLinearGroup. toPGL_surj_iff [Nonempty n] :
139+ lemma toPGL_surj_iff [Nonempty n] :
124140 Function.Surjective (ProjectiveSpecialLinearGroup.toPGL (n := n) (R := R)) ↔
125141 ∀ r : Rˣ, ∃ k : Rˣ, k ^ Fintype.card n = r := by
126142 refine ⟨fun h r ↦ ?_, ProjectiveSpecialLinearGroup.toPGL_surj_of_roots⟩
@@ -156,9 +172,13 @@ noncomputable def isoPSLOfAlgClosed {F : Type*} [Field F] [IsAlgClosed F] :
156172 MulEquiv.symm (MulEquiv.ofBijective Matrix.ProjectiveSpecialLinearGroup.toPGL
157173 ⟨Matrix.ProjectiveSpecialLinearGroup.toPGL_injective, Function.surjective_to_subsingleton _⟩)
158174
175+ end ProjectiveSpecialLinearGroup
176+
159177end isoPSL
160178
161- variable {M : Type *} [Monoid M]
179+ namespace ProjGenLinGroup
180+
181+ variable {n R : Type *} [Fintype n] [DecidableEq n] [CommRing R] {M : Type *} [Monoid M]
162182
163183/-- Lift a monoid homomorphism `f : GL n R →* M` that vanishes on all scalar matrices
164184to a homomorphism from `PGL(n, R)`. -/
@@ -191,6 +211,23 @@ theorem mk_smul {α : Type*} [MulAction (GL n R) α] (h) (g : GL n R) (a : α) :
191211 mk g • a = g • a := by
192212 rfl
193213
214+ /-- The monoid hom between `PGL(n, R)` and `PGL(n, S)` induced by a
215+ ring homomorphism `f : R →+* S`. -/
216+ def map {S : Type *} [CommRing S] (f : R →+* S) : PGL(n, R) →* PGL(n, S) :=
217+ QuotientGroup.map _ _ (GeneralLinearGroup.map (n := n) f) <| GeneralLinearGroup.map_center_le f
218+
219+ @[simp]
220+ lemma map_id : map (RingHom.id R) = MonoidHom.id (PGL(n, R)) := QuotientGroup.map_id _
221+
222+ @[simp]
223+ lemma map_mk {S : Type *} [CommRing S] (f : R →+* S) (g : GL n R) :
224+ map f (mk g) = mk (GeneralLinearGroup.map f g) := rfl
225+
226+ lemma map_comp {S T : Type *} [CommRing S] [CommRing T] (f : R →+* S) (g : S →+* T) :
227+ map (n := n) (g.comp f) = (map g).comp (map f) := by
228+ ext g
229+ induction g using Matrix.ProjGenLinGroup.induction_on with | mk g => simp
230+
194231variable [Fact (Even (Fintype.card n))] [LinearOrder R] [IsStrictOrderedRing R]
195232
196233/-- In case of an even dimension, the sign of the determinant of `g : PGL(n, R)` is well-defined. -/
0 commit comments