Skip to content
This repository was archived by the owner on Jul 24, 2024. It is now read-only.

Commit 09258fb

Browse files
datokrateric-wieser
andcommitted
feat(analysis/normed_space/affine_isometry, linear_algebra/affine_space/affine_equiv): restrict affine isometry to isometry equivalence (#17522)
The main result in this commit is `affine_subspace.isometry_equiv_map`: Given an affine isometry, each of its affine subspaces is affine isometry equivalent to its image. `isometry_equiv_map` returns this isometry equivalence. The two other most significant results that are proved on the way are: - `affine_subspace.equiv_map_of_injective`: Restricts an injective affine map to an affine equivalence of a subspace to its image (used by `isometry_equiv_map`) - `affine_equiv.of_bijective`: obtain an affine equivalence from a bijective affine map The construction uses the new definition `affine_equiv.of_bijective` that makes an affine equivalence of a bijective affine map. Co-authored-by: Eric Wieser <wieser.eric@gmail.com> Co-authored-by: Yaël Dillies <yael.dillies@gmail.com> Co-authored-by: Eric Wieser <wieser.eric@gmail.com>
1 parent 717c132 commit 09258fb

File tree

8 files changed

+79
-7
lines changed

8 files changed

+79
-7
lines changed

src/analysis/convex/side.lean

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ begin
7575
rcases hfp₁ with ⟨p₁, hp₁, rfl⟩,
7676
rcases hfp₂ with ⟨p₂, hp₂, rfl⟩,
7777
refine ⟨p₁, hp₁, p₂, hp₂, _⟩,
78-
simp_rw [←linear_map_vsub, (f.injective_iff_linear_injective.2 hf).same_ray_map_iff] at h,
78+
simp_rw [←linear_map_vsub, (f.linear_injective_iff.2 hf).same_ray_map_iff] at h,
7979
exact h
8080
end
8181

@@ -111,7 +111,7 @@ begin
111111
rcases hfp₁ with ⟨p₁, hp₁, rfl⟩,
112112
rcases hfp₂ with ⟨p₂, hp₂, rfl⟩,
113113
refine ⟨p₁, hp₁, p₂, hp₂, _⟩,
114-
simp_rw [←linear_map_vsub, (f.injective_iff_linear_injective.2 hf).same_ray_map_iff] at h,
114+
simp_rw [←linear_map_vsub, (f.linear_injective_iff.2 hf).same_ray_map_iff] at h,
115115
exact h
116116
end
117117

src/analysis/normed_space/add_torsor_bases.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ include E
3333
lemma is_open_map_barycentric_coord [nontrivial ι] (b : affine_basis ι 𝕜 P) (i : ι) :
3434
is_open_map (b.coord i) :=
3535
affine_map.is_open_map_linear_iff.mp $ (b.coord i).linear.is_open_map_of_finite_dimensional $
36-
(b.coord i).surjective_iff_linear_surjective.mpr (b.surjective_coord i)
36+
(b.coord i).linear_surjective_iff.mpr (b.surjective_coord i)
3737

3838
variables [finite_dimensional 𝕜 E] (b : affine_basis ι 𝕜 P)
3939

src/analysis/normed_space/affine_isometry.lean

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ Authors: Heather Macbeth
66
import analysis.normed_space.linear_isometry
77
import analysis.normed.group.add_torsor
88
import analysis.normed_space.basic
9+
import linear_algebra.affine_space.restrict
910

1011
/-!
1112
# Affine isometries
@@ -587,3 +588,54 @@ begin
587588
rw this,
588589
simp only [homeomorph.comp_is_open_map_iff, homeomorph.comp_is_open_map_iff'],
589590
end
591+
592+
local attribute [instance, nolint fails_quickly] affine_subspace.nonempty_map
593+
594+
include V₁
595+
omit V
596+
597+
namespace affine_subspace
598+
599+
/--
600+
An affine subspace is isomorphic to its image under an injective affine map.
601+
This is the affine version of `submodule.equiv_map_of_injective`.
602+
-/
603+
@[simps]
604+
noncomputable def equiv_map_of_injective (E: affine_subspace 𝕜 P₁) [nonempty E]
605+
(φ : P₁ →ᵃ[𝕜] P₂) (hφ : function.injective φ) : E ≃ᵃ[𝕜] E.map φ :=
606+
{ linear :=
607+
(E.direction.equiv_map_of_injective φ.linear (φ.linear_injective_iff.mpr hφ)).trans
608+
(linear_equiv.of_eq _ _ (affine_subspace.map_direction _ _).symm),
609+
map_vadd' := λ p v, subtype.ext $ φ.map_vadd p v,
610+
.. equiv.set.image _ (E : set P₁) hφ }
611+
612+
/--
613+
Restricts an affine isometry to an affine isometry equivalence between a nonempty affine
614+
subspace `E` and its image.
615+
616+
This is an isometry version of `affine_subspace.equiv_map`, having a stronger premise and a stronger
617+
conclusion.
618+
-/
619+
noncomputable def isometry_equiv_map
620+
(φ : P₁ →ᵃⁱ[𝕜] P₂) (E : affine_subspace 𝕜 P₁) [nonempty E] : E ≃ᵃⁱ[𝕜] E.map φ.to_affine_map :=
621+
⟨E.equiv_map_of_injective φ.to_affine_map φ.injective, (λ _, φ.norm_map _)⟩
622+
623+
@[simp]
624+
lemma isometry_equiv_map.apply_symm_apply
625+
{E : affine_subspace 𝕜 P₁} [nonempty E]
626+
{φ : P₁ →ᵃⁱ[𝕜] P₂} (x : E.map φ.to_affine_map) :
627+
φ ((E.isometry_equiv_map φ).symm x) = x :=
628+
congr_arg coe $ (E.isometry_equiv_map φ).apply_symm_apply _
629+
630+
@[simp]
631+
lemma isometry_equiv_map.coe_apply
632+
(φ : P₁ →ᵃⁱ[𝕜] P₂) (E : affine_subspace 𝕜 P₁) [nonempty E] (g: E) :
633+
↑(E.isometry_equiv_map φ g) = φ g := rfl
634+
635+
@[simp]
636+
lemma isometry_equiv_map.to_affine_map_eq
637+
(φ : P₁ →ᵃⁱ[𝕜] P₂) (E : affine_subspace 𝕜 P₁) [nonempty E] :
638+
(E.isometry_equiv_map φ).to_affine_map = E.equiv_map_of_injective φ.to_affine_map φ.injective :=
639+
rfl
640+
641+
end affine_subspace

src/analysis/normed_space/banach.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -250,7 +250,7 @@ lemma _root_.affine_map.is_open_map {P Q : Type*}
250250
is_open_map f :=
251251
affine_map.is_open_map_linear_iff.mp $ continuous_linear_map.is_open_map
252252
{ cont := affine_map.continuous_linear_iff.mpr hf, .. f.linear }
253-
(f.surjective_iff_linear_surjective.mpr surj)
253+
(f.linear_surjective_iff.mpr surj)
254254

255255
/-! ### Applications of the Banach open mapping theorem -/
256256

src/linear_algebra/affine_space/affine_equiv.lean

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,16 @@ protected lemma bijective (e : P₁ ≃ᵃ[k] P₂) : bijective e := e.to_equiv.
160160
protected lemma surjective (e : P₁ ≃ᵃ[k] P₂) : surjective e := e.to_equiv.surjective
161161
protected lemma injective (e : P₁ ≃ᵃ[k] P₂) : injective e := e.to_equiv.injective
162162

163+
/-- Bijective affine maps are affine isomorphisms. -/
164+
@[simps]
165+
noncomputable def of_bijective {φ : P₁ →ᵃ[k] P₂} (hφ : function.bijective φ) : P₁ ≃ᵃ[k] P₂ :=
166+
{ linear := linear_equiv.of_bijective φ.linear (φ.linear_bijective_iff.mpr hφ),
167+
map_vadd' := φ.map_vadd,
168+
..(equiv.of_bijective _ hφ) }
169+
170+
lemma of_bijective.symm_eq {φ : P₁ →ᵃ[k] P₂} (hφ : function.bijective φ) :
171+
(of_bijective hφ).symm.to_equiv = (equiv.of_bijective _ hφ).symm := rfl
172+
163173
@[simp] lemma range_eq (e : P₁ ≃ᵃ[k] P₂) : range e = univ := e.surjective.range_eq
164174

165175
@[simp] lemma apply_symm_apply (e : P₁ ≃ᵃ[k] P₂) (p : P₂) : e (e.symm p) = p :=

src/linear_algebra/affine_space/affine_map.lean

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -328,7 +328,7 @@ instance : monoid (P1 →ᵃ[k] P1) :=
328328

329329
include V2
330330

331-
@[simp] lemma injective_iff_linear_injective (f : P1 →ᵃ[k] P2) :
331+
@[simp] lemma linear_injective_iff (f : P1 →ᵃ[k] P2) :
332332
function.injective f.linear ↔ function.injective f :=
333333
begin
334334
obtain ⟨p⟩ := (infer_instance : nonempty P1),
@@ -337,7 +337,7 @@ begin
337337
rw [h, equiv.comp_injective, equiv.injective_comp],
338338
end
339339

340-
@[simp] lemma surjective_iff_linear_surjective (f : P1 →ᵃ[k] P2) :
340+
@[simp] lemma linear_surjective_iff (f : P1 →ᵃ[k] P2) :
341341
function.surjective f.linear ↔ function.surjective f :=
342342
begin
343343
obtain ⟨p⟩ := (infer_instance : nonempty P1),
@@ -346,6 +346,10 @@ begin
346346
rw [h, equiv.comp_surjective, equiv.surjective_comp],
347347
end
348348

349+
@[simp] lemma linear_bijective_iff (f : P1 →ᵃ[k] P2) :
350+
function.bijective f.linear ↔ function.bijective f :=
351+
and_congr f.linear_injective_iff f.linear_surjective_iff
352+
349353
lemma image_vsub_image {s t : set P1} (f : P1 →ᵃ[k] P2) :
350354
(f '' s) -ᵥ (f '' t) = f.linear '' (s -ᵥ t) :=
351355
begin

src/linear_algebra/affine_space/independent.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -365,7 +365,7 @@ begin
365365
rw affine_independent_iff_linear_independent_vsub k p i at hai,
366366
simp_rw [affine_independent_iff_linear_independent_vsub k (f ∘ p) i, function.comp_app,
367367
← f.linear_map_vsub],
368-
have hf' : f.linear.ker = ⊥, { rwa [linear_map.ker_eq_bot, f.injective_iff_linear_injective], },
368+
have hf' : f.linear.ker = ⊥, { rwa [linear_map.ker_eq_bot, f.linear_injective_iff], },
369369
exact linear_independent.map' hai f.linear hf',
370370
end
371371

src/linear_algebra/affine_space/restrict.lean

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,3 +99,9 @@ begin
9999
obtain ⟨y, hy, rfl⟩ := hx,
100100
exact ⟨⟨y, hy⟩, rfl⟩,
101101
end
102+
103+
lemma affine_map.restrict.bijective
104+
{E : affine_subspace k P₁} [nonempty E]
105+
{φ : P₁ →ᵃ[k] P₂} (hφ : function.injective φ) :
106+
function.bijective (φ.restrict (le_refl (E.map φ))) :=
107+
⟨affine_map.restrict.injective hφ _, affine_map.restrict.surjective _ rfl⟩

0 commit comments

Comments
 (0)