11/-
22Copyright (c) 2017 Johannes Hölzl. All rights reserved.
33Released under Apache 2.0 license as described in the file LICENSE.
4- Authors: Johannes Hölzl, Johan Commelin, Mario Carneiro
4+ Authors: Johannes Hölzl, Johan Commelin, Mario Carneiro, Elias Judin
55-/
66module
77
88public import Mathlib.Algebra.BigOperators.Finsupp.Fin
9+ public import Mathlib.Algebra.MonoidAlgebra.Basic
910public import Mathlib.Algebra.MvPolynomial.Degrees
1011public import Mathlib.Algebra.MvPolynomial.Rename
1112public import Mathlib.Algebra.Polynomial.AlgebraMap
12- public import Mathlib.Algebra.MonoidAlgebra.Basic
1313public import Mathlib.Algebra.Polynomial.Degree.Lemmas
1414public import Mathlib.Data.Finsupp.Option
1515public import Mathlib.Logic.Equiv.Fin.Basic
@@ -62,24 +62,24 @@ section Equiv
6262
6363variable (R) [CommSemiring R]
6464
65- /-- The ring isomorphism between multivariable polynomials in a single variable and
66- polynomials over the ground ring.
67- -/
65+ /-- The algebra isomorphism between multivariable polynomials indexed by a type with a unique
66+ element and polynomials over the ground ring. -/
6867@[simps]
69- def pUnitAlgEquiv : MvPolynomial PUnit R ≃ₐ[R] R[X] where
68+ def uniqueAlgEquiv (σ : Type *) [Unique σ] : MvPolynomial σ R ≃ₐ[R] R[X] where
7069 toFun := eval₂ Polynomial.C fun _ => Polynomial.X
71- invFun := Polynomial.eval₂ MvPolynomial.C (X PUnit.unit )
70+ invFun := Polynomial.eval₂ MvPolynomial.C (X default )
7271 left_inv := by
73- let f : R[X] →+* MvPolynomial PUnit R := Polynomial.eval₂RingHom MvPolynomial.C (X PUnit.unit )
74- let g : MvPolynomial PUnit R →+* R[X] := eval₂Hom Polynomial.C fun _ => Polynomial.X
72+ let f : R[X] →+* MvPolynomial σ R := Polynomial.eval₂RingHom MvPolynomial.C (X default )
73+ let g : MvPolynomial σ R →+* R[X] := eval₂Hom Polynomial.C fun _ => Polynomial.X
7574 change ∀ p, f.comp g p = p
7675 apply is_id
7776 · ext a
7877 dsimp [f, g]
7978 rw [eval₂_C, Polynomial.eval₂_C]
80- · rintro ⟨⟩
79+ · intro i
8180 dsimp [f, g]
8281 rw [eval₂_X, Polynomial.eval₂_X]
82+ rw [← Unique.eq_default i]
8383 right_inv p :=
8484 Polynomial.induction_on p (fun a => by rw [Polynomial.eval₂_C, MvPolynomial.eval₂_C])
8585 (fun p q hp hq => by rw [Polynomial.eval₂_add, MvPolynomial.eval₂_add, hp, hq]) fun p n _ => by
@@ -89,15 +89,34 @@ def pUnitAlgEquiv : MvPolynomial PUnit R ≃ₐ[R] R[X] where
8989 map_add' _ _ := eval₂_add _ _
9090 commutes' _ := eval₂_C _ _ _
9191
92+ theorem uniqueAlgEquiv_monomial [Unique σ] {d : σ →₀ ℕ} {r : R} :
93+ (MvPolynomial.uniqueAlgEquiv R σ) (MvPolynomial.monomial d r)
94+ = Polynomial.monomial (d default) r := by
95+ simp [Polynomial.C_mul_X_pow_eq_monomial]
96+
97+ theorem uniqueAlgEquiv_symm_monomial [Unique σ] {d : σ →₀ ℕ} {r : R} :
98+ (MvPolynomial.uniqueAlgEquiv R σ).symm (Polynomial.monomial (d default) r)
99+ = MvPolynomial.monomial d r := by
100+ simp [MvPolynomial.monomial_eq]
101+
102+ /-- The algebra isomorphism between multivariable polynomials in a single variable and
103+ polynomials over the ground ring. -/
104+ @ [deprecated uniqueAlgEquiv (since := "2026-04-15" )]
105+ abbrev pUnitAlgEquiv := uniqueAlgEquiv (R := R) PUnit
106+
107+ set_option linter.deprecated false in
108+ @ [deprecated uniqueAlgEquiv_monomial (since := "2026-04-15" )]
92109theorem pUnitAlgEquiv_monomial {d : PUnit →₀ ℕ} {r : R} :
93110 MvPolynomial.pUnitAlgEquiv R (MvPolynomial.monomial d r)
94- = Polynomial.monomial (d ()) r := by
95- simp [Polynomial.C_mul_X_pow_eq_monomial]
111+ = Polynomial.monomial (d ()) r :=
112+ uniqueAlgEquiv_monomial _
96113
114+ set_option linter.deprecated false in
115+ @ [deprecated uniqueAlgEquiv_symm_monomial (since := "2026-04-15" )]
97116theorem pUnitAlgEquiv_symm_monomial {d : PUnit →₀ ℕ} {r : R} :
98117 (MvPolynomial.pUnitAlgEquiv R).symm (Polynomial.monomial (d ()) r)
99- = MvPolynomial.monomial d r := by
100- simp [MvPolynomial.monomial_eq]
118+ = MvPolynomial.monomial d r :=
119+ uniqueAlgEquiv_symm_monomial _
101120
102121section Map
103122
@@ -109,7 +128,8 @@ def mapEquiv [CommSemiring S₁] [CommSemiring S₂] (e : S₁ ≃+* S₂) :
109128 AddMonoidAlgebra.mapRingEquiv _ e
110129
111130@[simp]
112- lemma mapEquiv_apply [CommSemiring S₁] [CommSemiring S₂] (e : S₁ ≃+* S₂) (x : MvPolynomial σ S₁) :
131+ lemma mapEquiv_apply [CommSemiring S₁] [CommSemiring S₂] (e : S₁ ≃+* S₂)
132+ (x : MvPolynomial σ S₁) :
113133 mapEquiv σ e x = map e x := rfl
114134
115135@[simp]
@@ -134,7 +154,8 @@ def mapAlgEquiv (e : A₁ ≃ₐ[R] A₂) : MvPolynomial σ A₁ ≃ₐ[R] MvPol
134154 AddMonoidAlgebra.mapAlgEquiv _ _ e
135155
136156@[simp]
137- lemma mapAlgEquiv_apply (e : A₁ ≃ₐ[R] A₂) (x : MvPolynomial σ A₁) : mapAlgEquiv σ e x = map e x :=
157+ lemma mapAlgEquiv_apply (e : A₁ ≃ₐ[R] A₂) (x : MvPolynomial σ A₁) :
158+ mapAlgEquiv σ e x = map e x :=
138159 rfl
139160
140161@[simp]
@@ -156,29 +177,65 @@ section Eval
156177
157178variable {R S : Type *} [CommSemiring R] [CommSemiring S]
158179
180+ theorem eval₂_uniqueAlgEquiv [Unique σ] {f : MvPolynomial σ R} {φ : R →+* S}
181+ {a : σ → S} :
182+ ((MvPolynomial.uniqueAlgEquiv R σ) f : Polynomial R).eval₂ φ (a default) =
183+ f.eval₂ φ a := by
184+ simp only [MvPolynomial.uniqueAlgEquiv_apply]
185+ induction f using MvPolynomial.induction_on' with
186+ | monomial d r =>
187+ rw [← MvPolynomial.uniqueAlgEquiv_apply (R := R) (σ := σ), uniqueAlgEquiv_monomial]
188+ simp only [Polynomial.eval₂_monomial, eval₂_monomial]
189+ rw [Finsupp.unique_single d, Finsupp.prod_single_index]
190+ · simp
191+ · simp only [pow_zero]
192+ | add f g hf hg => simp only [eval₂_add, Polynomial.eval₂_add, hf, hg]
193+
194+ theorem eval₂_uniqueAlgEquiv_symm [Unique σ] {f : Polynomial R} {φ : R →+* S}
195+ {a : σ → S} :
196+ ((MvPolynomial.uniqueAlgEquiv R σ).symm f : MvPolynomial σ R).eval₂ φ a =
197+ f.eval₂ φ (a default) := by
198+ rw [(eval₂_uniqueAlgEquiv (R := R) (σ := σ) (f := (MvPolynomial.uniqueAlgEquiv R σ).symm f)
199+ (φ := φ) (a := a)).symm]
200+ rw [AlgEquiv.apply_symm_apply]
201+
202+ theorem eval₂_const_uniqueAlgEquiv_symm [Unique σ] {f : Polynomial R}
203+ {φ : R →+* S} {a : S} :
204+ ((MvPolynomial.uniqueAlgEquiv R σ).symm f : MvPolynomial σ R).eval₂ φ (fun _ ↦ a) =
205+ f.eval₂ φ a := by
206+ rw [eval₂_uniqueAlgEquiv_symm]
207+
208+ theorem eval₂_const_uniqueAlgEquiv [Unique σ] {f : MvPolynomial σ R}
209+ {φ : R →+* S} {a : S} :
210+ ((MvPolynomial.uniqueAlgEquiv R σ) f : Polynomial R).eval₂ φ a =
211+ f.eval₂ φ (fun _ ↦ a) := by
212+ rw [← eval₂_uniqueAlgEquiv]
213+
214+ set_option linter.deprecated false in
215+ @ [deprecated eval₂_uniqueAlgEquiv_symm (since := "2026-04-15" )]
159216theorem eval₂_pUnitAlgEquiv_symm {f : Polynomial R} {φ : R →+* S} {a : Unit → S} :
160217 ((MvPolynomial.pUnitAlgEquiv R).symm f : MvPolynomial Unit R).eval₂ φ a =
161- f.eval₂ φ (a ()) := by
162- simp only [MvPolynomial.pUnitAlgEquiv_symm_apply]
163- induction f using Polynomial.induction_on' with
164- | add f g hf hg => simp [hf, hg]
165- | monomial n r => simp
218+ f.eval₂ φ (a ()) :=
219+ eval₂_uniqueAlgEquiv_symm
166220
221+ set_option linter.deprecated false in
222+ @ [deprecated eval₂_const_uniqueAlgEquiv_symm (since := "2026-04-15" )]
167223theorem eval₂_const_pUnitAlgEquiv_symm {f : Polynomial R} {φ : R →+* S} {a : S} :
168224 ((MvPolynomial.pUnitAlgEquiv R).symm f : MvPolynomial Unit R).eval₂ φ (fun _ ↦ a) =
169- f.eval₂ φ a := by
170- rw [ eval₂_pUnitAlgEquiv_symm]
225+ f.eval₂ φ a :=
226+ eval₂_const_uniqueAlgEquiv_symm
171227
228+ set_option linter.deprecated false in
229+ @ [deprecated eval₂_uniqueAlgEquiv (since := "2026-04-15" )]
172230theorem eval₂_pUnitAlgEquiv {f : MvPolynomial PUnit R} {φ : R →+* S} {a : PUnit → S} :
173- ((MvPolynomial.pUnitAlgEquiv R) f : Polynomial R).eval₂ φ (a default) = f.eval₂ φ a := by
174- simp only [MvPolynomial.pUnitAlgEquiv_apply]
175- induction f using MvPolynomial.induction_on' with
176- | monomial d r => simp
177- | add f g hf hg => simp [hf, hg]
231+ ((MvPolynomial.pUnitAlgEquiv R) f : Polynomial R).eval₂ φ (a default) = f.eval₂ φ a :=
232+ eval₂_uniqueAlgEquiv
178233
234+ set_option linter.deprecated false in
235+ @ [deprecated eval₂_const_uniqueAlgEquiv (since := "2026-04-15" )]
179236theorem eval₂_const_pUnitAlgEquiv {f : MvPolynomial PUnit R} {φ : R →+* S} {a : S} :
180- ((MvPolynomial.pUnitAlgEquiv R) f : Polynomial R).eval₂ φ a = f.eval₂ φ (fun _ ↦ a) := by
181- rw [← eval₂_pUnitAlgEquiv]
237+ ((MvPolynomial.pUnitAlgEquiv R) f : Polynomial R).eval₂ φ a = f.eval₂ φ (fun _ ↦ a) :=
238+ eval₂_const_uniqueAlgEquiv
182239
183240end Eval
184241
@@ -788,7 +845,7 @@ lemma Polynomial.toMvPolynomial_X (i : σ) : X.toMvPolynomial i = MvPolynomial.X
788845
789846lemma Polynomial.toMvPolynomial_eq_rename_comp (i : σ) :
790847 toMvPolynomial (R := R) i =
791- (MvPolynomial.rename (fun _ : Unit ↦ i)).comp (MvPolynomial.pUnitAlgEquiv R ).symm := by
848+ (MvPolynomial.rename (fun _ : Unit ↦ i)).comp (MvPolynomial.uniqueAlgEquiv R Unit ).symm := by
792849 ext
793850 simp
794851
0 commit comments