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

Commit 5582d84

Browse files
Chris HughesChrisHughes24
andcommitted
feat(ring_theory/localization): fraction rings of algebraic extensions are algebraic (#11717)
Co-authored-by: Chris Hughes <33847686+ChrisHughes24@users.noreply.github.com>
1 parent 4b9f048 commit 5582d84

File tree

2 files changed

+84
-7
lines changed

2 files changed

+84
-7
lines changed

src/ring_theory/algebraic.lean

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -72,18 +72,29 @@ by simp only [is_algebraic, alg_hom.injective_iff, not_forall, and.comm, exists_
7272
end
7373

7474
section zero_ne_one
75-
variables (R : Type u) {A : Type v} [comm_ring R] [nontrivial R] [ring A] [algebra R A]
75+
variables (R : Type u) {S : Type*} {A : Type v} [comm_ring R]
76+
variables [comm_ring S] [ring A] [algebra R A] [algebra R S] [algebra S A]
77+
variables [is_scalar_tower R S A]
7678

7779
/-- An integral element of an algebra is algebraic.-/
78-
lemma is_integral.is_algebraic {x : A} (h : is_integral R x) : is_algebraic R x :=
80+
lemma is_integral.is_algebraic [nontrivial R] {x : A} (h : is_integral R x) :
81+
is_algebraic R x :=
7982
by { rcases h with ⟨p, hp, hpx⟩, exact ⟨p, hp.ne_zero, hpx⟩ }
8083

8184
variables {R}
8285

8386
/-- An element of `R` is algebraic, when viewed as an element of the `R`-algebra `A`. -/
84-
lemma is_algebraic_algebra_map (a : R) : is_algebraic R (algebra_map R A a) :=
87+
lemma is_algebraic_algebra_map [nontrivial R] (a : R) : is_algebraic R (algebra_map R A a) :=
8588
⟨X - C a, X_sub_C_ne_zero a, by simp only [aeval_C, aeval_X, alg_hom.map_sub, sub_self]⟩
8689

90+
lemma is_algebraic_algebra_map_of_is_algebraic {a : S} (h : is_algebraic R a) :
91+
is_algebraic R (algebra_map S A a) :=
92+
begin
93+
obtain ⟨f, hf₁, hf₂⟩ := h,
94+
use [f, hf₁],
95+
rw [← is_scalar_tower.algebra_map_aeval R S A, hf₂, ring_hom.map_zero]
96+
end
97+
8798
end zero_ne_one
8899

89100
section field
@@ -123,15 +134,26 @@ end
123134

124135
variables (K L)
125136

126-
/-- If A is an algebraic algebra over R, then A is algebraic over A when S is an extension of R,
137+
/-- If x is algebraic over R, then x is algebraic over S when S is an extension of R,
127138
and the map from `R` to `S` is injective. -/
128-
lemma is_algebraic_of_larger_base_of_injective (hinj : function.injective (algebra_map R S))
129-
(A_alg : is_algebraic R A) : is_algebraic S A :=
130-
λ x, let ⟨p, hp₁, hp₂⟩ := A_alg x in
139+
lemma _root_.is_algebraic_of_larger_base_of_injective (hinj : function.injective (algebra_map R S))
140+
{x : A} (A_alg : _root_.is_algebraic R x) : _root_.is_algebraic S x :=
141+
let ⟨p, hp₁, hp₂⟩ := A_alg in
131142
⟨p.map (algebra_map _ _),
132143
by rwa [ne.def, ← degree_eq_bot, degree_map' hinj, degree_eq_bot],
133144
by simpa⟩
134145

146+
/-- If A is an algebraic algebra over R, then A is algebraic over S when S is an extension of R,
147+
and the map from `R` to `S` is injective. -/
148+
lemma is_algebraic_of_larger_base_of_injective (hinj : function.injective (algebra_map R S))
149+
(A_alg : is_algebraic R A) : is_algebraic S A :=
150+
λ x, is_algebraic_of_larger_base_of_injective hinj (A_alg x)
151+
152+
/-- If x is a algebraic over K, then x is algebraic over L when L is an extension of K -/
153+
lemma _root_.is_algebraic_of_larger_base {x : A} (A_alg : _root_.is_algebraic K x) :
154+
_root_.is_algebraic L x :=
155+
_root_.is_algebraic_of_larger_base_of_injective (algebra_map K L).injective A_alg
156+
135157
/-- If A is an algebraic algebra over K, then A is algebraic over L when L is an extension of K -/
136158
lemma is_algebraic_of_larger_base (A_alg : is_algebraic K A) : is_algebraic L A :=
137159
is_algebraic_of_larger_base_of_injective (algebra_map K L).injective A_alg

src/ring_theory/localization.lean

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2662,6 +2662,14 @@ noncomputable instance : field (fraction_ring A) :=
26622662
(algebra_map _ _ r / algebra_map A _ s : fraction_ring A) :=
26632663
by rw [localization.mk_eq_mk', is_fraction_ring.mk'_eq_div]
26642664

2665+
noncomputable instance [is_domain R] [field K] [algebra R K] [no_zero_smul_divisors R K] :
2666+
algebra (fraction_ring R) K :=
2667+
ring_hom.to_algebra (is_fraction_ring.lift (no_zero_smul_divisors.algebra_map_injective R _))
2668+
2669+
instance [is_domain R] [field K] [algebra R K] [no_zero_smul_divisors R K] :
2670+
is_scalar_tower R (fraction_ring R) K :=
2671+
is_scalar_tower.of_algebra_map_eq (λ x, (is_fraction_ring.lift_algebra_map _ x).symm)
2672+
26652673
variables (A)
26662674

26672675
/-- Given an integral domain `A` and a localization map to a field of fractions
@@ -2672,3 +2680,50 @@ noncomputable def alg_equiv (K : Type*) [field K] [algebra A K] [is_fraction_rin
26722680
localization.alg_equiv (non_zero_divisors A) K
26732681

26742682
end fraction_ring
2683+
2684+
namespace is_fraction_ring
2685+
2686+
variables (R S K)
2687+
2688+
/-- `S` is algebraic over `R` iff a fraction ring of `S` is algebraic over `R` -/
2689+
lemma is_algebraic_iff' [field K] [is_domain R] [is_domain S] [algebra R K] [algebra S K]
2690+
[no_zero_smul_divisors R K] [is_fraction_ring S K] [is_scalar_tower R S K] :
2691+
algebra.is_algebraic R S ↔ algebra.is_algebraic R K :=
2692+
begin
2693+
simp only [algebra.is_algebraic],
2694+
split,
2695+
{ intros h x,
2696+
rw [is_fraction_ring.is_algebraic_iff R (fraction_ring R) K, is_algebraic_iff_is_integral],
2697+
obtain ⟨(a : S), b, ha, rfl⟩ := @div_surjective S _ _ _ _ _ _ x,
2698+
obtain ⟨f, hf₁, hf₂⟩ := h b,
2699+
rw [div_eq_mul_inv],
2700+
refine is_integral_mul _ _,
2701+
{ rw [← is_algebraic_iff_is_integral],
2702+
refine _root_.is_algebraic_of_larger_base_of_injective
2703+
(no_zero_smul_divisors.algebra_map_injective R (fraction_ring R)) _,
2704+
exact is_algebraic_algebra_map_of_is_algebraic (h a) },
2705+
{ rw [← is_algebraic_iff_is_integral],
2706+
use (f.map (algebra_map R (fraction_ring R))).reverse,
2707+
split,
2708+
{ rwa [ne.def, polynomial.reverse_eq_zero, ← polynomial.degree_eq_bot,
2709+
polynomial.degree_map_eq_of_injective
2710+
(no_zero_smul_divisors.algebra_map_injective R (fraction_ring R)),
2711+
polynomial.degree_eq_bot]},
2712+
{ haveI : invertible (algebra_map S K b),
2713+
from is_unit.invertible (is_unit_of_mem_non_zero_divisors
2714+
(mem_non_zero_divisors_iff_ne_zero.2
2715+
(λ h, non_zero_divisors.ne_zero ha
2716+
((ring_hom.injective_iff (algebra_map S K)).1
2717+
(no_zero_smul_divisors.algebra_map_injective _ _) b h)))),
2718+
rw [polynomial.aeval_def, ← inv_of_eq_inv, polynomial.eval₂_reverse_eq_zero_iff,
2719+
polynomial.eval₂_map, ← is_scalar_tower.algebra_map_eq, ← polynomial.aeval_def,
2720+
← is_scalar_tower.algebra_map_aeval, hf₂, ring_hom.map_zero] } } },
2721+
{ intros h x,
2722+
obtain ⟨f, hf₁, hf₂⟩ := h (algebra_map S K x),
2723+
use [f, hf₁],
2724+
rw [← is_scalar_tower.algebra_map_aeval] at hf₂,
2725+
exact (algebra_map S K).injective_iff.1
2726+
(no_zero_smul_divisors.algebra_map_injective _ _) _ hf₂ }
2727+
end
2728+
2729+
end is_fraction_ring

0 commit comments

Comments
 (0)