Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Merged by Bors] - feat(field_theory/adjoin): adjoining elements to fields #3913

Closed
wants to merge 32 commits into from
Closed
Changes from 3 commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
b1d56ff
feat(field_theory/adjoin): new file
tb65536 Aug 22, 2020
113adde
doc(field_theory/adjoin): add docstrings
tb65536 Aug 23, 2020
59e5371
refactor(field_theory/adjoin): remove assumption
tb65536 Aug 23, 2020
f9b010e
Update src/field_theory/adjoin.lean
tb65536 Aug 26, 2020
c6d4e4b
Update src/field_theory/adjoin.lean
tb65536 Aug 26, 2020
0dc8299
Update src/field_theory/adjoin.lean
tb65536 Aug 26, 2020
13b1503
Update src/field_theory/adjoin.lean
tb65536 Aug 26, 2020
8b5b1f1
Update src/field_theory/adjoin.lean
tb65536 Aug 26, 2020
6a19cdc
fix(field_theory/adjoin.lean) change adjoin_simple.gen
tb65536 Aug 26, 2020
206f7ef
doc(field_theory/adjoin.lean): explained why field adjoin is not nece…
tb65536 Aug 26, 2020
88a2562
feat(field_theory/adjoin.lean): adjoin F S is now automatically a sub…
tb65536 Aug 26, 2020
cdf5f3e
refactor(field_theory/adjoin.lean): algebra_tower no longer needed
tb65536 Aug 26, 2020
ec1a1b7
refactor(field_theory/adjoin.lean): clean up
tb65536 Aug 26, 2020
0d6cac8
refactor(field_theory/adjoin.lean): indent proof of adjoin_twice
tb65536 Aug 26, 2020
f4595a2
making some of the requested changes
pglutz Aug 28, 2020
d736714
Update src/field_theory/adjoin.lean
tb65536 Aug 28, 2020
0528cb7
refactor(field_theory/adjoin): remove adjoin.composition
tb65536 Aug 28, 2020
8573f92
refactor(field_theory/adjoin): remove adjoin.set_mem
tb65536 Aug 28, 2020
a67b301
refactor(field_theory/adjoin): change notation
tb65536 Aug 28, 2020
a53f38e
new proof of set_range_subset
pglutz Aug 28, 2020
1cff5e2
moved lemma to ring_theory/algebra and changed comments to match new …
pglutz Aug 28, 2020
132b72b
refactor(field_theory/adjoin): prove adjoin is field
tb65536 Aug 29, 2020
067b0f3
Update src/field_theory/adjoin.lean
tb65536 Aug 29, 2020
01a9747
Update src/field_theory/adjoin.lean
tb65536 Aug 29, 2020
2c321b4
Update src/field_theory/adjoin.lean
tb65536 Aug 29, 2020
03401ae
Update src/field_theory/adjoin.lean
tb65536 Aug 29, 2020
920a594
Update src/field_theory/adjoin.lean
tb65536 Aug 29, 2020
10558a0
Update src/field_theory/adjoin.lean
tb65536 Aug 29, 2020
1279b64
doc(field_theory/adjoin.lean): rename theorem in doc
tb65536 Aug 30, 2020
794dad1
refactor(field_theory/adjoin.lean): new brackets
tb65536 Aug 30, 2020
ac725eb
Update src/field_theory/adjoin.lean
tb65536 Aug 30, 2020
e0601e3
updated documentation to reflect new notation
pglutz Aug 30, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
204 changes: 204 additions & 0 deletions src/field_theory/adjoin.lean
@@ -0,0 +1,204 @@
/-
Copyright (c) 2020 Thomas Browning and Patrick Lutz. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Thomas Browning and Patrick Lutz
-/

import field_theory.subfield
import field_theory.separable
import field_theory.tower
import group_theory.subgroup
import field_theory.minimal_polynomial
import linear_algebra.dimension
import linear_algebra.finite_dimensional
import ring_theory.adjoin_root
import data.zmod.basic
tb65536 marked this conversation as resolved.
Show resolved Hide resolved

/-!
# Adjoining Elements to Fields

In this file we introduce the notion of adjoining elements to fields.
This isn't quite the same as adjoining elements to rings, since the element might not be algebraic.
tb65536 marked this conversation as resolved.
Show resolved Hide resolved

## Main results

(This is just a start, We've got more to add, including a proof of the Primitive Element Theorem)
tb65536 marked this conversation as resolved.
Show resolved Hide resolved

- `adjoin_twice`: adjoining S and then T is the same as adjoining S ∪ T.
tb65536 marked this conversation as resolved.
Show resolved Hide resolved

## Notation

- `F[α]` : Adjoin α to F.
tb65536 marked this conversation as resolved.
Show resolved Hide resolved
tb65536 marked this conversation as resolved.
Show resolved Hide resolved
-/

pglutz marked this conversation as resolved.
Show resolved Hide resolved
variables (F : Type*) [field F] {E : Type*} [field E] [algebra F E] (S : set E)

/--
Adjoining a set S ⊆ E to a field F
-/
tb65536 marked this conversation as resolved.
Show resolved Hide resolved
def adjoin : set E := field.closure (set.range (algebra_map F E) ∪ S)
tb65536 marked this conversation as resolved.
Show resolved Hide resolved

lemma adjoin.field_mem (x : F) : algebra_map F E x ∈ adjoin F S :=
pglutz marked this conversation as resolved.
Show resolved Hide resolved
field.mem_closure (or.inl (set.mem_range_self x))

lemma adjoin.field_subset : set.range (algebra_map F E) ⊆ adjoin F S :=
pglutz marked this conversation as resolved.
Show resolved Hide resolved
begin
intros x hx,
cases hx with f hf,
rw ←hf,
exact adjoin.field_mem F S f,
end

instance adjoin.field_coe : has_coe_t F (adjoin F S) :=
{coe := λ x, ⟨algebra_map F E x, adjoin.field_mem F S x⟩}

lemma adjoin.set_mem (x : S) : ↑x ∈ adjoin F S :=
pglutz marked this conversation as resolved.
Show resolved Hide resolved
field.mem_closure (or.inr (subtype.mem x))

lemma adjoin.set_subset : S ⊆ adjoin F S :=
pglutz marked this conversation as resolved.
Show resolved Hide resolved
λ x hx, adjoin.set_mem F S ⟨x,hx⟩

instance adjoin.set_coe : has_coe_t S (adjoin F S) :=
{coe := λ x, ⟨↑x, adjoin.set_mem F S x⟩}

lemma adjoin.mono (T : set E) (h : S ⊆ T) : adjoin F S ⊆ adjoin F T :=
field.closure_mono (set.union_subset (set.subset_union_left _ _) (set.subset_union_of_subset_right h _))

instance adjoin.is_subfield : is_subfield (adjoin F S) := field.closure.is_subfield

lemma adjoin_contains_field_as_subfield (F : set E) {HF : is_subfield F} : F ⊆ adjoin F S :=
pglutz marked this conversation as resolved.
Show resolved Hide resolved
λ x hx, adjoin.field_mem F S ⟨x, hx⟩

lemma adjoin_contains_subset {T : set E} {H : T ⊆ S} : T ⊆ adjoin F S :=
pglutz marked this conversation as resolved.
Show resolved Hide resolved
begin
intros x hx,
exact adjoin.set_mem F S ⟨x,H hx⟩,
end

instance adjoin.is_algebra : algebra F (adjoin F S) := {
smul := λ x y, ⟨algebra_map F E x, adjoin.field_mem F S x⟩ * y,
to_fun := λ x, ⟨algebra_map F E x, adjoin.field_mem F S x⟩,
map_one' := by simp only [ring_hom.map_one];refl,
map_mul' := λ x y, by simp only [ring_hom.map_mul];refl,
map_zero' := by simp only [ring_hom.map_zero];refl,
map_add' := λ x y, by simp only [ring_hom.map_add];refl,
commutes' := λ x y, by rw mul_comm,
smul_def' := λ x y, rfl,
}
pglutz marked this conversation as resolved.
Show resolved Hide resolved

/-- F[S] is an F-submodule of E -/
def adjoin_as_submodule : submodule F E := {
carrier := adjoin F S,
zero_mem' := is_add_submonoid.zero_mem,
add_mem' := λ a b, is_add_submonoid.add_mem,
smul_mem' :=
begin
intros a b hb,
rw algebra.smul_def,
exact is_submonoid.mul_mem (adjoin.field_mem F S a) hb,
end
}

/-- proves an obvious linear equivalence (occasionally useful when working with dimension) -/
definition adjoin_as_submodule_equiv : (adjoin F S) ≃ₗ[F] (adjoin_as_submodule F S) := {
to_fun := λ x, x,
map_add' := λ x y, rfl,
map_smul' :=
begin
intros x y,
ext1,
change _ = x • ↑y,
rw algebra.smul_def,
rw algebra.smul_def,
refl,
end,
inv_fun := λ x, x,
left_inv := λ x, rfl,
right_inv := λ x, rfl,
}
tb65536 marked this conversation as resolved.
Show resolved Hide resolved

/-- If F ⊆ T and S ⊆ T then F[S] ⊆ F[T] -/
pglutz marked this conversation as resolved.
Show resolved Hide resolved
lemma adjoin_subset {T : set E} [is_subfield T] (HF : set.range (algebra_map F E) ⊆ T)
pglutz marked this conversation as resolved.
Show resolved Hide resolved
(HS : S ⊆ T) : adjoin F S ⊆ T :=
pglutz marked this conversation as resolved.
Show resolved Hide resolved
begin
apply field.closure_subset,
rw set.union_subset_iff,
exact ⟨HF,HS⟩,
pglutz marked this conversation as resolved.
Show resolved Hide resolved
end

/-- If S ⊆ F[T] then F[S] ⊆ F[T] -/
pglutz marked this conversation as resolved.
Show resolved Hide resolved
lemma adjoin_subset' {T : set E} (HT : S ⊆ adjoin F T) : adjoin F S ⊆ adjoin F T :=
pglutz marked this conversation as resolved.
Show resolved Hide resolved
adjoin_subset F S (adjoin.field_subset F T) HT

lemma set_range_subset {T₁ T₂ : set E} [is_subfield T₁] {hyp : T₁ ⊆ T₂} :
set.range (algebra_map T₁ E) ⊆ T₂ :=
begin
intros x hx,
cases hx with f hf,
rw ←hf,
cases f with t ht,
exact hyp ht,
end
tb65536 marked this conversation as resolved.
Show resolved Hide resolved

lemma adjoin_contains_field_subset {F : set E} {HF : is_subfield F} {T : set E} {HT : T ⊆ F} :
T ⊆ adjoin F S :=
λ x hx, adjoin.field_mem F S ⟨x,HT hx⟩
pglutz marked this conversation as resolved.
Show resolved Hide resolved

/-- F[S][T] = F[S ∪ T] -/
tb65536 marked this conversation as resolved.
Show resolved Hide resolved
lemma adjoin_twice (T : set E) : adjoin (adjoin F S) T = adjoin F (S ∪ T) :=
pglutz marked this conversation as resolved.
Show resolved Hide resolved
begin
apply set.eq_of_subset_of_subset,
tb65536 marked this conversation as resolved.
Show resolved Hide resolved
apply adjoin_subset,
apply set_range_subset,
apply adjoin_subset,
apply adjoin.field_subset,
apply adjoin_contains_subset,
apply set.subset_union_left,
apply adjoin_contains_subset,
apply set.subset_union_right,
apply adjoin_subset,
transitivity adjoin F S,
apply adjoin.field_subset,
apply adjoin_subset,
apply adjoin_contains_field_subset,
apply adjoin.field_subset,
apply adjoin_contains_field_subset,
apply adjoin.set_subset,
apply set.union_subset,
apply adjoin_contains_field_subset,
apply adjoin.set_subset,
apply adjoin.set_subset,
end
pglutz marked this conversation as resolved.
Show resolved Hide resolved

lemma adjoin.composition :
(algebra_map F E) = (algebra_map (adjoin F S) E).comp (algebra_map F (adjoin F S)) := by ext;refl
pglutz marked this conversation as resolved.
Show resolved Hide resolved

instance adjoin_algebra_tower : is_scalar_tower F (adjoin F S) E := {
smul_assoc :=
begin
intros x y z,
rw algebra.smul_def,
rw algebra.smul_def,
rw algebra.smul_def,
rw ring_hom.map_mul,
rw mul_assoc,
refl,
end
}
tb65536 marked this conversation as resolved.
Show resolved Hide resolved

variables (α : E)

--we're working on automatically getting notation for K[α,β,γ], but haven't quite figured it out yet
notation K`[`:std.prec.max_plus β`]` := adjoin K (@singleton _ _ set.has_singleton β)
notation K`[`:std.prec.max_plus β `,` γ`]` := adjoin K {β,γ}
tb65536 marked this conversation as resolved.
Show resolved Hide resolved

lemma adjoin_simple.element_mem : α ∈ F[α] :=
tb65536 marked this conversation as resolved.
Show resolved Hide resolved
adjoin.set_mem F {α} (⟨α,set.mem_singleton α⟩ : ({α} : set E))

/-- generator of F(α) -/
def adjoin_simple.gen : F[α] := ⟨α, adjoin_simple.element_mem F α⟩

lemma adjoin_simple.gen_eq_alpha : algebra_map F[α] E (adjoin_simple.gen F α) = α := rfl
tb65536 marked this conversation as resolved.
Show resolved Hide resolved

lemma adjoin_simple_twice (β : E) : F[α][β] = adjoin F {α,β} :=
tb65536 marked this conversation as resolved.
Show resolved Hide resolved
adjoin_twice _ _ _