|
| 1 | +/- |
| 2 | +Copyright (c) 2026 Antoine Chambert-Loir. All rights reserved. |
| 3 | +Released under Apache 2.0 license as described in the file LICENSE. |
| 4 | +Authors: Antoine Chambert-Loir |
| 5 | +-/ |
| 6 | + |
| 7 | +module |
| 8 | + |
| 9 | +public import Mathlib.Algebra.Module.Submodule.Pointwise |
| 10 | +public import Mathlib.GroupTheory.GroupAction.FixingSubgroup |
| 11 | +public import Mathlib.GroupTheory.GroupAction.SubMulAction.OfFixingSubgroup |
| 12 | +public import Mathlib.GroupTheory.GroupAction.Ring |
| 13 | +public import Mathlib.LinearAlgebra.DFinsupp |
| 14 | +public import Mathlib.LinearAlgebra.Quotient.Basic |
| 15 | + |
| 16 | +/-! |
| 17 | +# The fixed submodule of a linear map |
| 18 | +
|
| 19 | +- `LinearMap.fixedSubmodule`: the submodule of a linear map consisting of its fixed points. |
| 20 | +
|
| 21 | +-/ |
| 22 | + |
| 23 | +@[expose] public section |
| 24 | + |
| 25 | +namespace LinearMap |
| 26 | + |
| 27 | +open Pointwise Submodule MulAction |
| 28 | + |
| 29 | +variable {R : Type*} [Semiring R] |
| 30 | + {U V : Type*} [AddCommMonoid U] [AddCommMonoid V] |
| 31 | + [Module R U] [Module R V] (e : V ≃ₗ[R] V) |
| 32 | + |
| 33 | + |
| 34 | +/-- The fixed submodule of a linear map. -/ |
| 35 | +def fixedSubmodule (f : V →ₗ[R] V) : Submodule R V where |
| 36 | + carrier := { x | f x = x } |
| 37 | + add_mem' {x y} hx hy := by aesop |
| 38 | + zero_mem' := by simp |
| 39 | + smul_mem' r x hx := by aesop |
| 40 | + |
| 41 | +@[simp] |
| 42 | +theorem mem_fixedSubmodule_iff {f : V →ₗ[R] V} {v : V} : |
| 43 | + v ∈ f.fixedSubmodule ↔ f v = v := by |
| 44 | + simp [fixedSubmodule] |
| 45 | + |
| 46 | +theorem fixedSubmodule_eq_ker {R : Type*} [Ring R] |
| 47 | + {V : Type*} [AddCommGroup V] [Module R V] (f : V →ₗ[R] V) : |
| 48 | + f.fixedSubmodule = LinearMap.ker (f - id (R := R)) := by |
| 49 | + ext; simp [sub_eq_zero] |
| 50 | + |
| 51 | +theorem fixedSubmodule_eq_top_iff {f : V →ₗ[R] V} : |
| 52 | + f.fixedSubmodule = ⊤ ↔ f = id (R := R) := by |
| 53 | + simp [LinearMap.ext_iff, Submodule.ext_iff] |
| 54 | + |
| 55 | +theorem fixedSubmodule_inf_fixedSubmodule_le_comp (f g : V →ₗ[R] V) : |
| 56 | + f.fixedSubmodule ⊓ g.fixedSubmodule ≤ (f ∘ₗ g).fixedSubmodule := by |
| 57 | + intro; simp_all |
| 58 | + |
| 59 | +theorem fixedSubmodule_comp_inf_fixedSubmodule_le (f g : V →ₗ[R] V) : |
| 60 | + (f ∘ₗ g).fixedSubmodule ⊓ g.fixedSubmodule ≤ f.fixedSubmodule := by intro; aesop |
| 61 | + |
| 62 | +end LinearMap |
| 63 | + |
| 64 | +namespace LinearEquiv |
| 65 | + |
| 66 | +open Pointwise LinearMap Submodule MulAction |
| 67 | + |
| 68 | +variable {R : Type*} [Semiring R] |
| 69 | + {U V : Type*} [AddCommMonoid U] [AddCommMonoid V] |
| 70 | + [Module R U] [Module R V] (e : V ≃ₗ[R] V) |
| 71 | + |
| 72 | +variable {P : Submodule R U} {Q : Submodule R V} |
| 73 | + |
| 74 | +theorem fixedSubmodule_eq_top_iff {f : V ≃ₗ[R] V} : |
| 75 | + f.fixedSubmodule = ⊤ ↔ f = .refl R V := by |
| 76 | + simp [LinearEquiv.ext_iff, Submodule.ext_iff] |
| 77 | + |
| 78 | +theorem mem_stabilizer_submodule_of_le_fixedSubmodule |
| 79 | + {e : V ≃ₗ[R] V} {W : Submodule R V} (hW : W ≤ LinearMap.fixedSubmodule e) : |
| 80 | + e ∈ stabilizer (V ≃ₗ[R] V) W := by |
| 81 | + rw [mem_stabilizer_submodule_iff_map_eq] |
| 82 | + apply le_antisymm |
| 83 | + · rintro _ ⟨x, hx : x ∈ W, rfl⟩ |
| 84 | + suffices e x = x by simpa [this, coe_coe] |
| 85 | + rw [← coe_toLinearMap, ← mem_fixedSubmodule_iff] |
| 86 | + exact hW hx |
| 87 | + · intro x hx |
| 88 | + refine ⟨x, hx, ?_⟩ |
| 89 | + simp only [DistribSMul.toLinearMap_apply, LinearEquiv.smul_def] |
| 90 | + rw [← coe_toLinearMap, ← mem_fixedSubmodule_iff] |
| 91 | + exact hW hx |
| 92 | + |
| 93 | +theorem mem_stabilizer_fixedSubmodule (e : V ≃ₗ[R] V) : |
| 94 | + e ∈ stabilizer _ e.fixedSubmodule := |
| 95 | + mem_stabilizer_submodule_of_le_fixedSubmodule (le_refl _) |
| 96 | + |
| 97 | +theorem map_eq_of_mem_fixingSubgroup (W : Submodule R V) |
| 98 | + (he : e ∈ fixingSubgroup _ W.carrier) : |
| 99 | + map e.toLinearMap W = W := by |
| 100 | + ext v |
| 101 | + simp only [mem_fixingSubgroup_iff, carrier_eq_coe, SetLike.mem_coe, LinearEquiv.smul_def] at he |
| 102 | + refine ⟨fun ⟨w, hv, hv'⟩ ↦ ?_, fun hv ↦ ?_⟩ |
| 103 | + · simp only [SetLike.mem_coe, coe_coe] at hv hv' |
| 104 | + rwa [← hv', he w hv] |
| 105 | + · refine ⟨v, hv, he v hv⟩ |
| 106 | + |
| 107 | +open Pointwise MulAction |
| 108 | + |
| 109 | +variable {R V : Type*} [Ring R] [AddCommGroup V] [Module R V] |
| 110 | + |
| 111 | +/-- When `u : V ≃ₗ[R] V` maps a submodule `W` into itself, |
| 112 | +this is the induced linear equivalence of `V ⧸ W`, as a group homomorphism. -/ |
| 113 | +def reduce (W : Submodule R V) : stabilizer (V ≃ₗ[R] V) W →* (V ⧸ W) ≃ₗ[R] (V ⧸ W) where |
| 114 | + toFun u := Quotient.equiv W W u.val u.prop |
| 115 | + map_mul' u v := by |
| 116 | + ext x |
| 117 | + obtain ⟨y, rfl⟩ := W.mkQ_surjective x |
| 118 | + simp |
| 119 | + map_one' := by aesop |
| 120 | + |
| 121 | +@[simp] |
| 122 | +theorem reduce_mk (W : Submodule R V) (u : stabilizer (V ≃ₗ[R] V) W) (x : V) : |
| 123 | + reduce W u (Submodule.Quotient.mk x) = Submodule.Quotient.mk (u.val x) := |
| 124 | + rfl |
| 125 | + |
| 126 | +theorem reduce_mkQ (W : Submodule R V) (u : stabilizer (V ≃ₗ[R] V) W) (x : V) : |
| 127 | + reduce W u (W.mkQ x) = W.mkQ (u.val x) := |
| 128 | + rfl |
| 129 | + |
| 130 | +/-- The linear equivalence deduced from `e : V ≃ₗ[R] V` |
| 131 | +by passing to the quotient by `e.fixedSubmodule`. -/ |
| 132 | +def fixedReduce (e : V ≃ₗ[R] V) : |
| 133 | + (V ⧸ e.fixedSubmodule) ≃ₗ[R] V ⧸ e.fixedSubmodule := |
| 134 | + reduce e.fixedSubmodule ⟨e, e.mem_stabilizer_fixedSubmodule⟩ |
| 135 | + |
| 136 | +@[simp] |
| 137 | +theorem fixedReduce_mk (e : V ≃ₗ[R] V) (x : V) : |
| 138 | + fixedReduce e (Submodule.Quotient.mk x) = Submodule.Quotient.mk (e x) := |
| 139 | + rfl |
| 140 | + |
| 141 | +@[simp] |
| 142 | +theorem fixedReduce_mkQ (e : V ≃ₗ[R] V) (x : V) : |
| 143 | + fixedReduce e (e.fixedSubmodule.mkQ x) = e.fixedSubmodule.mkQ (e x) := |
| 144 | + rfl |
| 145 | + |
| 146 | +theorem fixedReduce_eq_smul_iff (e : V ≃ₗ[R] V) (a : R) : |
| 147 | + (∀ x, e.fixedReduce x = a • x) ↔ |
| 148 | + ∀ v, e v - a • v ∈ e.fixedSubmodule := by |
| 149 | + simp only [← e.fixedSubmodule.ker_mkQ, mem_ker, map_sub, ← fixedReduce_mkQ, sub_eq_zero] |
| 150 | + constructor |
| 151 | + · intro H x; simp [H] |
| 152 | + · intro H x |
| 153 | + have ⟨y, hy⟩ := e.fixedSubmodule.mkQ_surjective x |
| 154 | + rw [← hy] |
| 155 | + apply H |
| 156 | + |
| 157 | +theorem fixedReduce_eq_one (e : V ≃ₗ[R] V) : |
| 158 | + e.fixedReduce = LinearEquiv.refl R _ ↔ ∀ v, e v - v ∈ e.fixedSubmodule := by |
| 159 | + simpa [LinearEquiv.ext_iff] using fixedReduce_eq_smul_iff e 1 |
| 160 | + |
| 161 | +end LinearEquiv |
| 162 | + |
| 163 | +end |
0 commit comments