|
| 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