Skip to content

Commit 0bb58c2

Browse files
feat(LinearAlgebra/Projectivization): GL(V) action (#26811)
Some API around projective spaces and general linear groups: - an equiv between V and W gives an equiv between GL(V) and GL(W) - GL(V) acts on the projectivization of V - GL 2 K acts on `OnePoint K` (which is the projectivization of `K x K`) I am adding these because I need them to define cusps in modular form theory, but they are hopefully something of general usefulness beyond that. Co-authored-by: Eric Wieser <wieser.eric@gmail.com>
1 parent 2e1c3ba commit 0bb58c2

File tree

4 files changed

+162
-3
lines changed

4 files changed

+162
-3
lines changed

Mathlib.lean

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4210,6 +4210,7 @@ import Mathlib.LinearAlgebra.Pi
42104210
import Mathlib.LinearAlgebra.PiTensorProduct
42114211
import Mathlib.LinearAlgebra.Prod
42124212
import Mathlib.LinearAlgebra.Projection
4213+
import Mathlib.LinearAlgebra.Projectivization.Action
42134214
import Mathlib.LinearAlgebra.Projectivization.Basic
42144215
import Mathlib.LinearAlgebra.Projectivization.Cardinality
42154216
import Mathlib.LinearAlgebra.Projectivization.Constructions

Mathlib/LinearAlgebra/GeneralLinearGroup.lean

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,15 +40,20 @@ def toLinearEquiv (f : GeneralLinearGroup R M) : M ≃ₗ[R] M :=
4040
left_inv := fun m ↦ show (f.inv * f.val) m = m by rw [f.inv_val]; simp
4141
right_inv := fun m ↦ show (f.val * f.inv) m = m by rw [f.val_inv]; simp }
4242

43+
@[simp] lemma coe_toLinearEquiv (f : GeneralLinearGroup R M) :
44+
f.toLinearEquiv = (f : M → M) := rfl
45+
4346
/-- An equivalence from `M` to itself determines an invertible linear map. -/
4447
def ofLinearEquiv (f : M ≃ₗ[R] M) : GeneralLinearGroup R M where
4548
val := f
4649
inv := (f.symm : M →ₗ[R] M)
4750
val_inv := LinearMap.ext fun _ ↦ f.apply_symm_apply _
4851
inv_val := LinearMap.ext fun _ ↦ f.symm_apply_apply _
4952

50-
variable (R M)
53+
@[simp] lemma coe_ofLinearEquiv (f : M ≃ₗ[R] M) :
54+
ofLinearEquiv f = (f : M → M) := rfl
5155

56+
variable (R M) in
5257
/-- The general linear group on `R` and `M` is multiplicatively equivalent to the type of linear
5358
equivalences between `M` and itself. -/
5459
def generalLinearEquiv : GeneralLinearGroup R M ≃* M ≃ₗ[R] M where
@@ -64,6 +69,53 @@ theorem generalLinearEquiv_to_linearMap (f : GeneralLinearGroup R M) :
6469
theorem coeFn_generalLinearEquiv (f : GeneralLinearGroup R M) :
6570
(generalLinearEquiv R M f) = (f : M → M) := rfl
6671

72+
section Functoriality
73+
74+
variable {R₁ R₂ R₃ M₁ M₂ M₃ : Type*}
75+
[Semiring R₁] [Semiring R₂] [Semiring R₃]
76+
[AddCommMonoid M₁] [AddCommMonoid M₂] [AddCommMonoid M₃]
77+
[Module R₁ M₁] [Module R₂ M₂] [Module R₃ M₃]
78+
{σ₁₂ : R₁ →+* R₂} {σ₂₃ : R₂ →+* R₃} {σ₁₃ : R₁ →+* R₃}
79+
{σ₂₁ : R₂ →+* R₁} {σ₃₂ : R₃ →+* R₂} {σ₃₁ : R₃ →+* R₁}
80+
[RingHomInvPair σ₁₂ σ₂₁] [RingHomInvPair σ₂₃ σ₃₂] [RingHomInvPair σ₁₃ σ₃₁]
81+
[RingHomInvPair σ₂₁ σ₁₂] [RingHomInvPair σ₃₂ σ₂₃] [RingHomInvPair σ₃₁ σ₁₃]
82+
[RingHomCompTriple σ₁₂ σ₂₃ σ₁₃] [RingHomCompTriple σ₃₂ σ₂₁ σ₃₁]
83+
84+
/-- A semilinear equivalence from `V` to `W` determines an isomorphism of general linear
85+
groups. -/
86+
def congrLinearEquiv (e₁₂ : M₁ ≃ₛₗ[σ₁₂] M₂) :
87+
GeneralLinearGroup R₁ M₁ ≃* GeneralLinearGroup R₂ M₂ :=
88+
Units.mapEquiv (LinearEquiv.conjRingEquiv e₁₂).toMulEquiv
89+
90+
@[simp] lemma congrLinearEquiv_apply (e₁₂ : M₁ ≃ₛₗ[σ₁₂] M₂) (g : GeneralLinearGroup R₁ M₁) :
91+
congrLinearEquiv e₁₂ g = ofLinearEquiv (e₁₂.symm.trans <| g.toLinearEquiv.trans e₁₂) :=
92+
rfl
93+
94+
@[simp] lemma congrLinearEquiv_symm (e₁₂ : M₁ ≃ₛₗ[σ₁₂] M₂) :
95+
(congrLinearEquiv e₁₂).symm = congrLinearEquiv e₁₂.symm :=
96+
rfl
97+
98+
@[simp]
99+
lemma congrLinearEquiv_trans
100+
{N₁ N₂ N₃ : Type*} [AddCommMonoid N₁] [AddCommMonoid N₂] [AddCommMonoid N₃]
101+
[Module R N₁] [Module R N₂] [Module R N₃] (e₁₂ : N₁ ≃ₗ[R] N₂) (e₂₃ : N₂ ≃ₗ[R] N₃) :
102+
(congrLinearEquiv e₁₂).trans (congrLinearEquiv e₂₃) = congrLinearEquiv (e₁₂.trans e₂₃) :=
103+
rfl
104+
105+
/-- Stronger form of `congrLinearEquiv.trans` applying to semilinear maps. Not a simp lemma as
106+
`σ₁₃` and `σ₃₁` cannot be inferred from the LHS. -/
107+
lemma congrLinearEquiv_trans' (e₁₂ : M₁ ≃ₛₗ[σ₁₂] M₂) (e₂₃ : M₂ ≃ₛₗ[σ₂₃] M₃) :
108+
(congrLinearEquiv e₁₂).trans (congrLinearEquiv e₂₃) =
109+
congrLinearEquiv (e₁₂.trans e₂₃) :=
110+
rfl
111+
112+
@[simp]
113+
lemma congrLinearEquiv_refl :
114+
congrLinearEquiv (LinearEquiv.refl R₁ M₁) = MulEquiv.refl (GeneralLinearGroup R₁ M₁) :=
115+
rfl
116+
117+
end Functoriality
118+
67119
end GeneralLinearGroup
68120

69121
end LinearMap
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
/-
2+
Copyright (c) 2025 David Loeffler. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: David Loeffler
5+
-/
6+
import Mathlib.LinearAlgebra.Projectivization.Basic
7+
import Mathlib.GroupTheory.GroupAction.Ring
8+
9+
/-!
10+
# Group actions on projectivization
11+
12+
Show that (among other groups), the general linear group of `V` acts on `ℙ K V`.
13+
-/
14+
15+
open scoped LinearAlgebra.Projectivization Matrix
16+
17+
namespace Projectivization
18+
19+
section DivisionRing
20+
21+
variable {G K V : Type*} [AddCommGroup V] [DivisionRing K] [Module K V]
22+
[Group G] [DistribMulAction G V] [SMulCommClass G K V]
23+
24+
/-- Any group acting `K`-linearly on `V` (such as the general linear group) acts on `ℙ V`. -/
25+
@[simps -isSimp]
26+
instance : MulAction G (ℙ K V) where
27+
smul g x := x.map (DistribMulAction.toModuleEnd _ _ g)
28+
(DistribMulAction.toLinearEquiv _ _ g).injective
29+
one_smul x := show map _ _ _ = _ by simp [map_one, Module.End.one_eq_id]
30+
mul_smul g g' x := show map _ _ _ = map _ _ (map _ _ _) by
31+
simp_rw [map_mul, Module.End.mul_eq_comp]
32+
rw [map_comp, Function.comp_apply]
33+
34+
lemma generalLinearGroup_smul_def (g : LinearMap.GeneralLinearGroup K V) (x : ℙ K V) :
35+
g • x = x.map g.toLinearEquiv.toLinearMap g.toLinearEquiv.injective := by
36+
rfl
37+
38+
@[simp]
39+
lemma smul_mk (g : G) {v : V} (hv : v ≠ 0) :
40+
g • mk K v hv = mk K (g • v) ((smul_ne_zero_iff_ne g).mpr hv) :=
41+
rfl
42+
43+
end DivisionRing
44+
45+
end Projectivization

Mathlib/Topology/Compactification/OnePoint/ProjectiveLine.lean

Lines changed: 63 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,12 @@ Copyright (c) 2024 Bjørn Kjos-Hanssen. All rights reserved.
33
Released under Apache 2.0 license as described in the file LICENSE.
44
Authors: Bjørn Kjos-Hanssen, Oliver Nash
55
-/
6-
import Mathlib.LinearAlgebra.Projectivization.Basic
6+
import Mathlib.Data.Matrix.Action
7+
import Mathlib.LinearAlgebra.Matrix.GeneralLinearGroup.Defs
8+
import Mathlib.LinearAlgebra.Projectivization.Action
79
import Mathlib.Topology.Compactification.OnePoint.Basic
810

11+
912
/-!
1013
# One-point compactification and projectivization
1114
@@ -26,9 +29,35 @@ one-point extension, projectivization
2629
-/
2730

2831
open scoped LinearAlgebra.Projectivization OnePoint
29-
open Projectivization
32+
33+
open Projectivization Matrix
34+
35+
section MatrixProdAction
36+
37+
variable {R n : Type*} [Semiring R] [Fintype n] [DecidableEq n]
38+
39+
instance : Module (Matrix (Fin 2) (Fin 2) R) (R × R) :=
40+
(LinearEquiv.finTwoArrow R R).symm.toAddEquiv.module _
41+
42+
instance {S} [DistribSMul S R] [SMulCommClass R S R] :
43+
SMulCommClass (Matrix (Fin 2) (Fin 2) R) S (R × R) :=
44+
(LinearEquiv.finTwoArrow R R).symm.smulCommClass _ _
45+
46+
@[simp] lemma Matrix.fin_two_smul_prod (g : Matrix (Fin 2) (Fin 2) R) (v : R × R) :
47+
g • v = (g 0 0 * v.1 + g 0 1 * v.2, g 1 0 * v.1 + g 1 1 * v.2) := by
48+
simp [Equiv.smul_def, smul_eq_mulVec, Matrix.mulVec_eq_sum]
49+
50+
@[simp] lemma Matrix.GeneralLinearGroup.fin_two_smul_prod {R : Type*} [CommRing R]
51+
(g : GL (Fin 2) R) (v : R × R) :
52+
g • v = (g 0 0 * v.1 + g 0 1 * v.2, g 1 0 * v.1 + g 1 1 * v.2) := by
53+
simp [Units.smul_def]
54+
55+
end MatrixProdAction
3056

3157
namespace OnePoint
58+
59+
section DivisionRing
60+
3261
variable (K : Type*) [DivisionRing K] [DecidableEq K]
3362

3463
/-- The one-point compactification of a division ring `K` is equivalent to
@@ -68,4 +97,36 @@ lemma equivProjectivization_symm_apply_mk (x y : K) (h : (x, y) ≠ 0) :
6897
(equivProjectivization K).symm (mk K ⟨x, y⟩ h) = if y = 0 thenelse y⁻¹ * x := by
6998
simp [equivProjectivization]
7099

100+
end DivisionRing
101+
102+
section Field
103+
104+
variable {K : Type*} [Field K] [DecidableEq K]
105+
106+
/-- For a field `K`, the group `GL(2, K)` acts on `OnePoint K`, via the canonical identification
107+
with the `ℙ¹(K)` (which is given explicitly by Möbius transformations). -/
108+
instance instGLAction : MulAction (GL (Fin 2) K) (OnePoint K) :=
109+
(equivProjectivization K).mulAction (GL (Fin 2) K)
110+
111+
lemma smul_infty_def (g : GL (Fin 2) K) :
112+
g • ∞ = (equivProjectivization K).symm (.mk K (g 0 0, g 1 0) (fun h ↦ by
113+
simpa [det_fin_two, Prod.mk_eq_zero.mp h] using g.det_ne_zero)) := by
114+
simp [Equiv.smul_def, mulVec_eq_sum, Units.smul_def]
115+
116+
lemma smul_infty_eq_ite (g : GL (Fin 2) K) :
117+
g • (∞ : OnePoint K) = if g 1 0 = 0 thenelse g 0 0 / g 1 0 := by
118+
by_cases h : g 1 0 = 0 <;>
119+
simp [h, div_eq_inv_mul, smul_infty_def]
120+
121+
lemma smul_infty_eq_iff (g : GL (Fin 2) K) :
122+
g • (∞ : OnePoint K) = ∞ ↔ g 1 0 = 0 := by
123+
simp [smul_infty_eq_ite]
124+
125+
lemma smul_some_eq_ite (g : GL (Fin 2) K) (k : K) :
126+
g • (k : OnePoint K) =
127+
if g 1 0 * k + g 1 1 = 0 thenelse (g 0 0 * k + g 0 1) / (g 1 0 * k + g 1 1) := by
128+
simp [Equiv.smul_def, mulVec_eq_sum, div_eq_inv_mul, mul_comm, Units.smul_def]
129+
130+
end Field
131+
71132
end OnePoint

0 commit comments

Comments
 (0)