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

Commit 49bb92d

Browse files
knaka3435Vierkantorrobertylewis
committed
feat(ring_theory/dedekind_domain): definitions (#4000)
Defines `is_dedekind_domain` in three variants: 1. `is_dedekind_domain`: Noetherian, Integrally closed, Krull dimension 1, thanks to @Vierkantor 2. `is_dedekind_domain_dvr`: Noetherian, localization at every nonzero prime is a DVR 3. `is_dedekind_domain_inv`: Every nonzero ideal is invertible. TODO: prove that these definitions are equivalent. This PR also includes some misc. lemmas required to show the definitions are independent of choice of fraction field. Co-Authored-By: mushokunosora <knaka3435@gmail.com> Co-Authored-By: faenuccio <filippo.nuccio@univ-st-etienne.fr> Co-Authored-By: Vierkantor <vierkantor@vierkantor.com> Co-authored-by: Anne Baanen <t.baanen@vu.nl> Co-authored-by: mushokunosora <38799099+mushokunosora@users.noreply.github.com> Co-authored-by: Vierkantor <vierkantor@vierkantor.com> Co-authored-by: Rob Lewis <Rob.y.lewis@gmail.com> Co-authored-by: Vierkantor <Vierkantor@users.noreply.github.com>
1 parent 8e9b1f0 commit 49bb92d

File tree

9 files changed

+441
-29
lines changed

9 files changed

+441
-29
lines changed

docs/references.bib

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -369,3 +369,18 @@ @book{Hofstadter-1979
369369
series = "Penguin books",
370370
year = "1979",
371371
}
372+
373+
@book{marcus1977number,
374+
title={Number fields},
375+
author={Marcus, Daniel A and Sacco, Emanuele},
376+
volume={2},
377+
year={1977},
378+
publisher={Springer}
379+
}
380+
381+
@book{cassels1967algebraic,
382+
title={Algebraic number theory: proceedings of an instructional conference},
383+
author={Cassels, John William Scott and Fr{\"o}lich, Albrecht},
384+
year={1967},
385+
publisher={Academic Pr}
386+
}

src/ring_theory/algebra.lean

Lines changed: 50 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -484,6 +484,7 @@ namespace alg_equiv
484484
variables {R : Type u} {A₁ : Type v} {A₂ : Type w} {A₃ : Type u₁}
485485
variables [comm_semiring R] [semiring A₁] [semiring A₂] [semiring A₃]
486486
variables [algebra R A₁] [algebra R A₂] [algebra R A₃]
487+
variables (e : A₁ ≃ₐ[R] A₂)
487488

488489
instance : has_coe_to_fun (A₁ ≃ₐ[R] A₂) := ⟨_, alg_equiv.to_fun⟩
489490

@@ -511,7 +512,7 @@ rfl
511512

512513
@[simp] lemma to_fun_apply {e : A₁ ≃ₐ[R] A₂} {a : A₁} : e.to_fun a = e a := rfl
513514

514-
@[simp, norm_cast] lemma coe_ring_equiv (e : A₁ ≃ₐ[R] A₂) : ((e : A₁ ≃+* A₂) : A₁ → A₂) = e := rfl
515+
@[simp, norm_cast] lemma coe_ring_equiv : ((e : A₁ ≃+* A₂) : A₁ → A₂) = e := rfl
515516

516517
lemma coe_ring_equiv_injective : function.injective (λ e : A₁ ≃ₐ[R] A₂, (e : A₁ ≃+* A₂)) :=
517518
begin
@@ -522,15 +523,15 @@ begin
522523
exact congr_fun w a,
523524
end
524525

525-
@[simp] lemma map_add (e : A₁ ≃ₐ[R] A₂) : ∀ x y, e (x + y) = e x + e y := e.to_add_equiv.map_add
526+
@[simp] lemma map_add : ∀ x y, e (x + y) = e x + e y := e.to_add_equiv.map_add
526527

527-
@[simp] lemma map_zero (e : A₁ ≃ₐ[R] A₂) : e 0 = 0 := e.to_add_equiv.map_zero
528+
@[simp] lemma map_zero : e 0 = 0 := e.to_add_equiv.map_zero
528529

529-
@[simp] lemma map_mul (e : A₁ ≃ₐ[R] A₂) : ∀ x y, e (x * y) = (e x) * (e y) := e.to_mul_equiv.map_mul
530+
@[simp] lemma map_mul : ∀ x y, e (x * y) = (e x) * (e y) := e.to_mul_equiv.map_mul
530531

531-
@[simp] lemma map_one (e : A₁ ≃ₐ[R] A₂) : e 1 = 1 := e.to_mul_equiv.map_one
532+
@[simp] lemma map_one : e 1 = 1 := e.to_mul_equiv.map_one
532533

533-
@[simp] lemma commutes (e : A₁ ≃ₐ[R] A₂) : ∀ (r : R), e (algebra_map R A₁ r) = algebra_map R A₂ r :=
534+
@[simp] lemma commutes : ∀ (r : R), e (algebra_map R A₁ r) = algebra_map R A₂ r :=
534535
e.commutes'
535536

536537
@[simp] lemma map_neg {A₁ : Type v} {A₂ : Type w}
@@ -541,21 +542,30 @@ end
541542
[ring A₁] [ring A₂] [algebra R A₁] [algebra R A₂] (e : A₁ ≃ₐ[R] A₂) :
542543
∀ x y, e (x - y) = e x - e y := e.to_add_equiv.map_sub
543544

544-
lemma map_sum (e : A₁ ≃ₐ[R] A₂) {ι : Type*} (f : ι → A₁) (s : finset ι) :
545+
lemma map_sum {ι : Type*} (f : ι → A₁) (s : finset ι) :
545546
e (∑ x in s, f x) = ∑ x in s, e (f x) :=
546547
e.to_add_equiv.map_sum f s
547548

549+
/-- Interpret an algebra equivalence as an algebra homomorphism.
550+
551+
This definition is included for symmetry with the other `to_*_hom` projections.
552+
The `simp` normal form is to use the coercion of the `has_coe_to_alg_hom` instance. -/
553+
def to_alg_hom : A₁ →ₐ[R] A₂ :=
554+
{ map_one' := e.map_one, map_zero' := e.map_zero, ..e }
555+
548556
instance has_coe_to_alg_hom : has_coe (A₁ ≃ₐ[R] A₂) (A₁ →ₐ[R] A₂) :=
549-
⟨λ e, { map_one' := e.map_one, map_zero' := e.map_zero, ..e }⟩
557+
⟨to_alg_hom⟩
558+
559+
@[simp] lemma to_alg_hom_eq_coe : e.to_alg_hom = e := rfl
550560

551-
@[simp, norm_cast] lemma coe_alg_hom (e : A₁ ≃ₐ[R] A₂) : ((e : A₁ →ₐ[R] A₂) : A₁ → A₂) = e :=
552-
rfl
561+
@[simp, norm_cast] lemma coe_alg_hom : ((e : A₁ →ₐ[R] A₂) : A₁ → A₂) = e :=
562+
rfl
553563

554-
lemma injective (e : A₁ ≃ₐ[R] A₂) : function.injective e := e.to_equiv.injective
564+
lemma injective : function.injective e := e.to_equiv.injective
555565

556-
lemma surjective (e : A₁ ≃ₐ[R] A₂) : function.surjective e := e.to_equiv.surjective
566+
lemma surjective : function.surjective e := e.to_equiv.surjective
557567

558-
lemma bijective (e : A₁ ≃ₐ[R] A₂) : function.bijective e := e.to_equiv.bijective
568+
lemma bijective : function.bijective e := e.to_equiv.bijective
559569

560570
instance : has_one (A₁ ≃ₐ[R] A₁) := ⟨{commutes' := λ r, rfl, ..(1 : A₁ ≃+* A₁)}⟩
561571

@@ -625,6 +635,29 @@ def to_linear_equiv (e : A₁ ≃ₐ[R] A₂) : A₁ ≃ₗ[R] A₂ :=
625635

626636
@[simp] lemma to_linear_equiv_apply (e : A₁ ≃ₐ[R] A₂) (x : A₁) : e.to_linear_equiv x = e x := rfl
627637

638+
theorem to_linear_equiv_inj {e₁ e₂ : A₁ ≃ₐ[R] A₂} (H : e₁.to_linear_equiv = e₂.to_linear_equiv) :
639+
e₁ = e₂ :=
640+
ext $ λ x, show e₁.to_linear_equiv x = e₂.to_linear_equiv x, by rw H
641+
642+
/-- Interpret an algebra equivalence as a linear map. -/
643+
def to_linear_map : A₁ →ₗ[R] A₂ :=
644+
e.to_alg_hom.to_linear_map
645+
646+
@[simp] lemma to_alg_hom_to_linear_map :
647+
(e : A₁ →ₐ[R] A₂).to_linear_map = e.to_linear_map := rfl
648+
649+
@[simp] lemma to_linear_equiv_to_linear_map :
650+
e.to_linear_equiv.to_linear_map = e.to_linear_map := rfl
651+
652+
@[simp] lemma to_linear_map_apply (x : A₁) : e.to_linear_map x = e x := rfl
653+
654+
theorem to_linear_map_inj {e₁ e₂ : A₁ ≃ₐ[R] A₂} (H : e₁.to_linear_map = e₂.to_linear_map) :
655+
e₁ = e₂ :=
656+
ext $ λ x, show e₁.to_linear_map x = e₂.to_linear_map x, by rw H
657+
658+
@[simp] lemma trans_to_linear_map (f : A₁ ≃ₐ[R] A₂) (g : A₂ ≃ₐ[R] A₃) :
659+
(f.trans g).to_linear_map = g.to_linear_map.comp f.to_linear_map := rfl
660+
628661
end alg_equiv
629662

630663
namespace algebra
@@ -908,6 +941,10 @@ theorem map_le {S : subalgebra R A} {f : A →ₐ[R] B} {U : subalgebra R B} :
908941
map S f ≤ U ↔ S ≤ comap' U f :=
909942
set.image_subset_iff
910943

944+
lemma mem_map {S : subalgebra R A} {f : A →ₐ[R] B} {y : B} :
945+
y ∈ map S f ↔ ∃ x ∈ S, f x = y :=
946+
subsemiring.mem_map
947+
911948
instance integral_domain {R A : Type*} [comm_ring R] [integral_domain A] [algebra R A]
912949
(S : subalgebra R A) : integral_domain S :=
913950
@subring.domain A _ S _

src/ring_theory/algebra_operations.lean

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -279,6 +279,24 @@ lemma mem_div_iff_smul_subset {x : A} {I J : submodule R A} : x ∈ I / J ↔ x
279279
λ h y hy, h (set.smul_mem_smul_set hy) ⟩
280280

281281
lemma le_div_iff {I J K : submodule R A} : I ≤ J / K ↔ ∀ (x ∈ I) (z ∈ K), x * z ∈ J := iff.refl _
282+
283+
@[simp] lemma map_div {B : Type*} [comm_ring B] [algebra R B]
284+
(I J : submodule R A) (h : A ≃ₐ[R] B) :
285+
(I / J).map h.to_linear_map = I.map h.to_linear_map / J.map h.to_linear_map :=
286+
begin
287+
ext x,
288+
simp only [mem_map, mem_div_iff_forall_mul_mem],
289+
split,
290+
{ rintro ⟨x, hx, rfl⟩ _ ⟨y, hy, rfl⟩,
291+
exact ⟨x * y, hx _ hy, h.map_mul x y⟩ },
292+
{ rintro hx,
293+
refine ⟨h.symm x, λ z hz, _, h.apply_symm_apply x⟩,
294+
obtain ⟨xz, xz_mem, hxz⟩ := hx (h z) ⟨z, hz, rfl⟩,
295+
convert xz_mem,
296+
apply h.injective,
297+
erw [h.map_mul, h.apply_symm_apply, hxz] }
298+
end
299+
282300
end quotient
283301

284302
end comm_ring
Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
1+
/-
2+
Copyright (c) 2020 Kenji Nakagawa. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Kenji Nakagawa, Anne Baanen, Filippo A. E. Nuccio
5+
-/
6+
import ring_theory.discrete_valuation_ring
7+
import ring_theory.fractional_ideal
8+
import ring_theory.ideal.over
9+
10+
/-!
11+
# Dedekind domains
12+
13+
This file defines the notion of a Dedekind domain (or Dedekind ring),
14+
giving three equivalent definitions (TODO: and shows that they are equivalent).
15+
16+
## Main definitions
17+
18+
- `is_dedekind_domain` defines a Dedekind domain as a commutative ring that is not a field,
19+
Noetherian, integrally closed in its field of fractions and has Krull dimension exactly one.
20+
`is_dedekind_domain_iff` shows that this does not depend on the choice of field of fractions.
21+
- `is_dedekind_domain_dvr` alternatively defines a Dedekind domain as an integral domain that is not a field,
22+
Noetherian, and the localization at every nonzero prime ideal is a discrete valuation ring.
23+
- `is_dedekind_domain_inv` alternatively defines a Dedekind domain as an integral domain that is not a field,
24+
and every nonzero fractional ideal is invertible.
25+
- `is_dedekind_domain_inv_iff` shows that this does note depend on the choice of field of fractions.
26+
27+
## Implementation notes
28+
29+
The definitions that involve a field of fractions choose a canonical field of fractions,
30+
but are independent of that choice. The `..._iff` lemmas express this independence.
31+
32+
## References
33+
34+
* [D. Marcus, *Number Fields*][marcus1977number]
35+
* [J.W.S. Cassels, A. Frölich, *Algebraic Number Theory*][cassels1967algebraic]
36+
37+
## Tags
38+
39+
dedekind domain, dedekind ring
40+
-/
41+
42+
variables (R A K : Type*) [comm_ring R] [integral_domain A] [field K]
43+
44+
/-- A ring `R` has Krull dimension at most one if all nonzero prime ideals are maximal. -/
45+
def ring.dimension_le_one : Prop :=
46+
∀ p ≠ (⊥ : ideal R), p.is_prime → p.is_maximal
47+
48+
open ideal ring
49+
50+
namespace ring
51+
52+
lemma dimension_le_one.principal_ideal_ring
53+
[is_principal_ideal_ring A] : dimension_le_one A :=
54+
λ p nonzero prime, by { haveI := prime, exact is_prime.to_maximal_ideal nonzero }
55+
56+
lemma dimension_le_one.integral_closure [nontrivial R] [algebra R A]
57+
(h : dimension_le_one R) : dimension_le_one (integral_closure R A) :=
58+
begin
59+
intros p ne_bot prime,
60+
haveI := prime,
61+
refine integral_closure.is_maximal_of_is_maximal_comap p
62+
(h _ (integral_closure.comap_ne_bot ne_bot) _),
63+
apply is_prime.comap
64+
end
65+
end ring
66+
67+
/--
68+
A Dedekind domain is an integral domain that is Noetherian, integrally closed, and
69+
has Krull dimension exactly one (`not_is_field` and `dimension_le_one`).
70+
71+
The integral closure condition is independent of the choice of field of fractions:
72+
use `is_dedekind_domain_iff` to prove `is_dedekind_domain` for a given `fraction_map`.
73+
74+
This is the default implementation, but there are equivalent definitions,
75+
`is_dedekind_domain_dvr` and `is_dedekind_domain_inv`.
76+
TODO: Prove that these are actually equivalent definitions.
77+
-/
78+
class is_dedekind_domain : Prop :=
79+
(not_is_field : ¬ is_field A)
80+
(is_noetherian_ring : is_noetherian_ring A)
81+
(dimension_le_one : dimension_le_one A)
82+
(is_integrally_closed : integral_closure A (fraction_ring A) = ⊥)
83+
84+
/-- An integral domain is a Dedekind domain iff and only if it is not a field, is Noetherian, has dimension ≤ 1,
85+
and is integrally closed in a given fraction field.
86+
In particular, this definition does not depend on the choice of this fraction field. -/
87+
lemma is_dedekind_domain_iff (f : fraction_map A K) :
88+
is_dedekind_domain A ↔
89+
(¬ is_field A) ∧ is_noetherian_ring A ∧ dimension_le_one A ∧
90+
integral_closure A f.codomain = ⊥ :=
91+
⟨λ ⟨hf, hr, hd, hi⟩, ⟨hf, hr, hd,
92+
by rw [←integral_closure_map_alg_equiv (fraction_ring.alg_equiv_of_quotient f),
93+
hi, algebra.map_bot]⟩,
94+
λ ⟨hf, hr, hd, hi⟩, ⟨hf, hr, hd,
95+
by rw [←integral_closure_map_alg_equiv (fraction_ring.alg_equiv_of_quotient f).symm,
96+
hi, algebra.map_bot]⟩⟩
97+
98+
/--
99+
A Dedekind domain is an integral domain that is not a field, is Noetherian, and the localization at
100+
every nonzero prime is a discrete valuation ring.
101+
102+
This is equivalent to `is_dedekind_domain`.
103+
TODO: prove the equivalence.
104+
-/
105+
structure is_dedekind_domain_dvr : Prop :=
106+
(not_is_field : ¬ is_field A)
107+
(is_noetherian_ring : is_noetherian_ring A)
108+
(is_dvr_at_nonzero_prime : ∀ P ≠ (⊥ : ideal A), P.is_prime →
109+
discrete_valuation_ring (localization.at_prime P))
110+
111+
/--
112+
A Dedekind domain is an integral domain that is not a field such that every fractional ideal has an inverse.
113+
114+
This is equivalent to `is_dedekind_domain`.
115+
TODO: prove the equivalence.
116+
-/
117+
structure is_dedekind_domain_inv : Prop :=
118+
(not_is_field : ¬ is_field A)
119+
(mul_inv_cancel : ∀ I ≠ (⊥ : fractional_ideal (fraction_ring.of A)), I * I⁻¹ = 1)
120+
121+
section
122+
123+
open ring.fractional_ideal
124+
125+
lemma is_dedekind_domain_inv_iff (f : fraction_map A K) :
126+
is_dedekind_domain_inv A ↔
127+
(¬ is_field A) ∧ (∀ I ≠ (⊥ : fractional_ideal f), I * I⁻¹ = 1) :=
128+
begin
129+
split; rintros ⟨hf, hi⟩; use hf; intros I hI,
130+
{ have := hi (map (fraction_ring.alg_equiv_of_quotient f).symm.to_alg_hom I) (map_ne_zero _ hI),
131+
erw [← map_inv, ← fractional_ideal.map_mul] at this,
132+
convert congr_arg (map (fraction_ring.alg_equiv_of_quotient f).to_alg_hom) this;
133+
simp only [alg_equiv.to_alg_hom_eq_coe, map_symm_map, map_one] },
134+
{ have := hi (map (fraction_ring.alg_equiv_of_quotient f).to_alg_hom I) (map_ne_zero _ hI),
135+
erw [← map_inv, ← fractional_ideal.map_mul] at this,
136+
convert congr_arg (map (fraction_ring.alg_equiv_of_quotient f).symm.to_alg_hom) this;
137+
simp only [alg_equiv.to_alg_hom_eq_coe, map_map_symm, map_one] }
138+
end
139+
140+
end

0 commit comments

Comments
 (0)