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

Commit da6706d

Browse files
committed
feat(data/mv_polynomial/basic): lemmas about map (#10092)
This adds `map_alg_hom`, which fills the gap between `map` and `map_alg_equiv`. The only new proof here is `map_surjective`; everything else is just a reworked existing proof.
1 parent 80dc445 commit da6706d

File tree

2 files changed

+43
-17
lines changed

2 files changed

+43
-17
lines changed

src/data/mv_polynomial/basic.lean

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -846,6 +846,27 @@ begin
846846
exact hf (h m),
847847
end
848848

849+
lemma map_surjective (hf : function.surjective f) :
850+
function.surjective (map f : mv_polynomial σ R → mv_polynomial σ S₁) :=
851+
λ p, begin
852+
induction p using mv_polynomial.induction_on' with i fr a b ha hb,
853+
{ obtain ⟨r, rfl⟩ := hf fr,
854+
exact ⟨monomial i r, map_monomial _ _ _⟩, },
855+
{ obtain ⟨a, rfl⟩ := ha,
856+
obtain ⟨b, rfl⟩ := hb,
857+
exact ⟨a + b, ring_hom.map_add _ _ _⟩ },
858+
end
859+
860+
/-- If `f` is a left-inverse of `g` then `map f` is a left-inverse of `map g`. -/
861+
lemma map_left_inverse {f : R →+* S₁} {g : S₁ →+* R} (hf : function.left_inverse f g) :
862+
function.left_inverse (map f : mv_polynomial σ R → mv_polynomial σ S₁) (map g) :=
863+
λ x, by rw [map_map, (ring_hom.ext hf : f.comp g = ring_hom.id _), map_id]
864+
865+
/-- If `f` is a right-inverse of `g` then `map f` is a right-inverse of `map g`. -/
866+
lemma map_right_inverse {f : R →+* S₁} {g : S₁ →+* R} (hf : function.right_inverse f g) :
867+
function.right_inverse (map f : mv_polynomial σ R → mv_polynomial σ S₁) (map g) :=
868+
(map_left_inverse hf.left_inverse).right_inverse
869+
849870
@[simp] lemma eval_map (f : R →+* S₁) (g : σ → S₁) (p : mv_polynomial σ R) :
850871
eval g (map f p) = eval₂ f g p :=
851872
by { apply mv_polynomial.induction_on p; { simp { contextual := tt } } }
@@ -913,6 +934,22 @@ begin
913934
refl
914935
end
915936

937+
/-- If `f : S₁ →ₐ[R] S₂` is a morphism of `R`-algebras, then so is `mv_polynomial.map f`. -/
938+
@[simps]
939+
def map_alg_hom [comm_semiring S₂] [algebra R S₁] [algebra R S₂] (f : S₁ →ₐ[R] S₂) :
940+
mv_polynomial σ S₁ →ₐ[R] mv_polynomial σ S₂ :=
941+
{ to_fun := map ↑f,
942+
commutes' := λ r, begin
943+
have h₁ : algebra_map R (mv_polynomial σ S₁) r = C (algebra_map R S₁ r) := rfl,
944+
have h₂ : algebra_map R (mv_polynomial σ S₂) r = C (algebra_map R S₂ r) := rfl,
945+
rw [h₁, h₂, map, eval₂_hom_C, ring_hom.comp_apply, alg_hom.coe_to_ring_hom, alg_hom.commutes],
946+
end,
947+
..map ↑f }
948+
949+
@[simp] lemma map_alg_hom_id [algebra R S₁] :
950+
map_alg_hom (alg_hom.id R S₁) = alg_hom.id R (mv_polynomial σ S₁) :=
951+
alg_hom.ext map_id
952+
916953
end map
917954

918955

src/data/mv_polynomial/equiv.lean

Lines changed: 6 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -91,12 +91,8 @@ def map_equiv [comm_semiring S₁] [comm_semiring S₂] (e : S₁ ≃+* S₂) :
9191
mv_polynomial σ S₁ ≃+* mv_polynomial σ S₂ :=
9292
{ to_fun := map (e : S₁ →+* S₂),
9393
inv_fun := map (e.symm : S₂ →+* S₁),
94-
left_inv := λ p,
95-
have (e.symm : S₂ →+* S₁).comp ↑e = ring_hom.id _ := ring_hom.ext e.symm_apply_apply,
96-
by rw [map_map, this, map_id],
97-
right_inv := assume p,
98-
have (e : S₁ →+* S₂).comp ↑e.symm = ring_hom.id _ := ring_hom.ext e.apply_symm_apply,
99-
by rw [map_map, this, map_id],
94+
left_inv := map_left_inverse e.left_inv,
95+
right_inv := map_right_inverse e.right_inv,
10096
..map (e : S₁ →+* S₂) }
10197

10298
@[simp] lemma map_equiv_refl :
@@ -115,19 +111,12 @@ variables {A₁ A₂ A₃ : Type*} [comm_semiring A₁] [comm_semiring A₂] [co
115111
variables [algebra R A₁] [algebra R A₂] [algebra R A₃]
116112

117113
/-- If `e : A ≃ₐ[R] B` is an isomorphism of `R`-algebras, then so is `map e`. -/
114+
@[simps apply]
118115
def map_alg_equiv (e : A₁ ≃ₐ[R] A₂) :
119116
mv_polynomial σ A₁ ≃ₐ[R] mv_polynomial σ A₂ :=
120-
{ commutes' := λ r, begin
121-
dsimp,
122-
have h₁ : algebra_map R (mv_polynomial σ A₁) r = C (algebra_map R A₁ r) := rfl,
123-
have h₂ : algebra_map R (mv_polynomial σ A₂) r = C (algebra_map R A₂ r) := rfl,
124-
rw [h₁, h₂, map, eval₂_hom_C, ring_hom.comp_apply,
125-
ring_equiv.coe_to_ring_hom, alg_equiv.coe_ring_equiv, alg_equiv.commutes],
126-
end,
127-
..(map_equiv σ ↑e) }
128-
129-
@[simp] lemma map_alg_equiv_apply (e : A₁ ≃ₐ[R] A₂) (x : mv_polynomial σ A₁) :
130-
map_alg_equiv σ e x = map ↑e x := rfl
117+
{ to_fun := map (e : A₁ →+* A₂),
118+
..map_alg_hom (e : A₁ →ₐ[R] A₂),
119+
..map_equiv σ (e : A₁ ≃+* A₂) }
131120

132121
@[simp] lemma map_alg_equiv_refl :
133122
map_alg_equiv σ (alg_equiv.refl : A₁ ≃ₐ[R] A₁) = alg_equiv.refl :=

0 commit comments

Comments
 (0)