@@ -6,6 +6,7 @@ Authors: Johan Commelin
6
6
7
7
import group_theory.finiteness
8
8
import ring_theory.algebra_tower
9
+ import ring_theory.mv_polynomial.tower
9
10
import ring_theory.ideal.quotient
10
11
import ring_theory.noetherian
11
12
424
425
425
426
open mv_polynomial
426
427
428
+ -- We follow the proof of https://stacks.math.columbia.edu/tag/0561
429
+ -- TODO: extract out helper lemmas and tidy proof.
430
+ lemma of_restrict_scalars_finite_presentation [algebra A B] [is_scalar_tower R A B]
431
+ (hRB : finite_presentation R B) [hRA : finite_type R A] : finite_presentation A B :=
432
+ begin
433
+ obtain ⟨n, f, hf, s, hs⟩ := hRB,
434
+ let RX := mv_polynomial (fin n) R, let AX := mv_polynomial (fin n) A,
435
+ refine ⟨n, mv_polynomial.aeval (f ∘ X), _, _⟩,
436
+ { rw [← algebra.range_top_iff_surjective, ← algebra.adjoin_range_eq_range_aeval, set.range_comp,
437
+ _root_.eq_top_iff, ← @adjoin_adjoin_of_tower R A B, adjoin_image,
438
+ adjoin_range_X, algebra.map_top, (algebra.range_top_iff_surjective _).mpr hf],
439
+ exact subset_adjoin },
440
+ { obtain ⟨t, ht⟩ := hRA.out,
441
+ have := λ i : t, hf (algebra_map A B i),
442
+ choose t' ht',
443
+ have ht'' : algebra.adjoin R ((algebra_map A AX) '' t ∪ set.range (X : _ → AX)) = ⊤,
444
+ { rw [adjoin_union_eq_adjoin_adjoin, ← subalgebra.restrict_scalars_top R],
445
+ congr' 1 ,
446
+ swap, { exact subalgebra.is_scalar_tower_mid _ },
447
+ rw [adjoin_algebra_map, ht],
448
+ apply subalgebra.restrict_scalars_injective R,
449
+ rw [← adjoin_restrict_scalars, adjoin_range_X, subalgebra.restrict_scalars_top,
450
+ subalgebra.restrict_scalars_top] },
451
+ let g : t → AX := λ x, C (x : A) - map (algebra_map R A) (t' x),
452
+ refine ⟨s.image (map (algebra_map R A)) ∪ t.attach.image g, _⟩,
453
+ rw [finset.coe_union, finset.coe_image, finset.coe_image, finset.attach_eq_univ,
454
+ finset.coe_univ, set.image_univ],
455
+ let s₀ := _, let I := _, change ideal.span s₀ = I,
456
+ have leI : ideal.span s₀ ≤ I,
457
+ { rw [ideal.span_le],
458
+ rintros _ (⟨x, hx, rfl⟩|⟨⟨x, hx⟩, rfl⟩),
459
+ all_goals
460
+ { dsimp [g], rw [ring_hom.mem_ker, alg_hom.to_ring_hom_eq_coe, alg_hom.coe_to_ring_hom] },
461
+ { rw [mv_polynomial.aeval_map_algebra_map, ← aeval_unique],
462
+ have := ideal.subset_span hx,
463
+ rwa hs at this },
464
+ { rw [map_sub, mv_polynomial.aeval_map_algebra_map, ← aeval_unique,
465
+ aeval_C, ht', subtype.coe_mk, sub_self] } },
466
+ apply leI.antisymm,
467
+ intros x hx,
468
+ rw [ring_hom.mem_ker, alg_hom.to_ring_hom_eq_coe, alg_hom.coe_to_ring_hom] at hx,
469
+ let s₀ := _, change x ∈ ideal.span s₀,
470
+ have : x ∈ (map (algebra_map R A) : _ →+* AX).srange.to_add_submonoid ⊔
471
+ (ideal.span s₀).to_add_submonoid,
472
+ { have : x ∈ (⊤ : subalgebra R AX) := trivial,
473
+ rw ← ht'' at this ,
474
+ apply adjoin_induction this ,
475
+ { rintros _ (⟨x, hx, rfl⟩|⟨i, rfl⟩),
476
+ { rw [algebra_map_eq, ← sub_add_cancel (C x) (map (algebra_map R A) (t' ⟨x, hx⟩)),
477
+ add_comm],
478
+ apply add_submonoid.add_mem_sup,
479
+ { exact set.mem_range_self _ },
480
+ { apply ideal.subset_span,
481
+ apply set.mem_union_right,
482
+ exact set.mem_range_self ⟨x, hx⟩ } },
483
+ { apply add_submonoid.mem_sup_left,
484
+ exact ⟨X i, map_X _ _⟩ } },
485
+ { intro r, apply add_submonoid.mem_sup_left, exact ⟨C r, map_C _ _⟩ },
486
+ { intros _ _ h₁ h₂, exact add_mem h₁ h₂ },
487
+ { intros x₁ x₂ h₁ h₂,
488
+ obtain ⟨_, ⟨p₁, rfl⟩, q₁, hq₁, rfl⟩ := add_submonoid.mem_sup.mp h₁,
489
+ obtain ⟨_, ⟨p₂, rfl⟩, q₂, hq₂, rfl⟩ := add_submonoid.mem_sup.mp h₂,
490
+ rw [add_mul, mul_add, add_assoc, ← map_mul],
491
+ apply add_submonoid.add_mem_sup,
492
+ { exact set.mem_range_self _ },
493
+ { refine add_mem (ideal.mul_mem_left _ _ hq₂) (ideal.mul_mem_right _ _ hq₁) } } },
494
+ obtain ⟨_, ⟨p, rfl⟩, q, hq, rfl⟩ := add_submonoid.mem_sup.mp this ,
495
+ rw [map_add, aeval_map_algebra_map, ← aeval_unique, (show aeval (f ∘ X) q = 0 , from leI hq),
496
+ add_zero] at hx,
497
+ suffices : ideal.span (s : set RX) ≤ (ideal.span s₀).comap (map $ algebra_map R A),
498
+ { refine add_mem _ hq, rw hs at this , exact this hx },
499
+ rw ideal.span_le,
500
+ intros x hx,
501
+ apply ideal.subset_span,
502
+ apply set.mem_union_left,
503
+ exact set.mem_image_of_mem _ hx }
504
+ end
505
+
427
506
/-- This is used to prove the strictly stronger `ker_fg_of_surjective`. Use it instead. -/
507
+ -- TODO: extract out helper lemmas and tidy proof.
428
508
lemma ker_fg_of_mv_polynomial {n : ℕ} (f : mv_polynomial (fin n) R →ₐ[R] A)
429
509
(hf : function.surjective f) (hfp : finite_presentation R A) : f.to_ring_hom.ker.fg :=
430
510
begin
@@ -631,6 +711,13 @@ lemma comp {g : B →+* C} {f : A →+* B} (hg : g.finite_presentation) (hf : f.
631
711
end }
632
712
hf hg
633
713
714
+ lemma of_comp_finite_type (f : A →+* B) {g : B →+* C} (hg : (g.comp f).finite_presentation)
715
+ (hf : f.finite_type) : g.finite_presentation :=
716
+ @@algebra.finite_presentation.of_restrict_scalars_finite_presentation _ _ f.to_algebra _
717
+ (g.comp f).to_algebra g.to_algebra
718
+ (@@is_scalar_tower.of_algebra_map_eq' _ _ _ f.to_algebra g.to_algebra (g.comp f).to_algebra rfl)
719
+ hg hf
720
+
634
721
end finite_presentation
635
722
636
723
end ring_hom
@@ -727,6 +814,10 @@ lemma of_finite_type [is_noetherian_ring A] {f : A →ₐ[R] B} :
727
814
f.finite_type ↔ f.finite_presentation :=
728
815
ring_hom.finite_presentation.of_finite_type
729
816
817
+ lemma of_comp_finite_type (f : A →ₐ[R] B) {g : B →ₐ[R] C} (h : (g.comp f).finite_presentation)
818
+ (h' : f.finite_type) : g.finite_presentation :=
819
+ h.of_comp_finite_type _ h'
820
+
730
821
end finite_presentation
731
822
732
823
end alg_hom
0 commit comments