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

Commit ba9c8f3

Browse files
committed
feat(ring_theory/tensor_product): A predicate for being the tensor product. (#15512)
1 parent f746956 commit ba9c8f3

File tree

1 file changed

+191
-0
lines changed

1 file changed

+191
-0
lines changed
Lines changed: 191 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,191 @@
1+
/-
2+
Copyright (c) 2022 Andrew Yang. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Andrew Yang
5+
-/
6+
7+
import ring_theory.tensor_product
8+
9+
/-!
10+
# The characteristice predicate of tensor product
11+
12+
## Main definitions
13+
14+
- `is_tensor_product`: A predicate on `f : M₁ →ₗ[R] M₂ →ₗ[R] M` expressing that `f` realizes `M` as
15+
the tensor product of `M₁ ⊗[R] M₂`. This is defined by requiring the lift `M₁ ⊗[R] M₂ → M` to be
16+
bijective.
17+
- `is_base_change`: A predicate on an `R`-algebra `S` and a map `f : M →ₗ[R] N` with `N` being a
18+
`S`-module, expressing that `f` realizes `N` as the base change of `M` along `R → S`.
19+
20+
## Main results
21+
- `tensor_product.is_base_change`: `S ⊗[R] M` is the base change of `M` along `R → S`.
22+
23+
-/
24+
25+
universes u v₁ v₂ v₃ v₄
26+
27+
open_locale tensor_product
28+
29+
open tensor_product
30+
31+
section is_tensor_product
32+
33+
variables {R : Type*} [comm_ring R]
34+
variables {M₁ M₂ M M' : Type*}
35+
variables [add_comm_monoid M₁] [add_comm_monoid M₂] [add_comm_monoid M] [add_comm_monoid M']
36+
variables [module R M₁] [module R M₂] [module R M] [module R M']
37+
variable (f : M₁ →ₗ[R] M₂ →ₗ[R] M)
38+
variables {N₁ N₂ N : Type*} [add_comm_monoid N₁] [add_comm_monoid N₂] [add_comm_monoid N]
39+
variables [module R N₁] [module R N₂] [module R N]
40+
variable {g : N₁ →ₗ[R] N₂ →ₗ[R] N}
41+
42+
/--
43+
Given a bilinear map `f : M₁ →ₗ[R] M₂ →ₗ[R] M`, `is_tensor_product f` means that
44+
`M` is the tensor product of `M₁` and `M₂` via `f`.
45+
This is defined by requiring the lift `M₁ ⊗[R] M₂ → M` to be bijective.
46+
-/
47+
def is_tensor_product : Prop := function.bijective (tensor_product.lift f)
48+
49+
variables (R M N) {f}
50+
51+
lemma tensor_product.is_tensor_product : is_tensor_product (tensor_product.mk R M N) :=
52+
begin
53+
delta is_tensor_product,
54+
convert_to function.bijective linear_map.id using 2,
55+
{ apply tensor_product.ext', simp },
56+
{ exact function.bijective_id }
57+
end
58+
59+
variables {R M N}
60+
61+
/-- If `M` is the tensor product of `M₁` and `M₂`, it is linearly equivalent to `M₁ ⊗[R] M₂`. -/
62+
@[simps apply] noncomputable
63+
def is_tensor_product.equiv (h : is_tensor_product f) : M₁ ⊗[R] M₂ ≃ₗ[R] M :=
64+
linear_equiv.of_bijective _ h.1 h.2
65+
66+
@[simp] lemma is_tensor_product.equiv_to_linear_map (h : is_tensor_product f) :
67+
h.equiv.to_linear_map = tensor_product.lift f := rfl
68+
69+
@[simp] lemma is_tensor_product.equiv_symm_apply (h : is_tensor_product f) (x₁ : M₁) (x₂ : M₂) :
70+
h.equiv.symm (f x₁ x₂) = x₁ ⊗ₜ x₂ :=
71+
begin
72+
apply h.equiv.injective,
73+
refine (h.equiv.apply_symm_apply _).trans _,
74+
simp
75+
end
76+
77+
/-- If `M` is the tensor product of `M₁` and `M₂`, we may lift a bilinear map `M₁ →ₗ[R] M₂ →ₗ[R] M'`
78+
to a `M →ₗ[R] M'`. -/
79+
noncomputable
80+
def is_tensor_product.lift (h : is_tensor_product f) (f' : M₁ →ₗ[R] M₂ →ₗ[R] M') : M →ₗ[R] M' :=
81+
(tensor_product.lift f').comp h.equiv.symm.to_linear_map
82+
83+
lemma is_tensor_product.lift_eq (h : is_tensor_product f) (f' : M₁ →ₗ[R] M₂ →ₗ[R] M')
84+
(x₁ : M₁) (x₂ : M₂) : h.lift f' (f x₁ x₂) = f' x₁ x₂ :=
85+
begin
86+
delta is_tensor_product.lift,
87+
simp,
88+
end
89+
90+
/-- The tensor product of a pair of linear maps between modules. -/
91+
noncomputable
92+
def is_tensor_product.map (hf : is_tensor_product f) (hg : is_tensor_product g)
93+
(i₁ : M₁ →ₗ[R] N₁) (i₂ : M₂ →ₗ[R] N₂) : M →ₗ[R] N :=
94+
hg.equiv.to_linear_map.comp ((tensor_product.map i₁ i₂).comp hf.equiv.symm.to_linear_map)
95+
96+
lemma is_tensor_product.map_eq (hf : is_tensor_product f) (hg : is_tensor_product g)
97+
(i₁ : M₁ →ₗ[R] N₁) (i₂ : M₂ →ₗ[R] N₂) (x₁ : M₁) (x₂ : M₂) :
98+
hf.map hg i₁ i₂ (f x₁ x₂) = g (i₁ x₁) (i₂ x₂) :=
99+
begin
100+
delta is_tensor_product.map,
101+
simp
102+
end
103+
104+
lemma is_tensor_product.induction_on (h : is_tensor_product f) {C : M → Prop}
105+
(m : M) (h0 : C 0) (htmul : ∀ x y, C (f x y)) (hadd : ∀ x y, C x → C y → C (x + y)) : C m :=
106+
begin
107+
rw ← h.equiv.right_inv m,
108+
generalize : h.equiv.inv_fun m = y,
109+
change C (tensor_product.lift f y),
110+
induction y using tensor_product.induction_on,
111+
{ rwa map_zero },
112+
{ rw tensor_product.lift.tmul, apply htmul },
113+
{ rw map_add, apply hadd; assumption }
114+
end
115+
116+
end is_tensor_product
117+
118+
section is_base_change
119+
120+
variables {R M N : Type*} (S : Type*) [add_comm_monoid M] [add_comm_monoid N] [comm_ring R]
121+
variables [comm_ring S] [algebra R S] [module R M] [module R N] [module S N] [is_scalar_tower R S N]
122+
variables (f : M →ₗ[R] N)
123+
124+
include f
125+
126+
/-- Given an `R`-algebra `S` and an `R`-module `M`, an `S`-module `N` together with a map
127+
`f : M →ₗ[R] N` is the base change of `M` to `S` if the map `S × M → N, (s, m) ↦ s • f m` is the
128+
tensor product. -/
129+
def is_base_change : Prop := is_tensor_product
130+
(((algebra.of_id S $ module.End S (M →ₗ[R] N)).to_linear_map.flip f).restrict_scalars R)
131+
132+
variables {S f} (h : is_base_change S f)
133+
variables {P Q : Type*} [add_comm_monoid P] [module R P]
134+
variables[add_comm_monoid Q] [module R Q] [module S Q] [is_scalar_tower R S Q]
135+
136+
/-- Suppose `f : M →ₗ[R] N` is the base change of `M` along `R → S`. Then any `R`-linear map from
137+
`M` to an `S`-module factors thorugh `f`. -/
138+
noncomputable
139+
def is_base_change.lift (g : M →ₗ[R] Q) : N →ₗ[S] Q :=
140+
{ map_smul' := λ r x, begin
141+
let F := ((algebra.of_id S $ module.End S (M →ₗ[R] Q))
142+
.to_linear_map.flip g).restrict_scalars R,
143+
have hF : ∀ (s : S) (m : M), h.lift F (s • f m) = s • g m := h.lift_eq F,
144+
change h.lift F (r • x) = r • h.lift F x,
145+
apply h.induction_on x,
146+
{ rw [smul_zero, map_zero, smul_zero] },
147+
{ intros s m,
148+
change h.lift F (r • s • f m) = r • h.lift F (s • f m),
149+
rw [← mul_smul, hF, hF, mul_smul] },
150+
{ intros x₁ x₂ e₁ e₂, rw [map_add, smul_add, map_add, smul_add, e₁, e₂] }
151+
end,
152+
..(h.lift (((algebra.of_id S $ module.End S (M →ₗ[R] Q))
153+
.to_linear_map.flip g).restrict_scalars R)) }
154+
155+
lemma is_base_change.lift_eq (g : M →ₗ[R] Q) (x : M) : h.lift g (f x) = g x :=
156+
begin
157+
have hF : ∀ (s : S) (m : M), h.lift g (s • f m) = s • g m := h.lift_eq _,
158+
convert hF 1 x; rw one_smul,
159+
end
160+
161+
lemma is_base_change.lift_comp (g : M →ₗ[R] Q) : ((h.lift g).restrict_scalars R).comp f = g :=
162+
linear_map.ext (h.lift_eq g)
163+
164+
variables (R M N S)
165+
166+
omit f
167+
168+
lemma tensor_product.is_base_change : is_base_change S (tensor_product.mk R S M 1) :=
169+
begin
170+
delta is_base_change,
171+
convert tensor_product.is_tensor_product R S M using 1,
172+
ext s x,
173+
change s • 1 ⊗ₜ x = s ⊗ₜ x,
174+
rw tensor_product.smul_tmul',
175+
congr' 1,
176+
exact mul_one _,
177+
end
178+
179+
variables {R M N S}
180+
181+
/-- The base change of `M` along `R → S` is linearly equivalent to `S ⊗[R] M`. -/
182+
noncomputable
183+
def is_base_change.equiv : S ⊗[R] M ≃ₗ[R] N := h.equiv
184+
185+
lemma is_base_change.equiv_tmul (s : S) (m : M) : h.equiv (s ⊗ₜ m) = s • (f m) :=
186+
tensor_product.lift.tmul s m
187+
188+
lemma is_base_change.equiv_symm_apply (m : M) : h.equiv.symm (f m) = 1 ⊗ₜ m :=
189+
by rw [h.equiv.symm_apply_eq, h.equiv_tmul, one_smul]
190+
191+
end is_base_change

0 commit comments

Comments
 (0)