Skip to content
Closed
Show file tree
Hide file tree
Changes from 12 commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
b65f47e
feat(RingTheory/IsAdjoinRoot): mkOfAdjoinEqTop'
ROTARTSI82 Mar 1, 2026
d601c39
feat(LocalRing/Etale): Finite etale extensions are monogenic
ROTARTSI82 Mar 1, 2026
5a4b075
simp lemma + update mathlib
ROTARTSI82 Mar 5, 2026
5823012
move lemmas
ROTARTSI82 Mar 9, 2026
876313a
Revert "feat(LocalRing/Etale): Finite etale extensions are monogenic"
ROTARTSI82 Mar 9, 2026
e9ccfff
oops fix natDegree_le'
ROTARTSI82 Mar 10, 2026
19a085a
golf away simp lemma
ROTARTSI82 Mar 18, 2026
d50bc8a
use endomorphism cayley-hamilton
ROTARTSI82 Apr 6, 2026
991e67d
Merge branch 'master' into grant/monogenic-extensions
ROTARTSI82 Apr 6, 2026
3ddec91
Apply suggestions from code review
ROTARTSI82 Apr 7, 2026
00f638a
golf + fix simpa
ROTARTSI82 Apr 7, 2026
b02c2f8
LinearMap.finrank_le_finrank_of_surjective
ROTARTSI82 Apr 7, 2026
2314a3d
OrzechProperty.bijective_of_surjective_of_finrank_le
ROTARTSI82 Apr 9, 2026
821cdc5
invoke in mkOfAdjoinEqTop'
ROTARTSI82 Apr 9, 2026
11552b2
unprime minpoly.natDegree_le
ROTARTSI82 Apr 11, 2026
9ed017f
revert OrzechProperty.bijective_of_surjective_of_finrank_le + fixes
ROTARTSI82 Apr 11, 2026
d05b4d2
Merge branch 'master' into grant/monogenic-extensions
ROTARTSI82 Apr 11, 2026
db4fd80
rm Nontrivial + public import + golf
ROTARTSI82 Apr 13, 2026
fedc305
missed public import
ROTARTSI82 Apr 13, 2026
8ff777a
Merge remote-tracking branch 'upstream/master' into grant/monogenic-e…
ROTARTSI82 Apr 13, 2026
c2b0980
rm another Nontrivial + simp API + golf
ROTARTSI82 Apr 14, 2026
75af86c
simp lemmas for mkOfAdjoinEqTop (unprimed)
ROTARTSI82 Apr 15, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 19 additions & 3 deletions Mathlib/LinearAlgebra/Charpoly/Basic.lean
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,6 @@ in any basis is in `LinearAlgebra/Charpoly/ToMatrix`.

universe u v w

variable {R : Type u} {M : Type v} [CommRing R]
variable [AddCommGroup M] [Module R M] [Module.Free R M] [Module.Finite R M] (f : M →ₗ[R] M)

open Matrix Polynomial

noncomputable section
Expand All @@ -40,6 +37,9 @@ open Module.Free Polynomial Matrix

namespace LinearMap

variable {R : Type u} {M : Type v} [CommRing R]
variable [AddCommGroup M] [Module R M] [Module.Free R M] [Module.Finite R M] (f : M →ₗ[R] M)

section Basic

/-- The characteristic polynomial of `f : M →ₗ[R] M`. -/
Expand Down Expand Up @@ -133,3 +133,19 @@ theorem minpoly_coeff_zero_of_injective [Nontrivial R] (hf : Function.Injective
end CayleyHamilton

end LinearMap

section Algebra
variable {R M} [CommRing R] [Ring M] [Algebra R M]
[Module.Finite R M] [Module.Free R M]

theorem Algebra.aeval_self_charpoly_lmul {α : M} :
Comment thread
ROTARTSI82 marked this conversation as resolved.
Outdated
aeval α (Algebra.lmul R M α).charpoly = 0 :=
Algebra.lmul_injective (R := R) <| by
simpa [← aeval_algHom_apply] using LinearMap.aeval_self_charpoly <| Algebra.lmul _ _ α

theorem minpoly.natDegree_le' [Nontrivial R] {α : M} :
Comment thread
ROTARTSI82 marked this conversation as resolved.
Outdated
(minpoly R α).natDegree ≤ Module.finrank R M := by
simpa [← (Algebra.lmul _ _ α).charpoly_natDegree] using natDegree_le_natDegree <| minpoly.min _ _
Comment thread
ROTARTSI82 marked this conversation as resolved.
Outdated
(Algebra.lmul R _ α).charpoly_monic Algebra.aeval_self_charpoly_lmul

Comment thread
riccardobrasca marked this conversation as resolved.
end Algebra
6 changes: 6 additions & 0 deletions Mathlib/LinearAlgebra/Dimension/Constructions.lean
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,12 @@ theorem Submodule.finrank_quotient_le [StrongRankCondition R] [Module.Finite R M
toNat_le_toNat ((Submodule.mkQ s).rank_le_of_surjective Quot.mk_surjective)
(rank_lt_aleph0 _ _)

theorem LinearMap.finrank_le_finrank_of_surjective
[Module R M'] [StrongRankCondition R] [Module.Finite R M]
{f : M →ₗ[R] M'} (h : Function.Surjective f) : Module.finrank R M' ≤ Module.finrank R M := by
rw [← f.quotKerEquivOfSurjective h |>.finrank_eq]
exact Submodule.finrank_quotient_le _

end Quotient

variable [Semiring R] [CommSemiring S] [AddCommMonoid M] [AddCommMonoid M'] [AddCommMonoid M₁]
Expand Down
29 changes: 29 additions & 0 deletions Mathlib/RingTheory/IsAdjoinRoot.lean
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ module
public import Mathlib.Algebra.Polynomial.AlgebraMap
public import Mathlib.FieldTheory.Minpoly.IsIntegrallyClosed
public import Mathlib.RingTheory.PowerBasis
import Mathlib.LinearAlgebra.Charpoly.Basic

/-!
# A predicate on adjoining roots of polynomial
Expand Down Expand Up @@ -647,6 +648,34 @@ theorem minpoly_eq [IsDomain R] [IsDomain S] [IsTorsionFree R S] [IsIntegrallyCl
(hirr.isUnit_or_isUnit hq).resolve_left <| minpoly.not_isUnit R h.root
rw [mul_one]

/-- If `α` generates `S` as an algebra, then `S` is given by adjoining a root of `minpoly R α`. -/
Comment thread
ROTARTSI82 marked this conversation as resolved.
Outdated
def mkOfAdjoinEqTop'
[Module.Finite R S] [Module.Free R S] [Nontrivial R]
Comment thread
ROTARTSI82 marked this conversation as resolved.
Outdated
{α : S} (hα : Algebra.adjoin R {α} = ⊤) :
IsAdjoinRootMonic S (minpoly R α) where
map := aeval α
ker_map := by
set f := minpoly R α
have hf := minpoly.monic (Algebra.IsIntegral.isIntegral (R := R) α)
let φ : AdjoinRoot f →ₐ[R] S :=
AdjoinRoot.liftAlgHom f (Algebra.ofId R S) α (minpoly.aeval R α)
have hφ : Function.Surjective φ := by
rw [Algebra.adjoin_singleton_eq_range_aeval, AlgHom.range_eq_top] at hα
intro s; obtain ⟨p, hp⟩ := hα s
exact ⟨AdjoinRoot.mk f p, by simp [φ, ← aeval_def, hp]⟩
refine IsAdjoinRoot.ofAdjoinRootEquiv (AlgEquiv.ofBijective φ ⟨?_, hφ⟩) |>.ker_map
haveI := hf.free_adjoinRoot; haveI := hf.finite_adjoinRoot
letI : Module R (AdjoinRoot f) := Algebra.toModule
have e := LinearEquiv.ofFinrankEq (R := R) (AdjoinRoot f) S <|
le_antisymm (finrank_quotient_span_eq_natDegree' hf ▸ minpoly.natDegree_le')
(LinearMap.finrank_le_finrank_of_surjective (f:=φ.toLinearMap) hφ)
exact fun x y h => OrzechProperty.injective_of_surjective_endomorphism
(e.symm.toLinearMap.comp φ.toLinearMap)
(e.symm.surjective.comp hφ) (congr_arg e.symm h)
map_surjective := by
rwa [Algebra.adjoin_singleton_eq_range_aeval, AlgHom.range_eq_top] at *
monic := minpoly.monic (Algebra.IsIntegral.isIntegral α)

end IsAdjoinRootMonic

section Algebra
Expand Down
Loading