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: IsNormalClosure predicate #8418

Closed
wants to merge 16 commits into from

Conversation

alreadydone
Copy link
Contributor

@alreadydone alreadydone commented Nov 15, 2023

Main changes are to the file NormalClosure:

  • Introduce predicate IsNormalClosure to characterize normal closures L/F of a field extension K/F by the conditions that every minimal polynomial of an element of K over F splits in L, and that L is generated by roots of such polynomials. (When K/F is not necessarily algebraic, the conditions actually says L/F is a normal closure of the algebraic closure of F in K over F.

  • IsNormalClosure.normal: a normal closure is always normal.

  • isNormalClosure_iff : if K/F is algebraic, the "generated by roots" condition in IsNormalClosure can be replaced by "generated by images of embeddings". To prove it, we split out the two inclusions in restrictScalars_eq_iSup_adjoin and golf its proof. restrictScalars_eq_iSup_adjoin is renamed to normalClosure_eq_iSup_adjoin as it has nothing to do with restrictScalars.

  • IsNormalClosure.lift: a normal closure of K/F embeds into any L/F such that the minpolys of K/F splits in L/F.

  • IsNormalClosure.equiv: normal closures are unique up to F-algebra isomorphisms.

  • isNormalClosure_normalClosure: normalClosure F K L is a valid normal closure if K/F is algebraic and all minpolys of K/F splits in L/F; in particular, if there is at least one F-embedding of K into L, and L/F is normal.

  • Algebra.IsAlgebraic.cardinal_mk_algHom_le_of_splits: if every minpoly of K/F splits in L/F, then L is maximal w.r.t. F-embeddings of K, in the sense that K →ₐ[F] L achieves maximal cardinality.

In the file Normal:

  • splits_of_mem_adjoin: If a set of algebraic elements in a field extension K/F have minimal polynomials that split in another extension L/F, then all minimal polynomials in the intermediate field generated by the set also split in L/F. This is in preparation for connecting IsNormalClosure and IsSplittingField.

In the file IntermediateField:

  • Add comap and show it forms a Galois connection with map.

In the file FieldTheory/Adjoin:

  • Add map_sup/iSup lemmas that follow from the Galois connection, plus an additional convenience lemma.

In the file RingTheory/Algebraic: add a lemma AlgHom.isAlgebraic_of_injective.

Co-authored-by: Jz Pan acme_pjz@hotmail.com


Open in Gitpod

@alreadydone alreadydone added awaiting-review The author would like community review of the PR t-algebra Algebra (groups, rings, fields etc) labels Nov 15, 2023
adjoin_algebraic_toSubalgebra fun _ ↦ isAlgebraic_of_mem_rootSet]
exact ⟨fun ⟨spl, adj⟩ ↦ ⟨spl, adj⟩, fun ⟨spl, adj⟩ ↦ ⟨spl, adj⟩⟩

-- Note: p.Splits (algebraMap F E) also works
theorem isSplittingField_iff {p : F[X]} {K : IntermediateField F E} :
p.IsSplittingField F K ↔ p.Splits (algebraMap F K) ∧ K = adjoin F (p.rootSet E) := by
suffices _ → (Algebra.adjoin F (p.rootSet K) = ⊤ ↔ K = adjoin F (p.rootSet E)) by
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is it possible to use your new lemma to golf this proof?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It doesn't quite work because Polynomial.adjoin_rootSet_eq_range is about Subalgebras not IntermediateFields. I wonder whether we should change IsSplittingField to use IntermediateField.adjoin ...

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This can be a good idea, but let's keep it for another PR.

Comment on lines +189 to +194
have : ∀ x ∈ S, (minpoly F x).Splits (algebraMap F E) := fun x hx ↦ splits_of_splits
(splits x hx).2 fun y hy ↦ (le_iSup _ ⟨x, hx⟩ : _ ≤ E) (subset_adjoin F _ <| by exact hy)
obtain ⟨φ⟩ := nonempty_algHom_adjoin_of_splits fun x hx ↦ ⟨(splits x hx).1, this x hx⟩
convert splits_comp_of_splits _ E.val.toRingHom (normal.splits <| φ ⟨x, hx⟩)
rw [minpoly.algHom_eq _ φ.injective, ← minpoly.algHom_eq _ (adjoin F S).val.injective]
rfl
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I haven't looked at this super closely, but it feels like this should all be easier. For instance, going from (minpoly F x).Splits (algebraMap F E) to (minpoly F x).Splits (algebraMap F L) feels like it should be a one-liner. Are there missing lemmas in the library perhaps?

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

going from (minpoly F x).Splits (algebraMap F E) to (minpoly F x).Splits (algebraMap F L) feels like it should be a one-liner.

I think it's Polynomial.splits_comp_of_splits

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As @acmepjz said, if the two minpoly F x were defeq then convert splits_comp_of_splits would close the goal. However, the normal.splits only guarantees the splitting of minpolys of elements in E; since adjoin F S embeds in E (via φ), the minpolys of elements in adjoin F S also splits because they are equal to the minpolys of the images of the elements in E. This is what rw [minpoly.algHom_eq _ φ.injective] does, and then we need another rewrite to go between adjoin F S and K.
The whole proof is a bit nontrivial and uses Normal.of_isSplittingField essentially.

Mathlib/FieldTheory/NormalClosure.lean Outdated Show resolved Hide resolved
Mathlib/FieldTheory/NormalClosure.lean Outdated Show resolved Hide resolved
@alreadydone alreadydone added awaiting-author A reviewer has asked the author a question or requested changes and removed awaiting-review The author would like community review of the PR labels Nov 15, 2023
Copy link
Contributor Author

@alreadydone alreadydone left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the review!

Mathlib/FieldTheory/NormalClosure.lean Outdated Show resolved Hide resolved
adjoin_algebraic_toSubalgebra fun _ ↦ isAlgebraic_of_mem_rootSet]
exact ⟨fun ⟨spl, adj⟩ ↦ ⟨spl, adj⟩, fun ⟨spl, adj⟩ ↦ ⟨spl, adj⟩⟩

-- Note: p.Splits (algebraMap F E) also works
theorem isSplittingField_iff {p : F[X]} {K : IntermediateField F E} :
p.IsSplittingField F K ↔ p.Splits (algebraMap F K) ∧ K = adjoin F (p.rootSet E) := by
suffices _ → (Algebra.adjoin F (p.rootSet K) = ⊤ ↔ K = adjoin F (p.rootSet E)) by
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It doesn't quite work because Polynomial.adjoin_rootSet_eq_range is about Subalgebras not IntermediateFields. I wonder whether we should change IsSplittingField to use IntermediateField.adjoin ...

Comment on lines +189 to +194
have : ∀ x ∈ S, (minpoly F x).Splits (algebraMap F E) := fun x hx ↦ splits_of_splits
(splits x hx).2 fun y hy ↦ (le_iSup _ ⟨x, hx⟩ : _ ≤ E) (subset_adjoin F _ <| by exact hy)
obtain ⟨φ⟩ := nonempty_algHom_adjoin_of_splits fun x hx ↦ ⟨(splits x hx).1, this x hx⟩
convert splits_comp_of_splits _ E.val.toRingHom (normal.splits <| φ ⟨x, hx⟩)
rw [minpoly.algHom_eq _ φ.injective, ← minpoly.algHom_eq _ (adjoin F S).val.injective]
rfl
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As @acmepjz said, if the two minpoly F x were defeq then convert splits_comp_of_splits would close the goal. However, the normal.splits only guarantees the splitting of minpolys of elements in E; since adjoin F S embeds in E (via φ), the minpolys of elements in adjoin F S also splits because they are equal to the minpolys of the images of the elements in E. This is what rw [minpoly.algHom_eq _ φ.injective] does, and then we need another rewrite to go between adjoin F S and K.
The whole proof is a bit nontrivial and uses Normal.of_isSplittingField essentially.

Mathlib/FieldTheory/NormalClosure.lean Outdated Show resolved Hide resolved
@leanprover-community-mathlib4-bot leanprover-community-mathlib4-bot added the merge-conflict The PR has a merge conflict with master, and needs manual merging. label Nov 16, 2023
@alreadydone alreadydone added awaiting-review The author would like community review of the PR awaiting-CI and removed merge-conflict The PR has a merge conflict with master, and needs manual merging. awaiting-author A reviewer has asked the author a question or requested changes awaiting-CI labels Nov 16, 2023
@riccardobrasca riccardobrasca self-assigned this Nov 17, 2023
Mathlib/RingTheory/Algebraic.lean Outdated Show resolved Hide resolved
Mathlib/FieldTheory/IntermediateField.lean Outdated Show resolved Hide resolved
adjoin_algebraic_toSubalgebra fun _ ↦ isAlgebraic_of_mem_rootSet]
exact ⟨fun ⟨spl, adj⟩ ↦ ⟨spl, adj⟩, fun ⟨spl, adj⟩ ↦ ⟨spl, adj⟩⟩

-- Note: p.Splits (algebraMap F E) also works
theorem isSplittingField_iff {p : F[X]} {K : IntermediateField F E} :
p.IsSplittingField F K ↔ p.Splits (algebraMap F K) ∧ K = adjoin F (p.rootSet E) := by
suffices _ → (Algebra.adjoin F (p.rootSet K) = ⊤ ↔ K = adjoin F (p.rootSet E)) by
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This can be a good idea, but let's keep it for another PR.

Mathlib/FieldTheory/NormalClosure.lean Outdated Show resolved Hide resolved
@@ -31,62 +44,135 @@ lemma normalClosure_def : normalClosure F K L = ⨆ f : K →ₐ[F] L, f.fieldRa

variable {F K L}

/-- A normal closure is always normal. -/
lemma IsNormalClosure.normal [h : IsNormalClosure F K L] : Normal F L :=
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can this be an instance?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No way to infer K, right? (Same in Normal.ofIsSplittingField, where there's no way to infer the polynomial.)

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah yes, of course.

@leanprover-community-mathlib4-bot leanprover-community-mathlib4-bot added the merge-conflict The PR has a merge conflict with master, and needs manual merging. label Nov 17, 2023
@@ -31,62 +44,135 @@ lemma normalClosure_def : normalClosure F K L = ⨆ f : K →ₐ[F] L, f.fieldRa

variable {F K L}

/-- A normal closure is always normal. -/
lemma IsNormalClosure.normal [h : IsNormalClosure F K L] : Normal F L :=
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No way to infer K, right? (Same in Normal.ofIsSplittingField, where there's no way to infer the polynomial.)

Mathlib/FieldTheory/IntermediateField.lean Outdated Show resolved Hide resolved
Mathlib/FieldTheory/IntermediateField.lean Outdated Show resolved Hide resolved
Mathlib/RingTheory/Algebraic.lean Outdated Show resolved Hide resolved
Mathlib/FieldTheory/NormalClosure.lean Outdated Show resolved Hide resolved
Co-authored-by: Riccardo Brasca <riccardo.brasca@gmail.com>
@leanprover-community-mathlib4-bot leanprover-community-mathlib4-bot removed the merge-conflict The PR has a merge conflict with master, and needs manual merging. label Nov 17, 2023
@alreadydone alreadydone added awaiting-author A reviewer has asked the author a question or requested changes and removed awaiting-review The author would like community review of the PR labels Nov 17, 2023
@alreadydone alreadydone added awaiting-review The author would like community review of the PR and removed awaiting-author A reviewer has asked the author a question or requested changes labels Nov 17, 2023
@riccardobrasca
Copy link
Member

Thanks!

bors merge

@github-actions github-actions bot added ready-to-merge This PR has been sent to bors. and removed awaiting-review The author would like community review of the PR labels Nov 18, 2023
mathlib-bors bot pushed a commit that referenced this pull request Nov 18, 2023
Main changes are to the file NormalClosure:

+ Introduce predicate `IsNormalClosure` to characterize normal closures L/F of a field extension K/F by the conditions that every minimal polynomial of an element of K over F splits in L, and that L is generated by roots of such polynomials. (When K/F is not necessarily algebraic, the conditions actually says L/F is a normal closure of the algebraic closure of F in K over F.

+ `IsNormalClosure.normal`: a normal closure is always normal.

+ `isNormalClosure_iff `: if K/F is algebraic, the "generated by roots" condition in IsNormalClosure can be replaced by "generated by images of embeddings". To prove it, we split out the two inclusions in `restrictScalars_eq_iSup_adjoin` and golf its proof. `restrictScalars_eq_iSup_adjoin` is renamed to `normalClosure_eq_iSup_adjoin` as it has nothing to do with `restrictScalars`.

+ `IsNormalClosure.lift`: a normal closure of K/F embeds into any L/F such that the minpolys of K/F splits in L/F.

+ `IsNormalClosure.equiv`: normal closures are unique up to F-algebra isomorphisms.

+ `isNormalClosure_normalClosure`: `normalClosure F K L` is a valid normal closure if K/F is algebraic and all minpolys of K/F splits in L/F; in particular, if there is at least one F-embedding of K into L, and L/F is normal.

+ `Algebra.IsAlgebraic.cardinal_mk_algHom_le_of_splits`: if every minpoly of `K/F` splits in `L/F`, then `L` is maximal w.r.t. `F`-embeddings of `K`, in the sense that `K →ₐ[F] L` achieves maximal cardinality.

In the file Normal:

+ `splits_of_mem_adjoin`: If a set of algebraic elements in a field extension `K/F` have minimal polynomials that split in another extension `L/F`, then all minimal polynomials in the intermediate field generated by the set also split in `L/F`. This is in preparation for connecting `IsNormalClosure` and `IsSplittingField`.

In the file IntermediateField:

+ Add `comap` and show it forms a Galois connection with `map`.

In the file FieldTheory/Adjoin:

+ Add `map_sup/iSup` lemmas that follow from the Galois connection, plus an additional convenience lemma.

In the file RingTheory/Algebraic: add a lemma `AlgHom.isAlgebraic_of_injective`.

Co-authored-by: Jz Pan <acme_pjz@hotmail.com>



Co-authored-by: Junyan Xu <junyanxu.math@gmail.com>
@mathlib-bors
Copy link

mathlib-bors bot commented Nov 18, 2023

Pull request successfully merged into master.

Build succeeded:

@mathlib-bors mathlib-bors bot changed the title feat: IsNormalClosure predicate [Merged by Bors] - feat: IsNormalClosure predicate Nov 18, 2023
@mathlib-bors mathlib-bors bot closed this Nov 18, 2023
@mathlib-bors mathlib-bors bot deleted the IsNormalClosure branch November 18, 2023 01:09
acmepjz added a commit that referenced this pull request Nov 19, 2023
alexkeizer pushed a commit that referenced this pull request Nov 21, 2023
Main changes are to the file NormalClosure:

+ Introduce predicate `IsNormalClosure` to characterize normal closures L/F of a field extension K/F by the conditions that every minimal polynomial of an element of K over F splits in L, and that L is generated by roots of such polynomials. (When K/F is not necessarily algebraic, the conditions actually says L/F is a normal closure of the algebraic closure of F in K over F.

+ `IsNormalClosure.normal`: a normal closure is always normal.

+ `isNormalClosure_iff `: if K/F is algebraic, the "generated by roots" condition in IsNormalClosure can be replaced by "generated by images of embeddings". To prove it, we split out the two inclusions in `restrictScalars_eq_iSup_adjoin` and golf its proof. `restrictScalars_eq_iSup_adjoin` is renamed to `normalClosure_eq_iSup_adjoin` as it has nothing to do with `restrictScalars`.

+ `IsNormalClosure.lift`: a normal closure of K/F embeds into any L/F such that the minpolys of K/F splits in L/F.

+ `IsNormalClosure.equiv`: normal closures are unique up to F-algebra isomorphisms.

+ `isNormalClosure_normalClosure`: `normalClosure F K L` is a valid normal closure if K/F is algebraic and all minpolys of K/F splits in L/F; in particular, if there is at least one F-embedding of K into L, and L/F is normal.

+ `Algebra.IsAlgebraic.cardinal_mk_algHom_le_of_splits`: if every minpoly of `K/F` splits in `L/F`, then `L` is maximal w.r.t. `F`-embeddings of `K`, in the sense that `K →ₐ[F] L` achieves maximal cardinality.

In the file Normal:

+ `splits_of_mem_adjoin`: If a set of algebraic elements in a field extension `K/F` have minimal polynomials that split in another extension `L/F`, then all minimal polynomials in the intermediate field generated by the set also split in `L/F`. This is in preparation for connecting `IsNormalClosure` and `IsSplittingField`.

In the file IntermediateField:

+ Add `comap` and show it forms a Galois connection with `map`.

In the file FieldTheory/Adjoin:

+ Add `map_sup/iSup` lemmas that follow from the Galois connection, plus an additional convenience lemma.

In the file RingTheory/Algebraic: add a lemma `AlgHom.isAlgebraic_of_injective`.

Co-authored-by: Jz Pan <acme_pjz@hotmail.com>



Co-authored-by: Junyan Xu <junyanxu.math@gmail.com>
grunweg pushed a commit that referenced this pull request Dec 15, 2023
Main changes are to the file NormalClosure:

+ Introduce predicate `IsNormalClosure` to characterize normal closures L/F of a field extension K/F by the conditions that every minimal polynomial of an element of K over F splits in L, and that L is generated by roots of such polynomials. (When K/F is not necessarily algebraic, the conditions actually says L/F is a normal closure of the algebraic closure of F in K over F.

+ `IsNormalClosure.normal`: a normal closure is always normal.

+ `isNormalClosure_iff `: if K/F is algebraic, the "generated by roots" condition in IsNormalClosure can be replaced by "generated by images of embeddings". To prove it, we split out the two inclusions in `restrictScalars_eq_iSup_adjoin` and golf its proof. `restrictScalars_eq_iSup_adjoin` is renamed to `normalClosure_eq_iSup_adjoin` as it has nothing to do with `restrictScalars`.

+ `IsNormalClosure.lift`: a normal closure of K/F embeds into any L/F such that the minpolys of K/F splits in L/F.

+ `IsNormalClosure.equiv`: normal closures are unique up to F-algebra isomorphisms.

+ `isNormalClosure_normalClosure`: `normalClosure F K L` is a valid normal closure if K/F is algebraic and all minpolys of K/F splits in L/F; in particular, if there is at least one F-embedding of K into L, and L/F is normal.

+ `Algebra.IsAlgebraic.cardinal_mk_algHom_le_of_splits`: if every minpoly of `K/F` splits in `L/F`, then `L` is maximal w.r.t. `F`-embeddings of `K`, in the sense that `K →ₐ[F] L` achieves maximal cardinality.

In the file Normal:

+ `splits_of_mem_adjoin`: If a set of algebraic elements in a field extension `K/F` have minimal polynomials that split in another extension `L/F`, then all minimal polynomials in the intermediate field generated by the set also split in `L/F`. This is in preparation for connecting `IsNormalClosure` and `IsSplittingField`.

In the file IntermediateField:

+ Add `comap` and show it forms a Galois connection with `map`.

In the file FieldTheory/Adjoin:

+ Add `map_sup/iSup` lemmas that follow from the Galois connection, plus an additional convenience lemma.

In the file RingTheory/Algebraic: add a lemma `AlgHom.isAlgebraic_of_injective`.

Co-authored-by: Jz Pan <acme_pjz@hotmail.com>



Co-authored-by: Junyan Xu <junyanxu.math@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
ready-to-merge This PR has been sent to bors. t-algebra Algebra (groups, rings, fields etc)
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

5 participants