Skip to content

Commit 53db35f

Browse files
committed
feat(RingTheory/Presentation): core of a presentation (#24794)
If `P` is a presentation of `S` as an `R`-algebra and `R₀` a subring of `R` containing the coefficients of the relations of `P`, then there exists an `R₀`-algebra `S₀` such that `S` is isomorphic to the base change of `S₀` to `R`. This is a tool to remove Noetherian hypothesis in certain situations.
1 parent f9996fc commit 53db35f

File tree

10 files changed

+256
-6
lines changed

10 files changed

+256
-6
lines changed

Mathlib.lean

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5506,6 +5506,7 @@ import Mathlib.RingTheory.Extension.Cotangent.Basic
55065506
import Mathlib.RingTheory.Extension.Cotangent.LocalizationAway
55075507
import Mathlib.RingTheory.Extension.Generators
55085508
import Mathlib.RingTheory.Extension.Presentation.Basic
5509+
import Mathlib.RingTheory.Extension.Presentation.Core
55095510
import Mathlib.RingTheory.Extension.Presentation.Submersive
55105511
import Mathlib.RingTheory.FilteredAlgebra.Basic
55115512
import Mathlib.RingTheory.Filtration

Mathlib/Algebra/Algebra/Subalgebra/Basic.lean

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -832,6 +832,11 @@ theorem algebraMap_mk {R A : Type*} [CommSemiring R] [CommSemiring A] [Semiring
832832
[Algebra R A] [Algebra A α] {S : Subalgebra R A} (a : A) (ha : a ∈ S) :
833833
algebraMap S α (⟨a, ha⟩ : S) = algebraMap A α a := rfl
834834

835+
@[simp]
836+
lemma algebraMap_apply {R A : Type*} [CommSemiring R] [CommSemiring A] [Algebra R A]
837+
(S : Subalgebra R A) (x : S) : algebraMap S A x = x :=
838+
rfl
839+
835840
@[simp]
836841
theorem rangeS_algebraMap {R A : Type*} [CommSemiring R] [CommSemiring A] [Algebra R A]
837842
(S : Subalgebra R A) : (algebraMap S A).rangeS = S.toSubsemiring := by
@@ -844,6 +849,11 @@ theorem range_algebraMap {R A : Type*} [CommRing R] [CommRing A] [Algebra R A]
844849
rw [algebraMap_eq, Algebra.algebraMap_self, RingHom.id_comp, ← toSubring_subtype,
845850
Subring.range_subtype]
846851

852+
@[simp]
853+
lemma setRange_algebraMap {R A : Type*} [CommSemiring R] [CommSemiring A] [Algebra R A]
854+
(S : Subalgebra R A) : Set.range (algebraMap S A) = (S : Set A) :=
855+
SetLike.ext'_iff.mp S.rangeS_algebraMap
856+
847857
instance noZeroSMulDivisors_top [NoZeroDivisors A] (S : Subalgebra R A) : NoZeroSMulDivisors S A :=
848858
fun {c} x h =>
849859
have : (c : A) = 0 ∨ x = 0 := eq_zero_or_eq_zero_of_mul_eq_zero h

Mathlib/Algebra/Algebra/Subalgebra/Tower.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ variable [IsScalarTower R S A] [IsScalarTower R S B]
7979
def restrictScalars (U : Subalgebra S A) : Subalgebra R A :=
8080
{ U with
8181
algebraMap_mem' := fun x ↦ by
82-
rw [algebraMap_apply R S A]
82+
rw [IsScalarTower.algebraMap_apply R S A]
8383
exact U.algebraMap_mem _ }
8484

8585
@[simp]

Mathlib/Algebra/Algebra/Tower.lean

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,17 @@ theorem restrictScalars_injective :
225225
Function.Injective (restrictScalars R : (A ≃ₐ[S] B) → A ≃ₐ[R] B) := fun _ _ h =>
226226
AlgEquiv.ext (AlgEquiv.congr_fun h :)
227227

228+
lemma restrictScalars_symm_apply (f : A ≃ₐ[S] B) (x : B) :
229+
(f.restrictScalars R).symm x = f.symm x := rfl
230+
231+
@[simp]
232+
lemma coe_restrictScalars_symm (f : A ≃ₐ[S] B) :
233+
((f.restrictScalars R).symm : B ≃+* A) = f.symm := rfl
234+
235+
@[simp]
236+
lemma coe_restrictScalars_symm' (f : A ≃ₐ[S] B) :
237+
((restrictScalars R f).symm : B → A) = f.symm := rfl
238+
228239
end AlgEquiv
229240

230241
end Homs

Mathlib/RingTheory/AlgebraicIndependent/Transcendental.lean

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ theorem sumElim_iff {ι'} {y : ι' → A} : AlgebraicIndependent R (Sum.elim y x
170170
· exact ⟨fun h ↦ (hx <| by apply h.comp _ Sum.inr_injective).elim, fun h ↦ (hx h.1).elim⟩
171171
let e := (sumAlgEquiv R ι' ι).trans (mapAlgEquiv _ hx.aevalEquiv)
172172
have : aeval (Sum.elim y x) = ((aeval y).restrictScalars R).comp e.toAlgHom := by
173-
ext (_ | _) <;> simp [e, algebraMap_aevalEquiv]
173+
ext (_ | _) <;> simp [e]
174174
simp_rw [hx, AlgebraicIndependent, this]; simp
175175

176176
theorem iff_adjoin_image (s : Set ι) :
@@ -205,7 +205,7 @@ theorem sumElim_of_tower {ι'} {y : ι' → A} (hxS : range x ⊆ range (algebra
205205
set Rx := adjoin R (range x)
206206
let _ : Algebra Rx S :=
207207
(e.symm.toAlgHom.comp <| Subalgebra.inclusion <| adjoin_le hxS).toAlgebra
208-
have : IsScalarTower Rx S A := .of_algebraMap_eq fun x ↦ show _ = (e (e.symm _)).1 by simp; rfl
208+
have : IsScalarTower Rx S A := .of_algebraMap_eq fun x ↦ show _ = (e (e.symm _)).1 by simp
209209
refine hx.sumElim (hy.restrictScalars (e.symm.injective.comp ?_))
210210
simpa only [AlgHom.coe_toRingHom] using Subalgebra.inclusion_injective _
211211

Lines changed: 204 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,204 @@
1+
/-
2+
Copyright (c) 2025 Christian Merten. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Christian Merten
5+
-/
6+
import Mathlib.RingTheory.Extension.Presentation.Basic
7+
8+
/-!
9+
# Presentations on subrings
10+
11+
In this file we establish the API for realising a presentation over a
12+
subring of `R`. We define a property `HasCoeffs R₀` for a presentation `P` to mean
13+
the (sub)ring `R₀` contains the coefficients of the relations of `P`.
14+
subring `R₀` of `R` that contains the coefficients of the relations
15+
In this case there exists a model of `S` over `R₀`, i.e., there exists an `R₀`-algebra `S₀`
16+
such that `S` is isomorphic to `R ⊗[R₀] S₀`.
17+
18+
If the presentation is finite, `R₀` may be chosen as a Noetherian ring. In this case,
19+
this API can be used to remove Noetherian hypothesis in certain cases.
20+
21+
-/
22+
23+
open TensorProduct
24+
25+
variable {R S ι σ : Type*} [CommRing R] [CommRing S] [Algebra R S]
26+
27+
variable {P : Algebra.Presentation R S ι σ}
28+
29+
namespace Algebra.Presentation
30+
31+
variable (P) in
32+
/-- The coefficients of a presentation are the coefficients of the relations. -/
33+
def coeffs : Set R := ⋃ (i : σ), (P.relation i).coeffs
34+
35+
lemma coeffs_relation_subset_coeffs (x : σ) :
36+
((P.relation x).coeffs : Set R) ⊆ P.coeffs :=
37+
Set.subset_iUnion_of_subset x (by simp)
38+
39+
lemma finite_coeffs [Finite σ] : P.coeffs.Finite :=
40+
Set.finite_iUnion fun _ ↦ Finset.finite_toSet _
41+
42+
variable (P) in
43+
/-- The core of a presentation is the subalgebra generated by the coefficients of the relations. -/
44+
def core : Subalgebra ℤ R := Algebra.adjoin _ P.coeffs
45+
46+
variable (P) in
47+
lemma coeffs_subset_core : P.coeffs ⊆ P.core := Algebra.subset_adjoin
48+
49+
lemma coeffs_relation_subset_core (x : σ) :
50+
((P.relation x).coeffs : Set R) ⊆ P.core :=
51+
subset_trans (P.coeffs_relation_subset_coeffs x) P.coeffs_subset_core
52+
53+
variable (P) in
54+
/-- The core coerced to a type for performance reasons. -/
55+
def Core : Type _ := P.core
56+
57+
instance : CommRing P.Core := fast_instance% (inferInstanceAs <| CommRing P.core)
58+
instance : Algebra P.Core R := fast_instance% (inferInstanceAs <| Algebra P.core R)
59+
instance : FaithfulSMul P.Core R := inferInstanceAs <| FaithfulSMul P.core R
60+
instance : Algebra P.Core S := fast_instance% (inferInstanceAs <| Algebra P.core S)
61+
instance : IsScalarTower P.Core R S := inferInstanceAs <| IsScalarTower P.core R S
62+
63+
instance [Finite σ] : FiniteType ℤ P.Core := .adjoin_of_finite P.finite_coeffs
64+
65+
variable (P) in
66+
/--
67+
A ring `R₀` has the coefficients of the presentation `P` if the coefficients of the relations of `P`
68+
lie in the image of `R₀` in `R`.
69+
The smallest subring of `R` satisfying this is given by `Algebra.Presentation.Core P`.
70+
-/
71+
class HasCoeffs (R₀ : Type*) [CommRing R₀] [Algebra R₀ R] [Algebra R₀ S]
72+
[IsScalarTower R₀ R S] where
73+
coeffs_subset_range : P.coeffs ⊆ Set.range (algebraMap R₀ R)
74+
75+
instance : P.HasCoeffs P.Core where
76+
coeffs_subset_range := by
77+
refine subset_trans P.coeffs_subset_core ?_
78+
simp [Core, Subalgebra.algebraMap_eq]
79+
80+
variable (R₀ : Type*) [CommRing R₀] [Algebra R₀ R] [Algebra R₀ S] [IsScalarTower R₀ R S]
81+
[P.HasCoeffs R₀]
82+
83+
lemma coeffs_subset_range : (P.coeffs : Set R) ⊆ Set.range (algebraMap R₀ R) :=
84+
HasCoeffs.coeffs_subset_range
85+
86+
lemma HasCoeffs.of_isScalarTower {R₁ : Type*} [CommRing R₁] [Algebra R₀ R₁] [Algebra R₁ R]
87+
[IsScalarTower R₀ R₁ R] [Algebra R₁ S] [IsScalarTower R₁ R S] :
88+
P.HasCoeffs R₁ := by
89+
refine ⟨subset_trans (P.coeffs_subset_range R₀) ?_⟩
90+
simp [IsScalarTower.algebraMap_eq R₀ R₁ R, RingHom.coe_comp, Set.range_comp]
91+
92+
instance (s : Set R) : P.HasCoeffs (Algebra.adjoin R₀ s) := HasCoeffs.of_isScalarTower R₀
93+
94+
lemma HasCoeffs.coeffs_relation_mem_range (x : σ) :
95+
↑(P.relation x).coeffs ⊆ Set.range (algebraMap R₀ R) :=
96+
subset_trans (P.coeffs_relation_subset_coeffs x) HasCoeffs.coeffs_subset_range
97+
98+
lemma HasCoeffs.relation_mem_range_map (x : σ) :
99+
P.relation x ∈ Set.range (MvPolynomial.map (algebraMap R₀ R)) := by
100+
rw [MvPolynomial.mem_range_map_iff_coeffs_subset]
101+
exact HasCoeffs.coeffs_relation_mem_range R₀ x
102+
103+
/-- The `r`-th relation of `P` as a polynomial in `R₀`. This is the (arbitrary) choice of a
104+
pre-image under the map `R₀[X] → R[X]`. -/
105+
noncomputable def relationOfHasCoeffs (r : σ) : MvPolynomial ι R₀ :=
106+
(HasCoeffs.relation_mem_range_map (P := P) R₀ r).choose
107+
108+
lemma map_relationOfHasCoeffs (r : σ) :
109+
MvPolynomial.map (algebraMap R₀ R) (P.relationOfHasCoeffs R₀ r) = P.relation r :=
110+
(HasCoeffs.relation_mem_range_map R₀ r).choose_spec
111+
112+
@[simp]
113+
lemma aeval_val_relationOfHasCoeffs (r : σ) :
114+
MvPolynomial.aeval P.val (P.relationOfHasCoeffs R₀ r) = 0 := by
115+
rw [← MvPolynomial.aeval_map_algebraMap R, map_relationOfHasCoeffs, aeval_val_relation]
116+
117+
@[simp]
118+
lemma algebraTensorAlgEquiv_symm_relation (r : σ) :
119+
(MvPolynomial.algebraTensorAlgEquiv R₀ R).symm (P.relation r) =
120+
1 ⊗ₜ P.relationOfHasCoeffs R₀ r := by
121+
rw [← map_relationOfHasCoeffs R₀, MvPolynomial.algebraTensorAlgEquiv_symm_map]
122+
123+
/-- The model of `S` over a `R₀` that contains the coefficients of `P` is `R₀[X]` quotiented by the
124+
same relations. -/
125+
abbrev ModelOfHasCoeffs : Type _ :=
126+
MvPolynomial ι R₀ ⧸ (Ideal.span <| Set.range (P.relationOfHasCoeffs R₀))
127+
128+
instance [Finite ι] [Finite σ] : Algebra.FinitePresentation R₀ (P.ModelOfHasCoeffs R₀) := by
129+
classical
130+
cases nonempty_fintype σ
131+
exact .quotient ⟨Finset.image (P.relationOfHasCoeffs R₀) .univ, by simp⟩
132+
133+
variable (P) in
134+
/-- (Implementation detail): The underlying `AlgHom` of `tensorModelOfHasCoeffsEquiv`. -/
135+
noncomputable def tensorModelOfHasCoeffsHom : R ⊗[R₀] P.ModelOfHasCoeffs R₀ →ₐ[R] S :=
136+
Algebra.TensorProduct.lift (Algebra.ofId R S)
137+
(Ideal.Quotient.liftₐ _ (MvPolynomial.aeval P.val) <| by
138+
simp_rw [← RingHom.mem_ker, ← SetLike.le_def, Ideal.span_le]
139+
rintro a ⟨i, rfl⟩
140+
simp)
141+
fun _ _ ↦ Commute.all _ _
142+
143+
@[simp]
144+
lemma tensorModelOfHasCoeffsHom_tmul (x : R) (y : MvPolynomial ι R₀) :
145+
P.tensorModelOfHasCoeffsHom R₀ (x ⊗ₜ y) = algebraMap R S x * MvPolynomial.aeval P.val y :=
146+
rfl
147+
148+
variable (P) in
149+
/-- (Implementation detail): The inverse of `tensorModelOfHasCoeffsHom`. -/
150+
noncomputable def tensorModelOfHasCoeffsInv : S →ₐ[R] R ⊗[R₀] P.ModelOfHasCoeffs R₀ :=
151+
(Ideal.Quotient.liftₐ _
152+
((Algebra.TensorProduct.map (.id R R) (Ideal.Quotient.mkₐ _ _)).comp
153+
(MvPolynomial.algebraTensorAlgEquiv R₀ R).symm.toAlgHom) <| by
154+
simp_rw [← RingHom.mem_ker, ← SetLike.le_def]
155+
rw [← P.span_range_relation_eq_ker, Ideal.span_le]
156+
rintro a ⟨i, rfl⟩
157+
simp only [AlgEquiv.toAlgHom_eq_coe, SetLike.mem_coe, RingHom.mem_ker, AlgHom.coe_comp,
158+
AlgHom.coe_coe, Function.comp_apply, algebraTensorAlgEquiv_symm_relation]
159+
simp only [TensorProduct.map_tmul, AlgHom.coe_id, id_eq, Ideal.Quotient.mkₐ_eq_mk,
160+
Ideal.Quotient.mk_span_range, tmul_zero]).comp
161+
(P.quotientEquiv.restrictScalars R).symm.toAlgHom
162+
163+
@[simp]
164+
lemma tensorModelOfHasCoeffsInv_aeval_val (x : MvPolynomial ι R₀) :
165+
P.tensorModelOfHasCoeffsInv R₀ (MvPolynomial.aeval P.val x) =
166+
1 ⊗ₜ[R₀] (Ideal.Quotient.mk _ x) := by
167+
rw [← MvPolynomial.aeval_map_algebraMap R, ← Generators.algebraMap_apply, ← quotientEquiv_mk]
168+
simp [tensorModelOfHasCoeffsInv, -quotientEquiv_symm, -quotientEquiv_mk]
169+
170+
private lemma hom_comp_inv :
171+
(P.tensorModelOfHasCoeffsHom R₀).comp (P.tensorModelOfHasCoeffsInv R₀) = AlgHom.id R S := by
172+
have h : Function.Surjective
173+
((P.quotientEquiv.restrictScalars R).toAlgHom.comp (Ideal.Quotient.mkₐ _ _)) :=
174+
(P.quotientEquiv.restrictScalars R).surjective.comp Ideal.Quotient.mk_surjective
175+
simp only [← AlgHom.cancel_right h, tensorModelOfHasCoeffsInv, AlgEquiv.toAlgHom_eq_coe,
176+
AlgHom.id_comp]
177+
rw [AlgHom.comp_assoc, AlgHom.comp_assoc, ← AlgHom.comp_assoc _ _ (Ideal.Quotient.mkₐ R P.ker),
178+
AlgEquiv.symm_comp, AlgHom.id_comp]
179+
ext x
180+
simp
181+
182+
private lemma inv_comp_hom :
183+
(P.tensorModelOfHasCoeffsInv R₀).comp (P.tensorModelOfHasCoeffsHom R₀) = AlgHom.id R _ := by
184+
ext x
185+
obtain ⟨x, rfl⟩ := Ideal.Quotient.mk_surjective x
186+
simp
187+
188+
/-- The natural isomorphism `R ⊗[R₀] S₀ ≃ₐ[R] S`. -/
189+
noncomputable def tensorModelOfHasCoeffsEquiv : R ⊗[R₀] P.ModelOfHasCoeffs R₀ ≃ₐ[R] S :=
190+
AlgEquiv.ofAlgHom (P.tensorModelOfHasCoeffsHom R₀) (P.tensorModelOfHasCoeffsInv R₀)
191+
(P.hom_comp_inv R₀) (P.inv_comp_hom R₀)
192+
193+
@[simp]
194+
lemma tensorModelOfHasCoeffsEquiv_tmul (x : R) (y : MvPolynomial ι R₀) :
195+
P.tensorModelOfHasCoeffsEquiv R₀ (x ⊗ₜ y) = algebraMap R S x * MvPolynomial.aeval P.val y :=
196+
rfl
197+
198+
@[simp]
199+
lemma tensorModelOfHasCoeffsEquiv_symm_tmul (x : MvPolynomial ι R₀) :
200+
(P.tensorModelOfHasCoeffsEquiv R₀).symm (MvPolynomial.aeval P.val x) =
201+
1 ⊗ₜ[R₀] (Ideal.Quotient.mk _ x) :=
202+
tensorModelOfHasCoeffsInv_aeval_val _ x
203+
204+
end Algebra.Presentation

Mathlib/RingTheory/FiniteType.lean

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,11 @@ theorem isNoetherianRing (R S : Type*) [CommRing R] [CommRing S] [Algebra R S]
209209
theorem _root_.Subalgebra.fg_iff_finiteType (S : Subalgebra R A) : S.FG ↔ Algebra.FiniteType R S :=
210210
S.fg_top.symm.trans ⟨fun h => ⟨h⟩, fun h => h.out⟩
211211

212+
lemma adjoin_of_finite {A : Type*} [CommSemiring A] [Algebra R A] {t : Set A} (h : Set.Finite t) :
213+
FiniteType R (Algebra.adjoin R t) := by
214+
rw [← Subalgebra.fg_iff_finiteType]
215+
exact ⟨h.toFinset, by simp⟩
216+
212217
end FiniteType
213218

214219
end Algebra

Mathlib/RingTheory/Ideal/Quotient/Basic.lean

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,12 @@ variable {S : Type v}
3636

3737
namespace Quotient
3838

39+
@[simp]
40+
lemma mk_span_range {ι : Type*} (f : ι → R) [(span (range f)).IsTwoSided] (i : ι) :
41+
mk (span (.range f)) (f i) = 0 := by
42+
rw [Ideal.Quotient.eq_zero_iff_mem]
43+
exact Ideal.subset_span ⟨i, rfl⟩
44+
3945
variable {I} {x y : R}
4046

4147
theorem zero_eq_one_iff : (0 : R ⧸ I) = 1 ↔ I = ⊤ :=

Mathlib/RingTheory/LinearDisjoint.lean

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -270,7 +270,7 @@ noncomputable def basisOfBasisRight (H' : A ⊔ B = ⊤) {ι : Type*} (b : Basis
270270
@[simp]
271271
theorem algebraMap_basisOfBasisRight_apply (H' : A ⊔ B = ⊤) {ι : Type*} (b : Basis ι R B) (i : ι) :
272272
H.basisOfBasisRight H' b i = algebraMap B S (b i) := by
273-
simp [basisOfBasisRight, Subalgebra.algebraMap_def]
273+
simp [basisOfBasisRight]
274274

275275
@[simp]
276276
theorem mulMapLeftOfSupEqTop_symm_apply (H' : A ⊔ B = ⊤) (x : B) :
@@ -287,8 +287,7 @@ theorem leftMulMatrix_basisOfBasisRight_algebraMap (H' : A ⊔ B = ⊤) {ι : Ty
287287
Algebra.leftMulMatrix (H.basisOfBasisRight H' b) (algebraMap B S x) =
288288
RingHom.mapMatrix (algebraMap R A) (Algebra.leftMulMatrix b x) := by
289289
ext
290-
simp [Algebra.leftMulMatrix_eq_repr_mul, ← H.algebraMap_basisOfBasisRight_repr_apply H',
291-
Subalgebra.algebraMap_def]
290+
simp [Algebra.leftMulMatrix_eq_repr_mul, ← H.algebraMap_basisOfBasisRight_repr_apply H']
292291

293292
/--
294293
If `A` and `B` are subalgebras in a commutative algebra `S` over `R`, and if they are

Mathlib/RingTheory/TensorProduct/MvPolynomial.lean

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,20 @@ lemma algebraTensorAlgEquiv_symm_monomial (m : σ →₀ ℕ) (a : A) :
237237
nth_rw 2 [← mul_one a]
238238
rw [Algebra.TensorProduct.tmul_mul_tmul]
239239

240+
@[simp]
241+
lemma algebraTensorAlgEquiv_symm_comp_aeval :
242+
(((algebraTensorAlgEquiv (σ := σ) R A).symm.restrictScalars R) :
243+
MvPolynomial σ A →ₐ[R] A ⊗[R] MvPolynomial σ R).comp
244+
(MvPolynomial.mapAlgHom (R := R) (S₁ := R) (S₂ := A) (Algebra.ofId R A)) =
245+
Algebra.TensorProduct.includeRight := by
246+
ext
247+
simp
248+
249+
@[simp]
250+
lemma algebraTensorAlgEquiv_symm_map (x : MvPolynomial σ R) :
251+
(algebraTensorAlgEquiv R A).symm (map (algebraMap R A) x) = 1 ⊗ₜ x :=
252+
DFunLike.congr_fun (algebraTensorAlgEquiv_symm_comp_aeval R A) x
253+
240254
lemma aeval_one_tmul (f : σ → S) (p : MvPolynomial σ R) :
241255
(aeval fun x ↦ (1 ⊗ₜ[R] f x : N ⊗[R] S)) p = 1 ⊗ₜ[R] (aeval f) p := by
242256
induction p using MvPolynomial.induction_on with

0 commit comments

Comments
 (0)