Skip to content

Commit ea162bb

Browse files
committed
feat: more connections between TensorProduct and map₂ (#29391)
The new lemmas about `map₂` are analogous to the lemmas about `Set.image2`.
1 parent 07e4315 commit ea162bb

File tree

4 files changed

+50
-10
lines changed

4 files changed

+50
-10
lines changed

Mathlib/Algebra/Lie/TensorProduct.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,7 @@ theorem lieIdeal_oper_eq_tensor_map_range :
192192
⁅I, N⁆ = ((toModuleHom R L M).comp (mapIncl I N : I ⊗[R] N →ₗ⁅R,L⁆ L ⊗[R] M)).range := by
193193
rw [← toSubmodule_inj, lieIdeal_oper_eq_linear_span, LieModuleHom.toSubmodule_range,
194194
LieModuleHom.toLinearMap_comp, LinearMap.range_comp, mapIncl_def, toLinearMap_map,
195-
TensorProduct.map_range_eq_span_tmul, Submodule.map_span]
195+
TensorProduct.range_map_eq_span_tmul, Submodule.map_span]
196196
congr; ext m; constructor
197197
· rintro ⟨⟨x, hx⟩, ⟨n, hn⟩, rfl⟩; use x ⊗ₜ n; constructor
198198
· use ⟨x, hx⟩, ⟨n, hn⟩; rfl

Mathlib/Algebra/Module/Submodule/Bilinear.lean

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@ This file provides `Submodule.map₂`, which is later used to implement `Submodu
2020
2121
This file is quite similar to the n-ary section of `Data.Set.Basic` and to `Order.Filter.NAry`.
2222
Please keep them in sync.
23+
24+
## TODO
25+
26+
Generalize this file to semilinear maps.
2327
-/
2428

2529

@@ -147,4 +151,33 @@ theorem map₂_span_singleton_eq_map (f : M →ₗ[R] N →ₗ[R] P) (m : M) :
147151
theorem map₂_span_singleton_eq_map_flip (f : M →ₗ[R] N →ₗ[R] P) (s : Submodule R M) (n : N) :
148152
map₂ f s (span R {n}) = map (f.flip n) s := by rw [← map₂_span_singleton_eq_map, map₂_flip]
149153

154+
section comp
155+
variable {M₂ N₂ P₂ : Type*}
156+
variable [AddCommMonoid M₂] [AddCommMonoid N₂] [AddCommMonoid P₂]
157+
variable [Module R M₂] [Module R N₂] [Module R P₂]
158+
159+
theorem map_map₂ (f : P →ₗ[R] P₂) (g : M →ₗ[R] N →ₗ[R] P) (p : Submodule R M) (q : Submodule R N) :
160+
map f (map₂ g p q) = map₂ (g.compr₂ f) p q :=
161+
map_iSup _ _ |>.trans <| iSup_congr fun _ => map_comp _ _ _ |>.symm
162+
163+
theorem map₂_map_right
164+
(f : M →ₗ[R] N₂ →ₗ[R] P) (g : N →ₗ[R] N₂) (p : Submodule R M) (q : Submodule R N) :
165+
map₂ f p (map g q) = map₂ (f.compl₂ g) p q :=
166+
iSup_congr fun _ => map_comp _ _ _ |>.symm
167+
168+
theorem map₂_map_left
169+
(f : M₂ →ₗ[R] N →ₗ[R] P) (g : M →ₗ[R] M₂) (p : Submodule R M) (q : Submodule R N) :
170+
map₂ f (map g p) q = map₂ (f ∘ₗ g) p q := by
171+
rw [← map₂_flip, map₂_map_right, ← map₂_flip]
172+
rfl
173+
174+
theorem map₂_map_map
175+
(f : M₂ →ₗ[R] N₂ →ₗ[R] P) (g : M →ₗ[R] M₂) (h : N →ₗ[R] N₂)
176+
(p : Submodule R M) (q : Submodule R N) :
177+
map₂ f (map g p) (map h q) = map₂ (f.compl₁₂ g h) p q := by
178+
rw [map₂_map_right, map₂_map_left]
179+
rfl
180+
181+
end comp
182+
150183
end Submodule

Mathlib/LinearAlgebra/TensorProduct/Basic.lean

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -731,27 +731,34 @@ lemma map_comm (f : M →ₗ[R] P) (g : N →ₗ[R] Q) (x : N ⊗[R] M) :
731731
map f g (TensorProduct.comm R N M x) = TensorProduct.comm R Q P (map g f x) :=
732732
DFunLike.congr_fun (map_comp_comm_eq _ _) _
733733

734-
theorem map_range_eq_span_tmul (f : M →ₗ[R] P) (g : N →ₗ[R] Q) :
734+
theorem range_map (f : M →ₗ[R] P) (g : N →ₗ[R] Q) :
735+
range (map f g) = .map₂ (mk R _ _) (range f) (range g) := by
736+
simp_rw [← Submodule.map_top, Submodule.map₂_map_map, ← map₂_mk_top_top_eq_top,
737+
Submodule.map_map₂]
738+
rfl
739+
740+
theorem range_map_eq_span_tmul (f : M →ₗ[R] P) (g : N →ₗ[R] Q) :
735741
range (map f g) = Submodule.span R { t | ∃ m n, f m ⊗ₜ g n = t } := by
736742
simp only [← Submodule.map_top, ← span_tmul_eq_top, Submodule.map_span]
737743
congr; ext t
738744
simp
739745

746+
@[deprecated (since := "2025-09-07")] alias map_range_eq_span_tmul := range_map_eq_span_tmul
747+
740748
/-- Given submodules `p ⊆ P` and `q ⊆ Q`, this is the natural map: `p ⊗ q → P ⊗ Q`. -/
741749
@[simp]
742750
def mapIncl (p : Submodule R P) (q : Submodule R Q) : p ⊗[R] q →ₗ[R] P ⊗[R] Q :=
743751
map p.subtype q.subtype
744752

745753
lemma range_mapIncl (p : Submodule R P) (q : Submodule R Q) :
746-
LinearMap.range (mapIncl p q) = Submodule.span R (Set.image2 (· ⊗ₜ ·) p q) := by
747-
rw [mapIncl, map_range_eq_span_tmul]
748-
congr; ext; simp
754+
LinearMap.range (mapIncl p q) = .map₂ (mk R _ _) p q := by
755+
simp_rw [mapIncl, range_map, Submodule.range_subtype]
749756

750757
theorem map₂_eq_range_lift_comp_mapIncl (f : P →ₗ[R] Q →ₗ[R] M)
751758
(p : Submodule R P) (q : Submodule R Q) :
752759
Submodule.map₂ f p q = LinearMap.range (lift f ∘ₗ mapIncl p q) := by
753-
simp_rw [LinearMap.range_comp, range_mapIncl, Submodule.map_span,
754-
Set.image_image2, Submodule.map₂_eq_span_image2, lift.tmul]
760+
simp_rw [LinearMap.range_comp, range_mapIncl, Submodule.map_map₂]
761+
rfl
755762

756763
section
757764

@@ -772,7 +779,7 @@ lemma map_map (f₂ : M₂ →ₗ[R] M₃) (g₂ : N₂ →ₗ[R] N₃) (f₁ :
772779
lemma range_mapIncl_mono {p p' : Submodule R P} {q q' : Submodule R Q} (hp : p ≤ p') (hq : q ≤ q') :
773780
LinearMap.range (mapIncl p q) ≤ LinearMap.range (mapIncl p' q') := by
774781
simp_rw [range_mapIncl]
775-
exact Submodule.span_mono (Set.image2_subset hp hq)
782+
exact Submodule.map₂_le_map₂ hp hq
776783

777784
theorem lift_comp_map (i : P →ₗ[R] Q →ₗ[R] Q') (f : M →ₗ[R] P) (g : N →ₗ[R] Q) :
778785
(lift i).comp (map f g) = lift ((i.comp f).compl₂ g) :=

Mathlib/LinearAlgebra/TensorProduct/Quotient.lean

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ noncomputable def quotientTensorEquiv (m : Submodule R M) :
106106
simp only [Submodule.map_sup]
107107
erw [Submodule.map_id, Submodule.map_id]
108108
simp only [sup_eq_left]
109-
rw [map_range_eq_span_tmul, map_range_eq_span_tmul]
109+
rw [range_map_eq_span_tmul, range_map_eq_span_tmul]
110110
simp)
111111

112112
@[simp]
@@ -136,7 +136,7 @@ noncomputable def tensorQuotientEquiv (n : Submodule R N) :
136136
simp only [Submodule.map_sup]
137137
erw [Submodule.map_id, Submodule.map_id]
138138
simp only [sup_eq_right]
139-
rw [map_range_eq_span_tmul, map_range_eq_span_tmul]
139+
rw [range_map_eq_span_tmul, range_map_eq_span_tmul]
140140
simp)
141141

142142
@[simp]

0 commit comments

Comments
 (0)