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

Commit 4722dd4

Browse files
feat(ring_theory/finiteness): add add_monoid_algebra.ft_of_fg (#7265)
This is from `lean_liquid`. We prove `add_monoid_algebra.ft_of_fg`: if `M` is a finitely generated monoid then `add_monoid_algebra R M` if finitely generated as `R-alg`. The converse is also true, but the proof is longer and I wanted to keep the PR small. - [x] depends on: #7279
1 parent 4a94b28 commit 4722dd4

File tree

3 files changed

+109
-1
lines changed

3 files changed

+109
-1
lines changed

src/algebra/module/submodule.lean

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,9 @@ variables [semiring R] [add_comm_monoid M] [module R M]
4848
instance : set_like (submodule R M) M :=
4949
⟨submodule.carrier, λ p q h, by cases p; cases q; congr'⟩
5050

51+
@[simp] theorem mem_to_add_submonoid (p : submodule R M) (x : M) : x ∈ p.to_add_submonoid ↔ x ∈ p :=
52+
iff.rfl
53+
5154
variables {p q : submodule R M}
5255

5356
@[simp] lemma mk_coe (S : set M) (h₁ h₂ h₃) :

src/algebra/monoid_algebra.lean

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -434,6 +434,16 @@ lemma single_algebra_map_eq_algebra_map_mul_of {A : Type*} [comm_semiring k] [se
434434
single a (algebra_map k A b) = algebra_map k (monoid_algebra A G) b * of A G a :=
435435
by simp
436436

437+
lemma induction_on [semiring k] [monoid G] {p : monoid_algebra k G → Prop} (f : monoid_algebra k G)
438+
(hM : ∀ g, p (of k G g)) (hadd : ∀ f g : monoid_algebra k G, p f → p g → p (f + g))
439+
(hsmul : ∀ (r : k) f, p f → p (r • f)) : p f :=
440+
begin
441+
refine finsupp.induction_linear f _ (λ f g hf hg, hadd f g hf hg) (λ g r, _),
442+
{ simpa using hsmul 0 (of k G 1) (hM 1) },
443+
{ convert hsmul r (of k G g) (hM g),
444+
simp only [mul_one, smul_single', of_apply] },
445+
end
446+
437447
end algebra
438448

439449
section lift
@@ -592,7 +602,6 @@ calc (f * g) x = sum f (λ a b, (single a b * g) x) :
592602
by rw [← finsupp.sum_apply, ← finsupp.sum_mul, f.sum_single]
593603
... = _ : by simp only [single_mul_apply, finsupp.sum]
594604

595-
596605
-- If we'd assumed `comm_semiring`, we could deduce this from `mul_apply_left`.
597606
lemma mul_apply_right (f g : monoid_algebra k G) (x : G) :
598607
(f * g) x = (g.sum $ λa b, (f (x * a⁻¹)) * b) :=
@@ -901,6 +910,19 @@ lemma lift_nc_smul {R : Type*} [add_zero_class G] [semiring R] (f : k →+* R)
901910
lift_nc (f : k →+ R) g (c • φ) = f c * lift_nc (f : k →+ R) g φ :=
902911
@monoid_algebra.lift_nc_smul k (multiplicative G) _ _ _ _ f g c φ
903912

913+
variables {k G}
914+
915+
lemma induction_on [add_monoid G] {p : add_monoid_algebra k G → Prop} (f : add_monoid_algebra k G)
916+
(hM : ∀ g, p (of k G (multiplicative.of_add g)))
917+
(hadd : ∀ f g : add_monoid_algebra k G, p f → p g → p (f + g))
918+
(hsmul : ∀ (r : k) f, p f → p (r • f)) : p f :=
919+
begin
920+
refine finsupp.induction_linear f _ (λ f g hf hg, hadd f g hf hg) (λ g r, _),
921+
{ simpa using hsmul 0 (of k G (multiplicative.of_add 0)) (hM 0) },
922+
{ convert hsmul r (of k G (multiplicative.of_add g)) (hM g),
923+
simp only [mul_one, to_add_of_add, smul_single', of_apply] },
924+
end
925+
904926
end misc_theorems
905927

906928
section span
@@ -1089,3 +1111,19 @@ finset.induction_on s rfl $ λ a s has ih, by rw [prod_insert has, ih,
10891111
end
10901112

10911113
end add_monoid_algebra
1114+
1115+
variables {R : Type*} [comm_semiring R] (k G)
1116+
1117+
/-- The algebra equivalence between `add_monoid_algebra` and `monoid_algebra` in terms of
1118+
`multiplicative`. -/
1119+
def add_monoid_algebra.to_multiplicative_alg_equiv [semiring k] [algebra R k] [add_monoid G] :
1120+
add_monoid_algebra k G ≃ₐ[R] monoid_algebra k (multiplicative G) :=
1121+
{ commutes' := λ r, by simp [add_monoid_algebra.to_multiplicative],
1122+
..add_monoid_algebra.to_multiplicative k G }
1123+
1124+
/-- The algebra equivalence between `monoid_algebra` and `add_monoid_algebra` in terms of
1125+
`additive`. -/
1126+
def monoid_algebra.to_additive_alg_equiv [semiring k] [algebra R k] [monoid G] :
1127+
monoid_algebra k G ≃ₐ[R] add_monoid_algebra k (additive G) :=
1128+
{ commutes' := λ r, by simp [monoid_algebra.to_additive],
1129+
..monoid_algebra.to_additive k G }

src/ring_theory/finiteness.lean

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ Authors: Johan Commelin
77
import ring_theory.noetherian
88
import ring_theory.ideal.operations
99
import ring_theory.algebra_tower
10+
import group_theory.finiteness
1011

1112
/-!
1213
# Finiteness conditions in commutative algebra
@@ -558,3 +559,69 @@ ring_hom.finite_presentation.of_finite_type
558559
end finite_presentation
559560

560561
end alg_hom
562+
563+
section monoid_algebra
564+
565+
namespace add_monoid_algebra
566+
567+
open algebra add_submonoid
568+
569+
variables {R : Type*} {M : Type*} [add_comm_monoid M]
570+
571+
lemma mv_polynomial_aeval_of_surjective_of_closure [comm_semiring R] {S : set M}
572+
(hS : closure S = ⊤) : function.surjective (mv_polynomial.aeval
573+
(λ (s : S), of R M (multiplicative.of_add ↑s)) : mv_polynomial S R → add_monoid_algebra R M) :=
574+
begin
575+
refine λ f, induction_on f (λ m, _) _ _,
576+
{ have : m ∈ closure S := hS.symm ▸ mem_top _,
577+
refine closure_induction this (λ m hm, _) _ _,
578+
{ exact ⟨mv_polynomial.X ⟨m, hm⟩, mv_polynomial.aeval_X _ _⟩ },
579+
{ exact ⟨1, alg_hom.map_one _⟩ },
580+
{ rintro m₁ m₂ ⟨P₁, hP₁⟩ ⟨P₂, hP₂⟩,
581+
exact ⟨P₁ * P₂, by rw [alg_hom.map_mul, hP₁, hP₂, of_apply, of_apply, of_apply,
582+
single_mul_single, one_mul]; refl⟩ } },
583+
{ rintro f g ⟨P, rfl⟩ ⟨Q, rfl⟩,
584+
exact ⟨P + Q, alg_hom.map_add _ _ _⟩ },
585+
{ rintro r f ⟨P, rfl⟩,
586+
exact ⟨r • P, alg_hom.map_smul _ _ _⟩ }
587+
end
588+
589+
instance ft_of_fg [comm_ring R] [h : add_monoid.fg M] : finite_type R (add_monoid_algebra R M) :=
590+
begin
591+
obtain ⟨S, hS⟩ := h.out,
592+
exact (finite_type.mv_polynomial R (S : set M)).of_surjective (mv_polynomial.aeval
593+
(λ (s : (S : set M)), of R M s.1)) (mv_polynomial_aeval_of_surjective_of_closure hS)
594+
end
595+
596+
end add_monoid_algebra
597+
598+
namespace monoid_algebra
599+
600+
open algebra submonoid
601+
602+
variables {R : Type*} {M : Type*} [comm_monoid M]
603+
604+
lemma mv_polynomial_aeval_of_surjective_of_closure [comm_semiring R] {S : set M}
605+
(hS : closure S = ⊤) : function.surjective (mv_polynomial.aeval
606+
(λ (s : S), of R M ↑s) : mv_polynomial S R → monoid_algebra R M) :=
607+
begin
608+
refine λ f, induction_on f (λ m, _) _ _,
609+
{ have : m ∈ closure S := hS.symm ▸ mem_top _,
610+
refine closure_induction this (λ m hm, _) _ _,
611+
{ exact ⟨mv_polynomial.X ⟨m, hm⟩, mv_polynomial.aeval_X _ _⟩ },
612+
{ exact ⟨1, alg_hom.map_one _⟩ },
613+
{ rintro m₁ m₂ ⟨P₁, hP₁⟩ ⟨P₂, hP₂⟩,
614+
exact ⟨P₁ * P₂, by rw [alg_hom.map_mul, hP₁, hP₂, of_apply, of_apply, of_apply,
615+
single_mul_single, one_mul]⟩ } },
616+
{ rintro f g ⟨P, rfl⟩ ⟨Q, rfl⟩,
617+
exact ⟨P + Q, alg_hom.map_add _ _ _⟩ },
618+
{ rintro r f ⟨P, rfl⟩,
619+
exact ⟨r • P, alg_hom.map_smul _ _ _⟩ }
620+
end
621+
622+
instance ft_of_fg [comm_ring R] [monoid.fg M] : finite_type R (monoid_algebra R M) :=
623+
add_monoid_algebra.ft_of_fg.equiv (monoid_algebra.to_additive_alg_equiv R M).symm
624+
625+
end monoid_algebra
626+
627+
end monoid_algebra

0 commit comments

Comments
 (0)