@@ -5,7 +5,7 @@ Authors: Thomas Browning and Patrick Lutz
5
5
-/
6
6
7
7
import deprecated.subfield
8
- import linear_algebra.finite_dimensional
8
+ import field_theory.tower
9
9
10
10
/-!
11
11
# Adjoining Elements to Fields
@@ -16,21 +16,21 @@ For example, `algebra.adjoin K {x}` might not include `x⁻¹`.
16
16
17
17
## Main results
18
18
19
- (This is just a start; we've got more to add, including a proof of the Primitive Element Theorem.)
20
-
21
19
- `adjoin_adjoin_left`: adjoining S and then T is the same as adjoining S ∪ T.
20
+ - `bot_eq_top_of_dim_adjoin_eq_one`: if `F⟮x⟯` has dimension `1` over `F` for every `x`
21
+ in `E` then `F = E`
22
22
23
23
## Notation
24
24
25
25
- `F⟮α⟯`: adjoin a single element `α` to `F`.
26
26
-/
27
27
28
28
namespace field
29
+
30
+ section adjoin_def
29
31
variables (F : Type *) [field F] {E : Type *} [field E] [algebra F E] (S : set E)
30
32
31
- /--
32
- `adjoin F S` extends a field `F` by adjoining a set `S ⊆ E`.
33
- -/
33
+ /-- `adjoin F S` extends a field `F` by adjoining a set `S ⊆ E`. -/
34
34
def adjoin : subalgebra F E :=
35
35
{ carrier := field.closure (set.range (algebra_map F E) ∪ S),
36
36
one_mem' := is_submonoid.one_mem,
@@ -39,6 +39,9 @@ def adjoin : subalgebra F E :=
39
39
add_mem' := λ x y, is_add_submonoid.add_mem,
40
40
algebra_map_mem' := λ x, field.mem_closure (or.inl (set.mem_range.mpr ⟨x,rfl⟩)) }
41
41
42
+ lemma adjoin_eq_range_algebra_map_adjoin :
43
+ (adjoin F S : set E) = set.range (algebra_map (adjoin F S) E) := (subtype.range_coe).symm
44
+
42
45
lemma adjoin.algebra_map_mem (x : F) : algebra_map F E x ∈ adjoin F S :=
43
46
field.mem_closure (or.inl (set.mem_range_self x))
44
47
@@ -64,7 +67,8 @@ instance adjoin.set_coe : has_coe_t S (adjoin F S) :=
64
67
{coe := λ x, ⟨x,subset_adjoin F S (subtype.mem x)⟩}
65
68
66
69
lemma adjoin.mono (T : set E) (h : S ⊆ T) : (adjoin F S : set E) ⊆ adjoin F T :=
67
- field.closure_mono (set.union_subset (set.subset_union_left _ _) (set.subset_union_of_subset_right h _))
70
+ field.closure_mono (set.union_subset (set.subset_union_left _ _)
71
+ (set.subset_union_of_subset_right h _))
68
72
69
73
instance adjoin.is_subfield : is_subfield (adjoin F S : set E) := field.closure.is_subfield
70
74
@@ -116,33 +120,127 @@ begin
116
120
(subset_adjoin _ _) },
117
121
end
118
122
119
- variables (α : E)
123
+ /-- `F[S][T] = F[T][S]` -/
124
+ lemma adjoin_adjoin_comm (T : set E) :
125
+ (adjoin (adjoin F S : set E) T : set E) = (adjoin (adjoin F T : set E) S : set E) :=
126
+ by rw [adjoin_adjoin_left, adjoin_adjoin_left, set.union_comm]
120
127
121
- notation K`⟮`:std.prec.max_plus l:(foldr `, ` (h t, set.insert h t) ∅) `⟯` := adjoin K l
128
+ /--
129
+ Variation on `set.insert` to enable good notation for adjoining elements to fields.
130
+ Used to preferentially use `singleton` rather than `insert` when adjoining one element.
131
+ -/
132
+ -- this definition of notation is courtesy of Kyle Miller on zulip
133
+ class insert {α : Type *} (s : set α) :=
134
+ (insert : α → set α)
122
135
123
- -- unfortunately this lemma is not definitionally true
124
- lemma adjoin_singleton : F⟮α⟯ = adjoin F {α} :=
125
- begin
126
- change adjoin F (insert α ∅) = adjoin F {α},
127
- rw insert_emptyc_eq α,
128
- exact set.is_lawful_singleton,
129
- end
136
+ @[priority 1000 ]
137
+ instance insert_empty {α : Type *} : insert (∅ : set α) :=
138
+ { insert := λ x, @singleton _ _ set.has_singleton x }
139
+
140
+ @[priority 900 ]
141
+ instance insert_nonempty {α : Type *} (s : set α) : insert s :=
142
+ { insert := λ x, set.insert x s }
143
+
144
+ notation K`⟮`:std.prec.max_plus l:(foldr `, ` (h t, insert.insert t h) ∅) `⟯` := adjoin K l
145
+
146
+ section adjoin_simple
147
+ variables (α : E)
130
148
131
149
lemma mem_adjoin_simple_self : α ∈ F⟮α⟯ :=
132
- begin
133
- rw adjoin_singleton,
134
- exact subset_adjoin F {α} (set.mem_singleton α),
135
- end
150
+ subset_adjoin F {α} (set.mem_singleton α)
136
151
137
152
/-- generator of `F⟮α⟯` -/
138
153
def adjoin_simple.gen : F⟮α⟯ := ⟨α, mem_adjoin_simple_self F α⟩
139
154
140
- lemma adjoin_simple.algebra_map_gen : algebra_map F⟮α⟯ E (adjoin_simple.gen F α) = α := rfl
155
+ @[simp] lemma adjoin_simple.algebra_map_gen : algebra_map F⟮α⟯ E (adjoin_simple.gen F α) = α := rfl
156
+
157
+ lemma adjoin_simple_adjoin_simple (β : E) : (F⟮α⟯⟮β⟯ : set E) = (F⟮α, β⟯ : set E) :=
158
+ adjoin_adjoin_left _ _ _
159
+
160
+ lemma adjoin_simple_comm (β : E) : (F⟮α⟯⟮β⟯ : set E) = (F⟮β⟯⟮α⟯ : set E) :=
161
+ adjoin_adjoin_comm _ _ _
162
+
163
+ end adjoin_simple
164
+ end adjoin_def
165
+
166
+ section adjoin_subalgebra_lattice
167
+ variables {F : Type *} [field F] {E : Type *} [field E] [algebra F E] {α : E} {S : set E}
168
+
169
+ lemma adjoin_eq_bot (h : S ⊆ (⊥ : subalgebra F E)) : adjoin F S = ⊥ :=
170
+ begin
171
+ rw eq_bot_iff,
172
+ intros x,
173
+ rw [subalgebra.mem_coe, subalgebra.mem_coe, algebra.mem_bot],
174
+ rw algebra.coe_bot at h,
175
+ apply adjoin_subset_subfield _ _ set.subset.rfl h,
176
+ end
177
+
178
+ lemma adjoin_simple_eq_bot (hα : α ∈ ((⊥ : subalgebra F E) : set E)) : F⟮α⟯ = (⊥ : subalgebra F E) :=
179
+ adjoin_eq_bot (set.singleton_subset_iff.mpr hα)
180
+
181
+ lemma adjoin_zero : F⟮0 ⟯ = (⊥ : subalgebra F E) :=
182
+ adjoin_simple_eq_bot (algebra.mem_bot.mpr (is_add_submonoid.zero_mem))
183
+
184
+ lemma adjoin_one : F⟮1 ⟯ = (⊥ : subalgebra F E) :=
185
+ adjoin_simple_eq_bot (algebra.mem_bot.mpr (is_submonoid.one_mem))
186
+
187
+ lemma sub_bot_of_adjoin_sub_bot (h : adjoin F S = ⊥) : S ⊆ (⊥ : subalgebra F E) :=
188
+ calc S ⊆ adjoin F S : subset_adjoin _ _
189
+ ... = (⊥ : subalgebra F E) : congr_arg coe h
190
+
191
+ lemma mem_bot_of_adjoin_simple_sub_bot (h : F⟮α⟯ = ⊥) : α ∈ ((⊥ : subalgebra F E) : set E) :=
192
+ set.singleton_subset_iff.mp (sub_bot_of_adjoin_sub_bot h)
193
+
194
+ lemma adjoin_eq_bot_iff : S ⊆ (⊥ : subalgebra F E) ↔ adjoin F S = ⊥ :=
195
+ ⟨adjoin_eq_bot, sub_bot_of_adjoin_sub_bot⟩
196
+
197
+ lemma adjoin_simple_eq_bot_iff : α ∈ (⊥ : subalgebra F E) ↔ F⟮α⟯ = ⊥ :=
198
+ ⟨adjoin_simple_eq_bot, mem_bot_of_adjoin_simple_sub_bot⟩
199
+
200
+ section adjoin_dim
201
+ open finite_dimensional vector_space
202
+
203
+ lemma sub_bot_of_adjoin_dim_eq_one (h : dim F (adjoin F S) = 1 ) : S ⊆ (⊥ : subalgebra F E) :=
204
+ by rwa [adjoin_eq_bot_iff, ← subalgebra.dim_eq_one_iff]
141
205
142
- lemma adjoin_simple_adjoin_simple (β : E) : F⟮α,β⟯ = adjoin F {α,β} :=
206
+ lemma mem_bot_of_adjoin_simple_dim_eq_one (h : dim F F⟮α⟯ = 1 ) : α ∈ ((⊥ : subalgebra F E) : set E) :=
207
+ set.singleton_subset_iff.mp (sub_bot_of_adjoin_dim_eq_one h)
208
+
209
+ lemma adjoin_dim_eq_one_of_sub_bot (h : S ⊆ (⊥ : subalgebra F E)) : dim F (adjoin F S) = 1 :=
210
+ by { rw adjoin_eq_bot h, exact subalgebra.dim_bot }
211
+
212
+ lemma adjoin_simple_dim_eq_one_of_mem_bot (h : α ∈ ((⊥ : subalgebra F E) : set E)) : dim F F⟮α⟯ = 1 :=
213
+ adjoin_dim_eq_one_of_sub_bot (set.singleton_subset_iff.mpr h)
214
+
215
+ lemma adjoin_dim_eq_one_iff : dim F (adjoin F S) = 1 ↔ S ⊆ (⊥ : subalgebra F E) :=
216
+ ⟨sub_bot_of_adjoin_dim_eq_one, adjoin_dim_eq_one_of_sub_bot⟩
217
+
218
+ lemma adjoin_simple_dim_eq_one_iff : dim F F⟮α⟯ = 1 ↔ α ∈ (⊥ : subalgebra F E) :=
219
+ ⟨mem_bot_of_adjoin_simple_dim_eq_one, adjoin_simple_dim_eq_one_of_mem_bot⟩
220
+
221
+ lemma adjoin_findim_eq_one_iff : findim F (adjoin F S) = 1 ↔ S ⊆ (⊥ : subalgebra F E) :=
222
+ by rw [← adjoin_dim_eq_one_iff, subalgebra.dim_eq_one_iff, subalgebra.findim_eq_one_iff]
223
+
224
+ lemma adjoin_simple_findim_eq_one_iff : findim F F⟮α⟯ = 1 ↔ α ∈ (⊥ : subalgebra F E) :=
225
+ by rw [← adjoin_simple_dim_eq_one_iff, subalgebra.dim_eq_one_iff, subalgebra.findim_eq_one_iff]
226
+
227
+ /-- If `F⟮x⟯` has dimension `1` over `F` for every `x ∈ E` then `F = E`. -/
228
+ lemma bot_eq_top_of_dim_adjoin_eq_one (h : ∀ x : E, dim F F⟮x⟯ = 1 ) : (⊥ : subalgebra F E) = ⊤ :=
229
+ by simp [subalgebra.ext_iff, algebra.mem_top, ← adjoin_simple_dim_eq_one_iff, h]
230
+
231
+ lemma bot_eq_top_of_findim_adjoin_eq_one (h : ∀ x : E, findim F F⟮x⟯ = 1 ) :
232
+ (⊥ : subalgebra F E) = ⊤ :=
233
+ by simp [subalgebra.ext_iff, algebra.mem_top, ← adjoin_simple_findim_eq_one_iff, h]
234
+
235
+ /-- If `F⟮x⟯` has dimension `≤1` over `F` for every `x ∈ E` then `F = E`. -/
236
+ lemma bot_eq_top_of_findim_adjoin_le_one [finite_dimensional F E]
237
+ (h : ∀ x : E, findim F F⟮x⟯ ≤ 1 ) : (⊥ : subalgebra F E) = ⊤ :=
143
238
begin
144
- change adjoin F (insert α (insert β ∅)) = adjoin F _ ,
145
- simp only [insert_emptyc_eq] ,
239
+ have : ∀ x : E, findim F F⟮x⟯ = 1 := λ x, by linarith [h x, show 0 < findim F F⟮x⟯, from findim_pos] ,
240
+ exact bot_eq_top_of_findim_adjoin_eq_one this ,
146
241
end
147
242
243
+ end adjoin_dim
244
+ end adjoin_subalgebra_lattice
245
+
148
246
end field
0 commit comments