Skip to content

Commit a8dcab1

Browse files
ADedeckermichaellee94
authored andcommitted
feat: characterize when projections are almost 0 or almost id (leanprover-community#41038)
in the sense of `LinearMap.FiniteRangeSetoid`.
1 parent e0dcc21 commit a8dcab1

2 files changed

Lines changed: 34 additions & 0 deletions

File tree

Mathlib/Algebra/Module/LinearMap/FiniteRange.lean

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,13 @@ lemma equiv_iff_hasFiniteRange [IsNoetherianRing K] {u v : V →ₗ[K] V₂} :
235235
u ≈ v ↔ (u - v).HasFiniteRange := by
236236
rw [equiv_iff_hasNoetherianRange, hasNoetherianRange_iff_hasFiniteRange]
237237

238+
lemma equiv_zero_iff_hasNoetherianRange {u : V →ₗ[K] V₂} : u ≈ 0 ↔ u.HasNoetherianRange := by
239+
simp [equiv_iff_hasNoetherianRange]
240+
241+
lemma equiv_zero_iff_hasFiniteRange [IsNoetherianRing K] {u : V →ₗ[K] V₂} :
242+
u ≈ 0 ↔ u.HasFiniteRange := by
243+
simp [equiv_iff_hasFiniteRange]
244+
238245
lemma equiv_iff_isNoetherian_quotient_eqLocus {u v : V →ₗ[K] V₂} :
239246
u ≈ v ↔ IsNoetherian K (V ⧸ eqLocus u v) := by
240247
rw [equiv_iff_hasNoetherianRange, hasNoetherianRange_iff_quotient_ker, eqLocus_eq_ker_sub]
@@ -269,6 +276,23 @@ lemma equiv_comp {u v : V →ₗ[K] V₂} {u' v' : V₂ →ₗ[K] V₃} (h : u
269276
u' ∘ₗ u ≈ v' ∘ₗ v := by
270277
grw [equiv_comp_right h', equiv_comp_left h]
271278

279+
lemma projection_equiv_zero_iff_isNoetherian {S T : Submodule K V} (hST : IsCompl S T) :
280+
S.projection T hST ≈ 0 ↔ IsNoetherian K S := by
281+
rw [equiv_zero_iff_hasNoetherianRange, hasNoetherianRange_iff_range, range_projection]
282+
283+
lemma projection_equiv_zero {S T : Submodule K V} [IsNoetherian K S] (hST : IsCompl S T) :
284+
S.projection T hST ≈ 0 :=
285+
projection_equiv_zero_iff_isNoetherian hST |>.mpr inferInstance
286+
287+
lemma projection_equiv_id_iff_isNoetherian {S T : Submodule K V} (hST : IsCompl S T) :
288+
S.projection T hST ≈ id ↔ IsNoetherian K T := by
289+
rw [Setoid.comm, equiv_iff_hasNoetherianRange, ← projection_eq_id_sub_projection,
290+
hasNoetherianRange_iff_range, range_projection]
291+
292+
lemma projection_equiv_id {S T : Submodule K V} [IsNoetherian K T] (hST : IsCompl S T) :
293+
S.projection T hST ≈ id :=
294+
projection_equiv_id_iff_isNoetherian hST |>.mpr inferInstance
295+
272296
end FiniteRangeSetoid
273297

274298
end Setoid
@@ -432,6 +456,13 @@ lemma IsQuasiInverse.of_comp_right {u : V →ₗ[K] V₂} {v : V₂ →ₗ[K] V
432456
(w ∘ₗ v).IsQuasiInverse u :=
433457
⟨hw.1, IsRightQuasiInverse.of_comp_right hv.1 hw.2
434458

459+
lemma isQuasiInverse_subtype_projectionOnto {S T : Submodule K V} [IsNoetherian K T]
460+
(hST : IsCompl S T) :
461+
IsQuasiInverse S.subtype (S.projectionOnto T hST) := by
462+
constructor
463+
· grw [IsLeftQuasiInverse, ← FiniteRangeSetoid.projection_equiv_id hST, projection]
464+
· simp [IsRightQuasiInverse, projectionOnto_comp_subtype]
465+
435466
end QuasiInverse
436467

437468
end LinearMap

Mathlib/Data/Setoid/Basic.lean

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,9 @@ theorem trans' (r : Setoid α) : ∀ {x y z}, r x y → r y z → r x z := r.ise
6969
theorem comm' (s : Setoid α) {x y} : s x y ↔ s y x :=
7070
⟨s.symm', s.symm'⟩
7171

72+
theorem comm [Setoid α] {x y : α} : x ≈ y ↔ y ≈ x :=
73+
⟨Setoid.symm, Setoid.symm⟩
74+
7275
open scoped Function -- required for scoped `on` notation
7376

7477
/-- The kernel of a function is an equivalence relation. -/

0 commit comments

Comments
 (0)