Skip to content

Commit 242077a

Browse files
feat(LinearAlgebra/AffineSpace): affine maps/equivs determined by values on spanning sets (#30949)
This PR adds extensionality lemmas showing that affine maps and equivalences are uniquely determined by their values on any set that affinely spans the entire space. All theorems are in `Mathlib.LinearAlgebra.AffineSpace.AffineSubspace.Basic`: - `AffineMap.linear_eqOn_vectorSpan`: If two affine maps agree on a set, their linear parts agree on the vector span - `AffineMap.eqOn_affineSpan`: Two affine maps which agree on a set, agree on its affine span - `AffineMap.ext_on`: If two affine maps agree on a set that spans the entire space, they are equal - `AffineEquiv.ext_on`: If two affine equivalences agree on a set that spans the entire space, they are equal (generalized to work between different spaces) Extracted from #30854. Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com>
1 parent 8dd95fa commit 242077a

File tree

1 file changed

+30
-0
lines changed
  • Mathlib/LinearAlgebra/AffineSpace/AffineSubspace

1 file changed

+30
-0
lines changed

Mathlib/LinearAlgebra/AffineSpace/AffineSubspace/Basic.lean

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -594,10 +594,40 @@ theorem span_eq_top_of_surjective {s : Set P₁} (hf : Function.Surjective f)
594594
(h : affineSpan k s = ⊤) : affineSpan k (f '' s) = ⊤ := by
595595
rw [← AffineSubspace.map_span, h, map_top_of_surjective f hf]
596596

597+
/-- If two affine maps agree on a set, their linear parts agree on the vector span of that set. -/
598+
theorem linear_eqOn_vectorSpan {V₂ P₂ : Type*} [AddCommGroup V₂] [Module k V₂] [AddTorsor V₂ P₂]
599+
{s : Set P₁} {f g : P₁ →ᵃ[k] P₂}
600+
(h_agree : s.EqOn f g) : Set.EqOn f.linear g.linear (vectorSpan k s) := by
601+
simp only [vectorSpan_def]
602+
apply LinearMap.eqOn_span
603+
rintro - ⟨x, hx, y, hy, rfl⟩
604+
simp [h_agree hx, h_agree hy]
605+
606+
/-- Two affine maps which agree on a set, agree on its affine span. -/
607+
theorem eqOn_affineSpan {V₂ P₂ : Type*} [AddCommGroup V₂] [Module k V₂] [AddTorsor V₂ P₂]
608+
{s : Set P₁} {f g : P₁ →ᵃ[k] P₂}
609+
(h_agree : s.EqOn f g) : Set.EqOn f g (affineSpan k s) := by
610+
rcases s.eq_empty_or_nonempty with rfl | ⟨q, hq⟩; · simp
611+
rintro - ⟨x, hx, y, hy, rfl⟩
612+
simp [h_agree hx, linear_eqOn_vectorSpan h_agree hy]
613+
614+
/-- If two affine maps agree on a set that spans the entire space, then they are equal. -/
615+
theorem ext_on {V₂ P₂ : Type*} [AddCommGroup V₂] [Module k V₂] [AddTorsor V₂ P₂]
616+
{s : Set P₁} {f g : P₁ →ᵃ[k] P₂}
617+
(h_span : affineSpan k s = ⊤)
618+
(h_agree : s.EqOn f g) : f = g := by
619+
simpa [h_span] using eqOn_affineSpan h_agree
620+
597621
end AffineMap
598622

599623
namespace AffineEquiv
600624

625+
/-- If two affine equivalences agree on a set that spans the entire space, then they are equal. -/
626+
theorem ext_on {V₂ P₂ : Type*} [AddCommGroup V₂] [Module k V₂] [AddTorsor V₂ P₂]
627+
{s : Set P₁} (h_span : affineSpan k s = ⊤)
628+
(T₁ T₂ : P₁ ≃ᵃ[k] P₂) (h_agree : s.EqOn T₁ T₂) : T₁ = T₂ :=
629+
(AffineEquiv.toAffineMap_inj).mp <| AffineMap.ext_on h_span h_agree
630+
601631
section ofEq
602632
variable (S₁ S₂ : AffineSubspace k P₁) [Nonempty S₁] [Nonempty S₂]
603633

0 commit comments

Comments
 (0)