Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
1 change: 1 addition & 0 deletions Wanted.lean
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ public import Wanted.Geometry.Euclidean.Volume.Measure
public import Wanted.Geometry.Manifold.PoincareConjecture
public import Wanted.Geometry.Manifold.SmoothEmbedding
public import Wanted.GroupTheory.GroupAction.Jordan
public import Wanted.LinearAlgebra.RootSystem.Classification
public import Wanted.Order.KrullDimension
public import Wanted.Probability.Combinatorics.BinomialRandomGraph.Defs
public import Wanted.Probability.Distributions.Binomial
Expand Down
122 changes: 122 additions & 0 deletions Wanted/LinearAlgebra/RootSystem/Classification.lean
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
/-
Copyright (c) 2026 Oliver Nash. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Oliver Nash
-/
module

public import Mathlib.LinearAlgebra.Matrix.Cartan
public import Mathlib.LinearAlgebra.RootSystem.CartanMatrix
public import Mathlib.LinearAlgebra.RootSystem.OfBilinear

/-!
# The classification of root systems.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Could you add a small description for the un-initiated, perhaps with a (precise) reference?


-/

namespace RootPairing

variable
{ι : Type*} [Finite ι]
{K : Type*} [Field K] [CharZero K]

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Why not over an arbitrary CommRing R? People can weaken the theorem_wanted if they can't get to the full one immediately, but since the library is crafter to accommodate this it seems a pity. Or am I missing something?

{M : Type*} [AddCommGroup M] [Module K M]
{N : Type*} [AddCommGroup N] [Module K N]
{P : RootPairing ι K M N}

def Base.HasCM {n : Type*} [P.IsCrystallographic] (bs : P.Base) (A : Matrix n n ℤ) :=

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Why not a structure fixing e? I understand that this would not really be unique (because of the permutation), but it would be easier to access for the API, no?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Rather annoyingly, an abelian variety "has CM" (aka "has complex multiplication") if its endomorphism ring is large in some precise sense, and this is a standard abbreviation in the area. Can we not face HasCartanMatrix?

∃ e, bs.cartanMatrix.reindex e e = A

/-! *Uniqueness*

Note that we already have `RootPairing.Base.equivOfCartanMatrixEq` so the statement below about
Cartan matrices really is all that is required. Note also that the triple-bond case is essentially
`RootPairing.IsG2.card_base_support_eq_two` (+ related API).

-/

theorem_wanted Base.hasCM_A_or_B_or_C_or_D_or_E_or_F_or_G

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Doesn't this call for a definition of "classical groups", or something? It would probably just be an inductive type with the list of gadgets, but at least this statement would be nicer. Something like

 | A (n : ℕ) → ClassicalGroupOrWhatever
 |...
 | E6 : ClassicalGroupOrWhatever
 |...

does it make sense?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

It occurred to me that the current statement is not ideal for a different reason: this should really be a result about matrices and not use the language of root systems at all. The right statement is:

theorem_wanted Matrix.IsFiniteCartan.exists_A_or_B_or_C_or_D_or_E_or_F_or_G
    {ι : Type*} [Fintype ι] [DecidableEq ι]
    (M : Matrix ι ι ℤ) (hM : M.IsFiniteCartan) (hM' : M.IsIndecomposable) :
    (∃ n e, M.reindex e e = CartanMatrix.A n) ∨
    (∃ n e, M.reindex e e = CartanMatrix.B n) ∨
    (∃ n e, M.reindex e e = CartanMatrix.C n) ∨
    (∃ n e, M.reindex e e = CartanMatrix.D n) ∨
    (∃ e, M.reindex e e = CartanMatrix.E 6) ∨
    (∃ e, M.reindex e e = CartanMatrix.E 7) ∨
    (∃ e, M.reindex e e = CartanMatrix.E 8) ∨
    (∃ e, M.reindex e e = CartanMatrix.F₄) ∨
    (∃ e, M.reindex e e = CartanMatrix.G₂)

This needs #43121 so I'll return to this work once that is (hopefully!) in master.

[P.IsReduced] [P.IsCrystallographic] [P.IsIrreducible] [P.IsRootSystem]
(bs : P.Base) :
(∃ n, bs.HasCM (CartanMatrix.A n)) ∨
(∃ n, bs.HasCM (CartanMatrix.B n)) ∨
(∃ n, bs.HasCM (CartanMatrix.C n)) ∨
(∃ n, bs.HasCM (CartanMatrix.D n)) ∨
bs.HasCM (CartanMatrix.E 6) ∨
bs.HasCM (CartanMatrix.E 7) ∨
bs.HasCM (CartanMatrix.E 8) ∨
bs.HasCM CartanMatrix.F₄ ∨
bs.HasCM CartanMatrix.G₂

/-! *Existence*

Probably the best route is to construct these by developing further API for `RootPairing.ofBilinear`
and then invoking it with appropriate matrices over `ℤ`.

-/

variable (ι K M N) (n : ℕ) [NeZero n]

def_wanted a : RootPairing (Fin <| n * (n + 1)) K M N
instance_wanted : (❰a❱ K M N n).IsReduced
instance_wanted : (❰a❱ K M N n).IsIrreducible
instance_wanted : (❰a❱ K M N n).IsValuedIn ℤ
instance_wanted : (❰a❱ K M N n).IsRootSystem
theorem_wanted a_hasCM_a : ∀ bs : (❰a❱ K M N n).Base, bs.HasCM (CartanMatrix.A n)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actually only the instance_wanted : (❰a❱ K M N n).IsValuedIn ℤ is needed for the theorem, right? It might be worth it to section the file so that if someone feels like embarking on proving it, they don't need to prove reduceness/irreducibility.


def_wanted b : RootPairing (Fin <| 2 * n * n) K M N
instance_wanted : (❰b❱ K M N n).IsReduced
instance_wanted : (❰b❱ K M N n).IsIrreducible
instance_wanted : (❰b❱ K M N n).IsValuedIn ℤ
instance_wanted : (❰b❱ K M N n).IsRootSystem
theorem_wanted b_hasCM_b : ∀ bs : (❰b❱ K M N n).Base, bs.HasCM (CartanMatrix.B n)

def_wanted c : RootPairing (Fin <| 2 * n * n) K M N
instance_wanted : (❰c❱ K M N n).IsReduced
instance_wanted : (❰c❱ K M N n).IsIrreducible
instance_wanted : (❰c❱ K M N n).IsValuedIn ℤ
instance_wanted : (❰c❱ K M N n).IsRootSystem
theorem_wanted c_hasCM_c : ∀ bs : (❰c❱ K M N n).Base, bs.HasCM (CartanMatrix.C n)

def_wanted d : RootPairing (Fin <| 2 * n * (n - 1)) K M N
instance_wanted : (❰d❱ K M N n).IsReduced
theorem_wanted d_isIrreducible (hn : n ≠ 2) : (❰d❱ K M N n).IsIrreducible
instance_wanted : (❰d❱ K M N n).IsValuedIn ℤ
instance_wanted : (❰d❱ K M N n).IsRootSystem
theorem_wanted d_hasCM_d : ∀ bs : (❰d❱ K M N n).Base, bs.HasCM (CartanMatrix.D n)

def_wanted e₆ : RootPairing (Fin 72) K M N
instance_wanted : (❰e₆❱ K M N).IsReduced
instance_wanted : (❰e₆❱ K M N).IsIrreducible
instance_wanted : (❰e₆❱ K M N).IsValuedIn ℤ
instance_wanted : (❰e₆❱ K M N).IsRootSystem
theorem_wanted e₆_hasCM_e₆ : ∀ bs : (❰e₆❱ K M N).Base, bs.HasCM (CartanMatrix.E 6)

def_wanted e₇ : RootPairing (Fin 126) K M N
instance_wanted : (❰e₇❱ K M N).IsReduced
instance_wanted : (❰e₇❱ K M N).IsIrreducible
instance_wanted : (❰e₇❱ K M N).IsValuedIn ℤ
instance_wanted : (❰e₇❱ K M N).IsRootSystem
theorem_wanted e₇_hasCM_e₇ : ∀ bs : (❰e₇❱ K M N).Base, bs.HasCM (CartanMatrix.E 7)

def_wanted e₈ : RootPairing (Fin 240) K M N
instance_wanted : (❰e₈❱ K M N).IsReduced
instance_wanted : (❰e₈❱ K M N).IsIrreducible
instance_wanted : (❰e₈❱ K M N).IsValuedIn ℤ
instance_wanted : (❰e₈❱ K M N).IsRootSystem
theorem_wanted e₈_hasCM_e₈ : ∀ bs : (❰e₈❱ K M N).Base, bs.HasCM (CartanMatrix.E 8)

def_wanted f₄ : RootPairing (Fin 48) K M N
instance_wanted : (❰f₄❱ K M N).IsReduced
instance_wanted : (❰f₄❱ K M N).IsIrreducible
instance_wanted : (❰f₄❱ K M N).IsValuedIn ℤ
instance_wanted : (❰f₄❱ K M N).IsRootSystem
theorem_wanted f₄_hasCM_f₄ : ∀ bs : (❰f₄❱ K M N).Base, bs.HasCM CartanMatrix.F₄

def_wanted g₂ : RootPairing (Fin 12) K M N
instance_wanted : (❰g₂❱ K M N).IsReduced
instance_wanted : (❰g₂❱ K M N).IsIrreducible
instance_wanted : (❰g₂❱ K M N).IsValuedIn ℤ
instance_wanted : (❰g₂❱ K M N).IsRootSystem
theorem_wanted g₂_hasCM_g₂ : ∀ bs : (❰g₂❱ K M N).Base, bs.HasCM CartanMatrix.G₂

end RootPairing
Loading