Zulip Chat Archive
Stream: maths
Topic: classification of finite subgroups of SL(2,F)
Alex Brodbelt (Jan 18 2025 at 14:01):
Edit:
Context:
I am working on the classification of finite subgroups of , where is an algebraically closed field of characteristic .
This is relevant because when is algebraically closed, and it should not be too much work to classify subgroups of from considering the center is .
I am primarily following:
ChristopherButlerExpositionOnClassificationFinSubSL2F
as a lot of the works is done for me, most if not all proofs are there.
So far I have formalised Chapter 1 - Properties of SL(2, F) over an Algebraically Closed Field.
Summarising the main definitions and results:
Definitions:
-
(will be renamed after Kevin's comment)
-
- (will probably be renamed after Kevin's comment)
- is a finite subgroup of , which is the object to be classified.
Main results:
-
An element of is conjugate to either or . (1)
-
. (2)
-
(additive group within ). (3)
-
for .
-
for .
-
Conjugate elements have conjugate centralizers. (4)
-
is commutative (using (1), (4) and (2) (3) ).
-
Results on normalizers of and .
Chapter 2 - The Maximal Abelian Subgroup Class Equation
Definitions:
- is the set of maximal abelian subgroups of . Implemented as:
def IsMaximalAbelian (G : Type*) [Group G] (H : Subgroup G) : Prop := Maximal (IsCommutative) H
def MaximalAbelianSubgroups { L : Type*} [Group L] (G : Subgroup L) : Set (Subgroup L) :=
{ K : Subgroup L | IsMaximalAbelian G (K.subgroupOf G) ∧ K ≤ G}
- Elementary Abelian Subgroups. I am aware Yaël mentioned that they were defined in PFR but were defined additively. I have defined them as a simple proposition:
def IsElementaryAbelian {G : Type*} [Group G] (p : ℕ) (H : Subgroup G) : Prop :=
IsCommutative H ∧ ∀ h : H, h ≠ 1 → orderOf h = p
Main results:
-
If then .
-
If and then .
-
If either is cyclic and has order coprime to or it is isomorphic to where is elementary abelian -Sylow subgroup of (Currently on this one, half way there or so, after Artie's idea I think I will done with this today).
(This is for proving Theorem 2.3.iii in the exposition which is available above)
Let
- be a field of characteristic , the exposition does not treat the case when as far as I can see (even though it seems to assume it has been proven for this case).
- a finite subgroup of containing the center ;
G :SL(2,F)
withcenter SL(2,F) = Z < G
(explicitly, - the case where they are equal has been treated). - be a maximal abelian subgroup of has type
A : Subgroup Subgroup SL(2,F)
withA ≤ G
.
Then is either cyclic and has order coprime to or it is isomorphic to where is elementary abelian -Sylow subgroup of .
proof/formalization/sketch:
As there exists an element , such that .
As is conjugate to or , (the case where is conjugate to has been dealt with after help from Kevin and others in another thread) so we focus on the case where is conjugate to (the case for is exactly the same so we leave it).
There exists some (as otherwise, if , ) such that is conjugate to ; because conjugate elements have conjugate centralizers, there exists some such that .
Bearing in mind, and taking into account Artie's reasoning.
.
The last isomorphism is constructed by feeding in one isomorphism into another:
From the isomorphism and for , normal (as commutative) and trivial intersection between . this is what I am stuck trying to formalize
All of this allows to conclude , denote the isomorphism by$$\phi$$. Because is finite is finite and pulling back along is the desired as I believe .
Assuming this last part is correct, then for characteristic take , then as , there must exist such that and , this was arbitrary for any so this fact added with being commutative, we can conclude is elementary abelian.
...It being -Sylow subgroup can wait for now.
Thank you for the help so far, and thank you in advance.
Artie Khovanov (Jan 22 2025 at 01:35):
I'm a bit confused about what you're assuming and what you're trying to prove, but I'll try my best. Since commutes with everything, we have
So it's enough to show that is elementary abelian.
Now, I think you've told me you can prove that is elementary abelian. If you do this proof with replaced by , which is also a subgroup containing the centre, then you're done.
Sorry if I made a wrong assumption somewhere!
Alex Brodbelt (Jan 22 2025 at 10:35):
Ooh! this could work
Alex Brodbelt (Jan 22 2025 at 10:40):
also I think I'll rename this thread in case I have more questions about stuff in my particular project and so there is more context for people.
Alex Brodbelt (Jan 22 2025 at 10:42):
thanks @Artie Khovanov ! :)
Artie Khovanov (Jan 22 2025 at 11:21):
Also - aren't all subgroups of finite?
Artie Khovanov (Jan 22 2025 at 11:22):
I assumed was a finite field. Is it just any char field? Doesn't change my idea above, but
Alex Brodbelt (Jan 22 2025 at 11:47):
yes its for any characteristic, and I'm pretty sure your idea works - will come back with formalization of it.
Kevin Buzzard (Jan 22 2025 at 12:11):
One problem with this thread is that it just launches into a wall of maths without giving any definitions. This just leads to confusion. Alex can you tell us what F is? It would be nice if the question was self-contained rather than just assuming everyone has remembered you're previous questions
Alex Brodbelt (Jan 22 2025 at 12:13):
is an algebraically closed field
Kevin Buzzard (Jan 22 2025 at 12:13):
Another thing I find quite jarring is that T is standard notation for a torus in this game but your T is not :-)
Alex Brodbelt (Jan 22 2025 at 12:14):
What should I rename it to?
Kevin Buzzard (Jan 22 2025 at 12:14):
It's usually called N isn't it?
Alex Brodbelt (Jan 22 2025 at 12:15):
Kevin Buzzard said:
One problem with this thread is that it just launches into a wall of maths without giving any definitions. This just leads to confusion. Alex can you tell us what F is? It would be nice if the question was self-contained rather than just assuming everyone has remembered you're previous questions
Is it easier if I make a new thread and begin giving out context to where I am at and where I am heading or should I just do that here?
Kevin Buzzard (Jan 22 2025 at 12:16):
Why not just edit the top post so that the question actually becomes readable? Another question: what is p? The first time you mention it is "every element has order p". Is it prime?
Alex Brodbelt (Jan 22 2025 at 12:17):
It is the characteristic of the field, so yes it is prime.
Kevin Buzzard (Jan 22 2025 at 12:17):
So F is not any algebraically closed field? It must have finite characteristic? Or can p be 0?
Alex Brodbelt (Jan 22 2025 at 12:18):
I am going through all cases when , and when is a prime not equal to
Alex Brodbelt (Jan 22 2025 at 12:18):
for this particular case I am considering when
Alex Brodbelt (Jan 22 2025 at 12:19):
I eventually would like to cover the case but that will be a bit later
Kevin Buzzard (Jan 22 2025 at 12:19):
So what does "every element has order p" mean? What about the identity element? Can p be 1?
It would not take much effort on your part to ask a question which was (a) self-contained and (b) accurate. I am quite autistic and slips really throw me. I didn't even read your question because I was lost after the first line (and because I was running Lean Together so didn't have time to reconstruct what you meant from what you wrote). But now someone else has attempted to, I think it might be better if I push you to actually make the question comprehensible.
Kevin Buzzard (Jan 22 2025 at 12:20):
Alex Brodbelt said:
for this particular case I am considering when
Then say that in the question? People can't guess hypotheses which you don't write down. I'm trying to encourage you to ask better questions.
Alex Brodbelt (Jan 22 2025 at 12:21):
Ok I'll write all the details down :)
Kevin Buzzard (Jan 22 2025 at 12:21):
Thanks :-)
[to anyone else reading: the context here is that Alex is a student working on a project I've given him]
Alex Brodbelt (Jan 22 2025 at 14:33):
Artie Khovanov said:
I'm a bit confused about what you're assuming and what you're trying to prove, but I'll try my best. Since commutes with everything, we have
So it's enough to show that is elementary abelian.
Now, I think you've told me you can prove that is elementary abelian. If you do this proof with replaced by , which is also a subgroup containing the centre, then you're done.
Sorry if I made a wrong assumption somewhere!
I am trying to define the isomorphism but I am not sure how to remove the use of tactics (I am aware using tactics when defining functions is nono):
How can one detactify this? I can convert simple proofs to their corresponding proof terms but not so sure about this one:
def conj_T_meet_G_iso_T_meet_conj_inv_G {F : Type*} [Field F] (c : SL(2,F)) (G : Subgroup SL(2,F)) (hG : center SL(2,F) ≤ G) :
(conj c • T F ⊓ G:) ≃* (T F ⊓ conj c⁻¹ • G:) where
toFun :=
fun ⟨x, x_in_conj, x_in_G⟩ =>
⟨c⁻¹ * x * c,
by
rw [mem_inf]
obtain ⟨t, ht, h⟩ := x_in_conj
simp at h
constructor
· rw [← h]
group
exact ht
· simp [pointwise_smul_def]
exact x_in_G
⟩
invFun :=
fun ⟨t, ht, t_in_conj⟩ =>
⟨c * t * c⁻¹,
by
rw [mem_inf]
obtain ⟨g, g_in_G, h⟩ := t_in_conj
simp at h
constructor
· simp [pointwise_smul_def]
exact ht
· rw [← h]
group
exact g_in_G
⟩
left_inv := sorry
right_inv := sorry
map_mul' := sorry
Andrew Yang (Jan 22 2025 at 14:40):
It's fine if the goal of the tactis is a prop (which seems to be the case here?).
Alex Brodbelt (Jan 22 2025 at 14:43):
At the left_inv sorry
this is what the infoview looks like:
It does not look very amenable :-(
Alex Brodbelt (Jan 22 2025 at 14:46):
Ah wait nvm
Artie Khovanov (Jan 22 2025 at 22:58):
Alex Brodbelt said:
Artie Khovanov said:
I am trying to define the isomorphism but I am not sure how to remove the use of tactics (I am aware using tactics when defining functions is nono):
I think you misunderstand. Using tactic mode can be problematic when constructing data, not proofs. This is because the inner workings of a proof get erased by Lean (if you want to know more, look up "proof irrelevance axiom"). It doesn't matter to Lean how you close a goal of type Prop
.
By the way, thanks for writing your assumptions up, and providing a reference. The proof bit (second part) is still quite unclear, though. I think this is because you are not clear on what you've already proved informally, what you've already proved in Lean, and what you think/know is true, but do not know how to prove.
You also don't define or the you're using anywhere. Do we have ? What about ? Can it be any satisfying certain conditions, or are you saying only that some such exists? I know these questions must sound silly or trivial given all the knowledge and context that you have, but you should keep in mind that someone seeing all this for the first time (i.e., your intended audience) will not be able to guess these things without putting in work, which makes what you write much harder to parse. The easiest way to make sure your work is readable is to present as complete and self-contained a mathematical argument as possible, noting what you have formalised and where you are unclear.
I managed to figure out roughly what you meant in the end based on context, but you should know that it took me over an hour!
Artie Khovanov (Jan 22 2025 at 23:00):
Kevin Buzzard said:
It would not take much effort on your part to ask a question which was (a) self-contained and (b) accurate. I am quite autistic and slips really throw me.
Yeah I mean I got confused and just tried doing the problem myself. Then I guessed what assumptions must be present from that.
Kevin Buzzard (Jan 22 2025 at 23:53):
Alex Brodbelt said:
Ok I'll write all the details down :)
Alex thanks so much for making the question comprehensive and readable! Just to reiterate what Andrew said -- tactic mode is fine if your goal is ⊢ P
with P : Prop
and is possibly not fine if your goal is ⊢ T
with T : Type u
.
Kevin Buzzard (Jan 23 2025 at 08:57):
I still find it slightly grating that your definition of mentions but you don't define until later.
Your claim that is incorrect if (and this can happen if e.g. is abelian). Can you clarify whether you are interested in this case?
You have a subgroup of , and then you say . But and are both subgroups of . Do you mean or not? Equality of groups is in general a meaningless concept in Lean. But equality of subgroups is very much meaningful.
Alex Brodbelt (Jan 23 2025 at 16:24):
I will update the current state of where I am and the original question, so it is more pertinent to the current state (and more pertinent in general), one second. I apologise for the gaps in information and the wasted time (sorry, I had lectures all day...).
Alex Brodbelt (Jan 23 2025 at 17:48):
OK... I think those are most if not all details
Alex Brodbelt (Jan 23 2025 at 18:53):
For the isomorphism I need outlined at the top of this thread:
This part I figured out in the end:
def conj_T_meet_G_eq_T_conj_G {F : Type*} [Field F] (c : SL(2,F)) (G : Subgroup SL(2,F)) (hG : center SL(2,F) ≤ G) :
(conj c • T F ⊓ G:) ≃* (T F ⊓ conj c⁻¹ • G:) where
toFun :=
fun x =>
⟨c⁻¹ * x * c,
by
obtain ⟨x_in_conj, x_in_G⟩ := x.property
rw [mem_inf]
obtain ⟨t, ht, h⟩ := x_in_conj
simp at h
constructor
· rw [← h]
group
exact ht
· simp [pointwise_smul_def]
exact x_in_G
⟩
invFun :=
fun t =>
⟨c * t * c⁻¹,
by
obtain ⟨t_in_T, t_in_conj⟩ := t.property
rw [mem_inf]
obtain ⟨g, g_in_G, h⟩ := t_in_conj
simp at h
constructor
· simp [pointwise_smul_def]
exact t_in_T
· rw [← h]
group
exact g_in_G
⟩
left_inv := by
simp [LeftInverse]
rintro x ⟨t, t_in_T, h⟩ x_in_G
group
right_inv := by
simp [Function.RightInverse, LeftInverse]
rintro t t_in_T ⟨g, g_in_G, h⟩
group
map_mul' := by
rintro ⟨x₁, ⟨t₁, t₁_in_T, rfl⟩, x₁_in_G⟩ ⟨x₂, ⟨t₂, t₂_in_T, rfl⟩, x₂_in_G⟩
simp
group
The part I am not able to piece yet but should be easyish but then can follow MIL to get the desired isomorphism. I am a bit clumsy with quotients in Lean :(
import Mathlib
open Subgroup
lemma card_mul_normal {G : Type*} [Group G] (H N : Subgroup G) [hH : Finite H] [hN : Finite N] [hN' : N.Normal] : Nat.card (H ⊔ N :) = Nat.card H * Nat.card N := by
have : Nat.card (H ⊔ N :) = Nat.card ((H ⊔ N :) : Set G) := by simp only [SetLike.coe_sort_coe]
rw [this, Subgroup.mul_normal]
rw [@card_mul_eq_card_subgroup_mul_card_quotient]
let f : ↥H →* G ⧸ N := (QuotientGroup.mk' N).restrict H
have : Nat.card ((@QuotientGroup.mk G _ N '' (H : Set G))) = Nat.card H := by
-- would like to use f
refine Eq.symm (Nat.card_eq_of_bijective ?f ?hf)
sorry
sorry
sorry
Artie Khovanov (Jan 23 2025 at 20:25):
Your second theorem is untrue. For instance, what if ? You need an additional assumption.
Artie Khovanov (Jan 24 2025 at 00:21):
Alex Brodbelt said:
The last isomorphism is constructed by feeding in one isomorphism into another:
From the isomorphism and for , normal (as commutative) and trivial intersection between . this is what I am stuck trying to formalize
It's easier than this. You can apply the conjugation by to the whole subgroup, and get your isomorphism in one step! You just need to prove that the conjugation action (or really any group isomorphism) preserves certain operations on subgroups.
Alex Brodbelt (Jan 24 2025 at 00:22):
Ah I forgot to add disjointness
Alex Brodbelt (Jan 24 2025 at 00:25):
Hmm so something like "simplifying" (might not be quite right but the idea you mean is something along these line):
Artie Khovanov (Jan 24 2025 at 00:28):
Alex Brodbelt said:
Hmm so something like "simplifying":
You could do this, and it will work out, but I think a more conceptual approach works better here, and is less messy.
What you're really saying is that these two subgroups are conjugate by , and the conjugation action of is just an automorphism of . So it preserves product and intersection of subgroups.
Artie Khovanov (Jan 24 2025 at 00:30):
Then all you need to check is what happens when you conjugate each of c^-1Tc, G, Z by c
That requires computations, of course, but they are easier
Artie Khovanov (Jan 24 2025 at 00:31):
How much API about the conjugation action is there in Mathlib already, I wonder
Artie Khovanov (Jan 24 2025 at 00:37):
Yeah OK eg Subgroup.map_inf_eq
, ConjAct.fixedPoints_eq_center
etc are your friends here
LeanSearch is very helpful for finding results like these!
Alex Brodbelt (Jan 24 2025 at 00:39):
Hmm yes
Alex Brodbelt (Jan 24 2025 at 00:47):
I desperately need sleep :zzz:, brain is not thinking right now. Thanks Artie
Alex Brodbelt (Jan 24 2025 at 15:29):
Cool! has been done, now moving on to proving properties of
Alex Brodbelt (Feb 08 2025 at 15:21):
I have finished Lemma 2.3.iii in the exposition I provided above, took a bit more effort than I thought. Thanks for the help :)
Alex Brodbelt (Feb 08 2025 at 15:24):
I was a bit surprised some lemmas I needed were not in mathlib such an example would be:
lemma ne_zero_two_of_char_ne_two {p : ℕ} [hp' : Fact (Nat.Prime p)]
[hC : CharP F p] (p_ne_two : p ≠ 2) : NeZero (2 : F) := by
refine { out := ?_ }
intro two_eq_zero
have one_ne_zero : (1 : F) ≠ 0 := one_ne_zero
let char_eq_two : CharP F 2 := by
exact CharTwo.of_one_ne_zero_of_two_eq_zero one_ne_zero two_eq_zero
have two_dvd_p : (p : F) = 0 := by exact CharP.cast_eq_zero F p
rw [char_eq_two.cast_eq_zero_iff'] at two_dvd_p
have two_eq_p : p = 2 := ((Nat.prime_dvd_prime_iff_eq Nat.prime_two hp'.out).mp two_dvd_p).symm
contradiction
Artie Khovanov (Feb 08 2025 at 15:37):
What about NeZero.of_not_dvd?
Alex Brodbelt (Feb 08 2025 at 15:38):
Aha, strange apply?
or leansearch did not suggest this...
Artie Khovanov (Feb 08 2025 at 15:38):
apply? isn't very helpful in this situation
Artie Khovanov (Feb 08 2025 at 15:39):
but you still need to do a little work, of course
because you need to show characteristic isn't 1
but you're in a field so you're good
Artie Khovanov (Feb 08 2025 at 15:41):
if you wanted to do this for any prime (not just 2), there's CharP.char_is_prime
, and I'm sure there's a lemma that says "prime p divides prime q iff p=q"
Alex Brodbelt (Feb 08 2025 at 15:42):
That lemma would be Nat.prime_dvd_prime_iff_eq
Alex Brodbelt (Feb 08 2025 at 15:43):
Cheers!
Alex Brodbelt (Feb 08 2025 at 16:41):
I am trying to define an isomorphism from to when is algebraically closed (having stopped to think about it, I believe characteristic is irrelevant - we will see what lean says though), informally this is my proof:
Let be defined by
where is the natural injection of the special linear group into the general linear group.
We show is an isomorphism when is algebraically closed
- We show is well-defined:
Let , suppose then because for some we have the following chain of set equalities
because and
- When is algebraically closed, we show in fact defines an isomorphism:
We show is multiplicative, injective and surjective (low-tech way):
- is multiplicative:
Let where then
Where the normality of is used, and because group injections define a homomorphism and by the normality of .
- is injective:
Let and suppose
then further implies
but so and thus
for some , where is a primitive $$n$$th root of unity.
- is surjective:
Let , then and so , we can find a representative of , that lies within the special linear group.Given elements of the special linear group are matrices with determinant equal to one, we must scale $G$ to a suitable factor to yield a representative which lies within . Let
By assumption, is algebraically closed so there exists a root such that
We can define
where
Thus and given we have that
.
Therefore, .
So far I am definining the monoid homomorphism from into when is a commutative ring with some more assumptions on the ring.
But I am poor with using the quotient type, so I am not sure how to define the map in the first place, so far I have this
import Mathlib
open Subgroup MatrixGroups Matrix LinearMap
noncomputable def MonoidHom_PSL_into_PGL {R : Type*} [CommRing R] {n : ℕ} :
SpecialLinearGroup (Fin n) R ⧸ center (SpecialLinearGroup (Fin n) R) →* GL (Fin n) R ⧸ center (GL (Fin n) R) where
toFun S := by
let G := QuotientGroup.mk' (center (GL (Fin n) R)) S.exists_rep.choose.toGL
use G
-- I would like to do this without tactics
map_one' := sorry
map_mul' := sorry
not that computability matters anyway, but I presume it doesn't necessarily have to be noncomputable?
Kevin Buzzard (Feb 08 2025 at 16:54):
You should be using (n : Type*) [Fintype n]
rather than Fin n
, the proof will be no harder and your result will be more general. You definitely should not be using the axiom of choice to define this map though! Use QuotientGroup.map
and it will all be easy.
Artie Khovanov (Feb 08 2025 at 16:55):
What you're trying to do, mathematically, is "lift" a homomorphism f:R->S to a quotient R/I->S. You can do this exactly when f(I)={0}. This also gives you multiplicativity for free! As Kevin says, Lean already has a way to do this.
Artie Khovanov (Feb 08 2025 at 16:56):
Also when you're showing injectivity you can just show the kernel is trivial, that's easier than your thing.
Kevin Buzzard (Feb 08 2025 at 16:56):
Your informal proof is not really valid in Lean because it makes the assumption (which you were probably taught, so this is not your fault) that an element of a quotient group is equal to a coset. This is not true in Lean; to work with quotient groups you should use universal properties like QuotientGroup.lift
and QuotientGroup.map
; the axiom needed to apply these functions is precisely what you were told was the check that your functions from the quotient were "well-defined".
Artie Khovanov (Feb 08 2025 at 16:57):
@Kevin Buzzard the whole coset vs quotient type thing to me feels like a distinction often made wrt Lean without a difference; surely you work with both in exactly the same way?
Alex Brodbelt (Feb 08 2025 at 16:58):
Ok it seems I have something to chew on
Alex Brodbelt (Feb 08 2025 at 17:02):
Is there any other reference for quotient type other than the Lean Reference Manual?
Artie Khovanov (Feb 08 2025 at 17:03):
Lean implements its quotients in a fairly unique way as I understand
Artie Khovanov (Feb 08 2025 at 17:04):
There's this quick overview: https://leanprover-community.github.io/mathematics_in_lean/C09_Linear_Algebra.html#subspaces-and-quotients
Kevin Buzzard (Feb 08 2025 at 17:15):
I'm just writing a blog post now. Artie I don't agree that you work with both in exactly the same way: when showing phi is well-defined above, Alex is specifically working with cosets. Look at his definition of a map from a quotient: choose a random representative using the axiom of choice and define the function on the representative. That is exactly what students are being told to do in maths departments and it is not at all what you do in Lean.
Artie Khovanov (Feb 08 2025 at 17:21):
I guess I am already thinking about quotients abstractly
Alex Brodbelt (Feb 09 2025 at 11:37):
I have successfully used QuotientGroup.lift
to produce a monoid homomorphism from PSL n R →* PGL n R
(see PSL_monoidHom_PGL
).
Now trying to generate the monoid homomorphism in the other direction, I was thinking of first defining
GL n F →* SL n F
(*) and then using the canonical homomorphism SL n R →* PSL n R
(specialized for F - see SL_monoidHom_PSL
).
It is (*) that I am having trouble with as I need to use algebraic closure to extract an nth root of where .
I have the lemma for extracting this nth root and the corresponding matrix in but I am not sure how to use it for contructing the monoid homomorphism, so far I can construct the data using tactics and choice, but then as expected the proofs become intractable (see GL_monoidHom_SL
).
A reasonable chunk of this code is for proving properties about the center of , so you can ignore a lot of it, i.e: skip to the bottom for the relevant code.
import Mathlib.FieldTheory.IsAlgClosed.Basic
import Mathlib.LinearAlgebra.Matrix.GeneralLinearGroup.Defs
universe u v w
open Matrix
open scoped MatrixGroups
variable {n : Type u} [DecidableEq n] [Fintype n] {R : Type v} [CommRing R] (F : Type w) [Field F]
scoped[MatrixGroups] notation "SL" => Matrix.SpecialLinearGroup
def Matrix.transvection.toSL {i j : n} (hij : i ≠ j) (c : R): SL n R :=
⟨Matrix.transvection i j c, (det_transvection_of_ne i j hij (c : R))⟩
namespace Matrix.TransvectionStruct
open Matrix
def toSL (t : TransvectionStruct n R) : SL n R := Matrix.transvection.toSL t.hij t.c
def toGL (t : TransvectionStruct n R) : GL n R := Matrix.transvection.toSL t.hij t.c
end Matrix.TransvectionStruct
namespace GeneralLinearGroup
def scalar (n : Type*) [DecidableEq n] [Fintype n] (r : Rˣ) : GL n R :=
Units.map (Matrix.scalar n).toMonoidHom r
/-- scalar matrix belongs to GL n R iff r is a unit -/
theorem coe_scalar_matrix (r : Rˣ) : Matrix.scalar n r.val = scalar n r := rfl
/-- `M` is a scalar matrix if it commutes with every nontrivial transvection (elementary matrix). -/
theorem mem_range_scalar_of_commute_transvectionStruct' {M : GL n R}
(hM : ∀ t : TransvectionStruct n R, Commute t.toGL M):
(M : Matrix n n R) ∈ Set.range (Matrix.scalar n) := by
refine mem_range_scalar_of_commute_transvectionStruct ?_
simp_rw [← Commute.units_val_iff] at hM
exact hM
theorem mem_range_unit_scalar_of_mem_range_scalar_and_mem_general_linear_group {M : GL n R} (hM : (M : Matrix n n R) ∈ Set.range (Matrix.scalar n)) :
∃ r : Rˣ, scalar n r = M := by
obtain ⟨r', hr'⟩ := hM
have det_scalar : (Matrix.scalar n r').det = r'^(Nat.card n) := by simp
have det_M_is_unit: IsUnit ((M : Matrix n n R).det) := by simp only [isUnits_det_units]
rw [← hr', det_scalar] at det_M_is_unit
by_cases hn : Nat.card n ≠ 0
· have r'_is_unit : IsUnit r' := by rw [← isUnit_pow_iff hn]; exact det_M_is_unit
obtain ⟨r, hr⟩ := r'_is_unit
use r
have h : scalar n r = Matrix.scalar n r' := by simp [scalar]; intro _n; exact hr
ext
rw [h, hr']
· simp only [Nat.card_eq_fintype_card, ne_eq, Decidable.not_not] at hn
use 1
rw [scalar]; simp only [RingHom.toMonoidHom_eq_coe, _root_.map_one]
ext
have n_empty : IsEmpty n := by rw [← Fintype.card_eq_zero_iff, hn]
rw [← units_eq_one M]
theorem mem_units_range_scalar_iff_commute_transvectionStruct {R : Type v} [CommRing R] (M : GL n R) : (∀ (A : GL n R), Commute A M) ↔ (∃ r : Rˣ, scalar n r = M) := by
constructor
· intro hM
-- if M commutes with every matrix then it must commute with the transvection matrices
have h₀ : ∀ (t : TransvectionStruct n R), Commute (t.toGL) M := fun t => hM t.toGL
-- if M commutes with the transvection matrices then M ∈ Set.range (Matrix.scalar n) where Set.range is Rˣ
have h₁ : (M : Matrix n n R) ∈ Set.range ⇑(Matrix.scalar n) := mem_range_scalar_of_commute_transvectionStruct' h₀
have h₂ : ∃ r : Rˣ, scalar n r = M := mem_range_unit_scalar_of_mem_range_scalar_and_mem_general_linear_group h₁
obtain ⟨r, rfl⟩ := h₂
use r
· intro h A
obtain ⟨r, rfl⟩ := h
ext i j
rw [
GeneralLinearGroup.coe_mul, GeneralLinearGroup.coe_mul,
← coe_scalar_matrix, scalar_commute
]
exact fun r' ↦ Commute.all (↑r) r'
namespace Center
open Subgroup GeneralLinearGroup
theorem mem_center_general_linear_group_iff {M : GL n R} : M ∈ Subgroup.center (GL n R) ↔ (∃ r : Rˣ, scalar n r = M) := by
rw [mem_center_iff]
constructor
· intro h
rw [← mem_units_range_scalar_iff_commute_transvectionStruct]
congr
· intro h A
have hA : (∀ (A : GL n R), Commute A M) :=
(mem_units_range_scalar_iff_commute_transvectionStruct M).mpr h
exact Commute.eq <| hA A
end Center
end GeneralLinearGroup
variable (n : Type u) [DecidableEq n] [Fintype n] (R : Type v) [CommRing R]
open Subgroup
/-- A projective general linear group is the quotient of a special linear group by its center. -/
abbrev ProjectiveGeneralLinearGroup : Type _ :=
GL n R ⧸ center (GL n R)
/-- `PGL n R` is the projective special linear group `(GL n R)/ Z(GL(n R))`. -/
abbrev PGL := ProjectiveGeneralLinearGroup
open Matrix LinearMap Subgroup
open scoped MatrixGroups
variable (n : Type u) [DecidableEq n] [Fintype n] (R : Type v) [CommRing R]
/-- A projective special linear group is the quotient of a special linear group by its center. -/
abbrev ProjectiveSpecialLinearGroup : Type _ :=
SpecialLinearGroup n R ⧸ center (SpecialLinearGroup n R)
/-- `PSL(n, R)` is the projective special linear group `SL(n, R)/Z(SL(n, R))`. -/
abbrev PSL := ProjectiveSpecialLinearGroup
namespace Isomorphism
variable (n : ℕ) (F : Type u) [Field F] [IsAlgClosed F]
open Subgroup
def SL_monoidHom_PGL (n : Type*) [Fintype n] [DecidableEq n] (R : Type*) [CommRing R] :
SL n R →* PGL n R where
toFun S := QuotientGroup.mk' (center (GeneralLinearGroup n R)) S.toGL
map_mul' S₁ S₂ := by simp
map_one' := by simp
lemma coe {n : Type*} [Fintype n] [DecidableEq n] (x : SpecialLinearGroup n R): SpecialLinearGroup.toGL x = (x : Matrix n n R) := rfl
lemma center_SL_le_ker (n : Type*) [Nonempty n] [Fintype n] [DecidableEq n] (R : Type*) [CommRing R] [NeZero (1 : R)]: center (SpecialLinearGroup n R) ≤ (SL_monoidHom_PGL n R).ker := by
intro x x_mem_center
rw [SpecialLinearGroup.mem_center_iff] at x_mem_center
obtain ⟨ω, hω, h⟩ := x_mem_center
simp [MonoidHom.mem_ker, SL_monoidHom_PGL]
rw [GeneralLinearGroup.Center.mem_center_general_linear_group_iff]
have IsUnit_ω : IsUnit ω := IsUnit.of_pow_eq_one hω Fintype.card_ne_zero
use IsUnit_ω.unit
ext
simp [← GeneralLinearGroup.coe_scalar_matrix, coe, ← h]
instance center_is_normal (n R : Type*) [Nonempty n] [Fintype n] [DecidableEq n] [CommRing R] [NeZero (1 : R)] : Subgroup.Normal (center (SpecialLinearGroup n R)) := normal_of_characteristic (center (SL n R))
instance PGL_is_monoid (n R : Type*) [Nonempty n] [Fintype n] [DecidableEq n] [CommRing R] [NeZero (1 : R)] : Monoid (ProjectiveGeneralLinearGroup n R) := RightCancelMonoid.toMonoid
def PSL_monoidHom_PGL (n R : Type*) [Nonempty n] [Fintype n] [DecidableEq n] [CommRing R] [NeZero (1 : R)] :
PSL n R →* PGL n R :=
@QuotientGroup.lift (SL n R) _ (center (SL n R)) (center_is_normal n R) (PGL n R) (PGL_is_monoid n R) (SL_monoidHom_PGL n R) (center_SL_le_ker n R)
open Polynomial
lemma exists_SL_eq_scaled_GL_of_IsAlgClosed {n F : Type*} [hn₁ : Fintype n] [DecidableEq n] [hn₂ : Nonempty n] [Field F] [IsAlgClosed F] (G : GL n F) : ∃ c : Fˣ, ∃ S : SL n F, c • S.toGL = G := by
let P : F[X] := X^(Nat.card n) - C (det G.val)
have nat_card_ne_zero : (Nat.card n) ≠ 0 := Nat.card_ne_zero.mpr ⟨hn₂, Fintype.finite hn₁⟩
have deg_P_ne_zero : degree P ≠ 0 := by
rw [Polynomial.degree_X_pow_sub_C]
exact Nat.cast_ne_zero.mpr nat_card_ne_zero
exact Nat.card_pos
obtain ⟨c, hc⟩ := @IsAlgClosed.exists_root F _ _ P deg_P_ne_zero
have c_ne_zero : c ≠ 0 := by
rintro rfl
simp [P] at hc
have det_G_ne_zero : det G.val ≠ 0 := IsUnit.ne_zero <| isUnits_det_units G
contradiction
have IsUnit_c : IsUnit c := by exact Ne.isUnit c_ne_zero
have hc' : ∃ c : Fˣ, c^(Nat.card n) = det G.val := by
use IsUnit_c.unit
simp [P, sub_eq_zero] at hc
simp [hc]
obtain ⟨c, hc⟩ := hc'
have det_inv_c_G_eq_one : det (c⁻¹ • G).1 = (1 : F) := by
simp [← hc, inv_smul_eq_iff, Units.smul_def]
use c, ⟨(c⁻¹ • G), det_inv_c_G_eq_one⟩
ext
simp [coe]
noncomputable def GL_monoidHom_SL (n F : Type*) [Fintype n] [DecidableEq n] [Nonempty n] [Field F] [IsAlgClosed F] :
GL n F →* SL n F where
toFun G := by
obtain c := (exists_SL_eq_scaled_GL_of_IsAlgClosed G).choose
obtain S := (exists_SL_eq_scaled_GL_of_IsAlgClosed G).choose_spec.choose
obtain h := (exists_SL_eq_scaled_GL_of_IsAlgClosed G).choose_spec.choose_spec
use S
exact SpecialLinearGroup.det_coe S
map_mul' G₁ G₂ := by
simp
sorry
map_one' := by
simp
sorry
def SL_monoidHom_PSL (n R : Type*) [Fintype n] [DecidableEq n] [Nonempty n] [CommRing R] :
SL n R →* PSL n R := QuotientGroup.mk' (center (SL n R))
def GL_monoidHom_PSL (n F : Type*) [Fintype n] [DecidableEq n] [Nonempty n] [Field F] [IsAlgClosed F] :
GeneralLinearGroup n F →* ProjectiveSpecialLinearGroup n F := sorry--SL_monoidHom_PSL.comp GL_monoidHom_SL
-- We define the isomorphism between the projective general linear group and the projective special linear group
def PGL_iso_PSL (n F : Type*) [Fintype n] [DecidableEq n] [Nonempty n] [Field F] [IsAlgClosed F] : ProjectiveGeneralLinearGroup n F ≃* ProjectiveSpecialLinearGroup n F where
toFun := sorry
invFun := PSL_monoidHom_PGL n F
left_inv := sorry
right_inv := sorry
map_mul' := sorry
end Isomorphism
Artie Khovanov (Feb 09 2025 at 11:41):
I wouldn't define an inverse here; I would just prove my map was bijective. Like, your inverse isn't computable anyway.
Alex Brodbelt (Feb 09 2025 at 11:42):
So you would use docs#MulEquiv.ofBijective ?
Artie Khovanov (Feb 09 2025 at 11:43):
That sounds right.
Alex Brodbelt (Feb 09 2025 at 11:43):
I was thinking of this too, but the typeclasses involved put me off it and opted for this.
I did not stop to think if the inverse was compatible though, I assumed it would be.
Alex Brodbelt (Feb 09 2025 at 11:44):
Btw this would be great for tomorrow's lean club if I get it done in time!
Artie Khovanov (Feb 09 2025 at 11:47):
The reason computability "matters" is that doing it using ofBijective means that your inverse isn't computable -- you need to use Lean's "axiom of choice" to obtain it. So if your inverse is computable it's slightly better to give it explicitly (at the cost of having to do a bit more work). However, as you yourself say above, you need to extract an nth root using choice, so you don't even get this advantage!
Alex Brodbelt (Feb 09 2025 at 13:44):
So trying to prove bijectivity of PSL_monoidHom_PGL
to then use MulEquiv.ofBijective
but I am stuck whenever I have a term of type PSL n F
or PGL n F
.
I'd like to extract a representative or some equivalent thing so I have a term of type SL n F
or GL n F
and then use the lemmas I have to show that in fact be a root of unity and so forth, and so the lift of this element equals the term of type PSL n F
or PGL n F
respectively.
Again, a lot of the code is "boilerplate" theorems and definitions, so skip to the bottom to see the lemma I am struggling with:
import Mathlib.FieldTheory.IsAlgClosed.Basic
import Mathlib.LinearAlgebra.Matrix.GeneralLinearGroup.Defs
set_option linter.style.longLine true
set_option autoImplicit false
set_option maxHeartbeats 0
universe u v w
open Matrix
open scoped MatrixGroups
variable {n : Type u} [DecidableEq n] [Fintype n] {R : Type v} [CommRing R] (F : Type w) [Field F]
scoped[MatrixGroups] notation "SL" => Matrix.SpecialLinearGroup
def Matrix.transvection.toSL {i j : n} (hij : i ≠ j) (c : R): SL n R :=
⟨Matrix.transvection i j c, (det_transvection_of_ne i j hij (c : R))⟩
namespace Matrix.TransvectionStruct
open Matrix
def toSL (t : TransvectionStruct n R) : SL n R := Matrix.transvection.toSL t.hij t.c
def toGL (t : TransvectionStruct n R) : GL n R := Matrix.transvection.toSL t.hij t.c
end Matrix.TransvectionStruct
namespace GeneralLinearGroup
def scalar (n : Type*) [DecidableEq n] [Fintype n] (r : Rˣ) : GL n R :=
Units.map (Matrix.scalar n).toMonoidHom r
/-- scalar matrix belongs to GL n R iff r is a unit -/
theorem coe_scalar_matrix (r : Rˣ) : Matrix.scalar n r.val = scalar n r := rfl
/-- `M` is a scalar matrix if it commutes with every nontrivial transvection (elementary matrix). -/
theorem mem_range_scalar_of_commute_transvectionStruct' {M : GL n R}
(hM : ∀ t : TransvectionStruct n R, Commute t.toGL M):
(M : Matrix n n R) ∈ Set.range (Matrix.scalar n) := by sorry --ommited
theorem mem_range_unit_scalar_of_mem_range_scalar_and_mem_general_linear_group {M : GL n R}
(hM : (M : Matrix n n R) ∈ Set.range (Matrix.scalar n)) :
∃ r : Rˣ, scalar n r = M := by sorry --ommited
theorem mem_units_range_scalar_iff_commute_transvectionStruct {R : Type v} [CommRing R]
(M : GL n R) : (∀ (A : GL n R), Commute A M) ↔ (∃ r : Rˣ, scalar n r = M) := by sorry --ommited
namespace Center
open Subgroup GeneralLinearGroup
theorem mem_center_general_linear_group_iff {M : GL n R} :
M ∈ Subgroup.center (GL n R) ↔ (∃ r : Rˣ, scalar n r = M) := by sorry --ommited
end Center
end GeneralLinearGroup
variable (n : Type u) [DecidableEq n] [Fintype n] (R : Type v) [CommRing R]
open Subgroup
/-- A projective general linear group is the quotient of a special linear group by its center. -/
abbrev ProjectiveGeneralLinearGroup : Type _ :=
GL n R ⧸ center (GL n R)
/-- `PGL n R` is the projective special linear group `(GL n R)/ Z(GL(n R))`. -/
abbrev PGL := ProjectiveGeneralLinearGroup
open Matrix LinearMap Subgroup
open scoped MatrixGroups
variable (n : Type u) [DecidableEq n] [Fintype n] (R : Type v) [CommRing R]
/-- A projective special linear group is the quotient of a special linear group by its center. -/
abbrev ProjectiveSpecialLinearGroup : Type _ :=
SpecialLinearGroup n R ⧸ center (SpecialLinearGroup n R)
/-- `PSL(n, R)` is the projective special linear group `SL(n, R)/Z(SL(n, R))`. -/
abbrev PSL := ProjectiveSpecialLinearGroup
namespace Isomorphism
variable (n : ℕ) (F : Type u) [Field F] [IsAlgClosed F]
open Subgroup
def SL_monoidHom_GL (n : Type*) [Fintype n] [DecidableEq n] (R : Type*) [CommRing R] :
SL n R →* GL n R := SpecialLinearGroup.toGL
def GL_monoidHom_PGL (n : Type*) [Fintype n] [DecidableEq n] (R : Type*) [CommRing R] :
GL n R →* PGL n R := QuotientGroup.mk' (center (GL n R))
def SL_monoidHom_PGL (n : Type*) [Fintype n] [DecidableEq n] (R : Type*) [CommRing R] :
SL n R →* PGL n R := MonoidHom.comp (GL_monoidHom_PGL n R) (SL_monoidHom_GL n R)
lemma coe {n : Type*} [Fintype n] [DecidableEq n] (x : SpecialLinearGroup n R):
SpecialLinearGroup.toGL x = (x : Matrix n n R) := rfl
lemma center_SL_le_ker (n : Type*) [Nonempty n] [Fintype n] [DecidableEq n]
(R : Type*) [CommRing R] [NeZero (1 : R)]:
center (SpecialLinearGroup n R) ≤ (SL_monoidHom_PGL n R).ker := by sorry --ommited
instance center_is_normal (n R : Type*) [Nonempty n] [Fintype n] [DecidableEq n]
[CommRing R] [NeZero (1 : R)] : Subgroup.Normal (center (SpecialLinearGroup n R)) :=
normal_of_characteristic (center (SL n R))
instance PGL_is_monoid (n R : Type*) [Nonempty n] [Fintype n] [DecidableEq n]
[CommRing R] [NeZero (1 : R)] : Monoid (ProjectiveGeneralLinearGroup n R) :=
RightCancelMonoid.toMonoid
def PSL_monoidHom_PGL (n R : Type*) [Nonempty n] [Fintype n] [DecidableEq n]
[CommRing R] [NeZero (1 : R)] :
PSL n R →* PGL n R :=
@QuotientGroup.lift (SL n R) _ (center (SL n R)) (center_is_normal n R) (PGL n R)
(PGL_is_monoid n R) (SL_monoidHom_PGL n R) (center_SL_le_ker n R)
open Polynomial
lemma exists_SL_eq_scaled_GL_of_IsAlgClosed {n F : Type*} [hn₁ : Fintype n] [DecidableEq n]
[hn₂ : Nonempty n] [Field F] [IsAlgClosed F] (G : GL n F) :
∃ c : Fˣ, ∃ S : SL n F, c • S.toGL = G := by
let P : F[X] := X^(Nat.card n) - C (det G.val)
have nat_card_ne_zero : (Nat.card n) ≠ 0 := Nat.card_ne_zero.mpr ⟨hn₂, Fintype.finite hn₁⟩
have deg_P_ne_zero : degree P ≠ 0 := by sorry --ommited
open Function
lemma lift_scalar_matrix_eq_one {n F : Type*} [hn₁ : Fintype n] [DecidableEq n]
[Field F] [IsAlgClosed F] (c : Fˣ) : GL_monoidHom_PGL n F (c • 1) = 1 := by sorry --ommited
lemma Bijective_PSL_monoidHom_PGL {n F : Type*} [hn₁ : Fintype n] [DecidableEq n]
[hn₂ : Nonempty n] [Field F] [IsAlgClosed F] : Bijective (PSL_monoidHom_PGL n F) := by
refine ⟨?injective, ?surjective⟩
case injective =>
rw [← @MonoidHom.ker_eq_bot_iff]
rw [@eq_bot_iff]
intro k k_in_ker
simp [PSL_monoidHom_PGL] at k_in_ker
rw [← @QuotientGroup.mk_one] at k_in_ker
-- extract representative or equivalent somehow
rw [← @MulActionHom.toQuotient_apply] at k_in_ker
-- show representative is a power of a primitive root of unity
rw [mem_bot]
rw [← @QuotientGroup.mk_one]
sorry
case surjective =>
intro pgl
-- extract representative or equivalent somehow
-- obtain ⟨c, S, h⟩ := exists_SL_eq_scaled_GL_of_IsAlgClosed G
sorry
noncomputable def PGL_iso_PSL (n F : Type*) [Fintype n] [DecidableEq n] [Nonempty n] [Field F] [IsAlgClosed F] :
PSL n F ≃* PGL n F := MulEquiv.ofBijective (PSL_monoidHom_PGL n F) (Bijective_PSL_monoidHom_PGL n F)
end Isomorphism
Artie Khovanov (Feb 09 2025 at 13:45):
I haven't done this myself but I'd start by looking for helper lemmas around *.lift
Alex Brodbelt (Feb 09 2025 at 13:48):
Ok will look at that, and what are you thinking when you think of a term of a quotient type? How does it behave?
Artie Khovanov (Feb 09 2025 at 13:51):
Well informally I'll think of it as an arbitrary representative. But eg if you have f:R->S "lifting" to fbar:R/I->S/J, showing [x] in S/J has a preimage is the same as finding y in R such that f(y)-x is in J. That's the sort of lemma I'd look for.
Artie Khovanov (Feb 09 2025 at 13:53):
Or in other words find your y with this property first, then lift it to the quotient using whatever lemmas about Quotient.lift (ie the universal property)
Alex Brodbelt (Feb 09 2025 at 14:01):
Yes, it is finding this I am struggling with, but at least I am beggining to see the big picture. Thanks
Artie Khovanov (Feb 09 2025 at 14:03):
Well you said you were stuck with a term of type PSL/PGL. I'm saying I would prove a statement of the form "for all x in GL there exists a y in SL such that..", then use the universal property to lift it.
Alex Brodbelt (Feb 09 2025 at 14:04):
I have that lemma (exists_SL_eq_scaled_GL_of_IsAlgClosed
), but I don't know yet how to get the term of GL. Nonetheless, I'll try what you say.
Artie Khovanov (Feb 09 2025 at 14:09):
Oh I see
Yeah unfortunately any way you slice it you still have to use choice to take the nth root. It's just a bit easier when you're not making it be data ime.
Alex Brodbelt (Feb 09 2025 at 14:21):
When I see that I need to plug in a term of type α ⧸ s → Prop
this means I should have x : _
and x ∈ α ⧸ s
where _
is ?? .
In particular, I am looking at docs#QuotientGroup.exists_mk
Artie Khovanov (Feb 09 2025 at 14:22):
No, x is of type α/s, there's no set involved
Artie Khovanov (Feb 09 2025 at 14:22):
Just like with any other function type
Artie Khovanov (Feb 09 2025 at 14:23):
But yes that's the sort of theorem I mean
Alex Brodbelt (Feb 09 2025 at 15:30):
It is docs#Quotient.exists_rep - Have proved surjectivity!
Alex Brodbelt (Feb 09 2025 at 15:46):
Have proved injectivity!
Alex Brodbelt (Feb 09 2025 at 15:47):
Thanks @Artie Khovanov :thanks:
Kevin Buzzard (Feb 09 2025 at 18:28):
@Alex Brodbelt I should also thank you -- your comments prompted me to write a blog post about how Lean thinks about quotients (something I've been meaning to do for ages), and I've finished it today, but I'm currently hesitant to post it because I mention NNG in it and right now the NNG website seems to be down.
Kevin Buzzard (Feb 09 2025 at 22:26):
https://xenaproject.wordpress.com/2025/02/09/what-is-a-quotient/
Edward van de Meent (Feb 11 2025 at 19:00):
Unfortunately they also decided to write their diagrams upside-down so we are stuck with calling the “lift” of .
:rolling_on_the_floor_laughing:
Kevin Buzzard (Feb 11 2025 at 19:04):
I still remember how horrified Patrick and I were when it dawned on us that lift
meant "descent". On discussion with people Sebastian Ullrich the conclusion seemed to be that mathematicians thought that quotients should go under the object because they were smaller, and computer scientists thought that they should go above the object because they were more complex (they contained the original type and more besides). In category theory we sometimes just ignore the lift
thing and call various universal things .desc
.
Edward van de Meent (Feb 11 2025 at 19:15):
honestly, i can see how one might decide to call "turning a thing about Foo into a thing about a construction based on Foo" "lifting"
Edward van de Meent (Feb 11 2025 at 19:16):
because you might be doing some heavy lifting
Kevin Buzzard (Feb 11 2025 at 19:27):
Unfortunately "descent" is now baked into mathematical folklore and it's one of several reasons why mathematicians find quotients hard to use in lean; this is why I mentioned it. I didn't even go into the fact that it's also very difficult to translate between x \~~ y
and "the formula you actually used to define the equivalence relation"...
Alex Brodbelt (Feb 20 2025 at 18:46):
To begin with the case split for what the finite subgroup of might look like I need to construct the so called maximal abelian subgroup class equation (harnesses the fact that centralizers of are isomorphic to nice subgroups), but to do this I first need to define the "non-central conjugacy class of a subgroup" (see the https://alexbrodbelt.github.io/ClassificationOfFiniteSubgroupsOfPGL/blueprint/Ch6_MaximalAbelianSubgroupClassEquation.html) the section 6.3 Conjugacy of Maximal Abelian Subgroups.
But the issue I am having is that docs#ConjClasses is not quite a set where I can take out the center as it directly defines a Quotient type. I am wondering how I should set up my definitions so it is not as painful to get the class equation to pop out.
There are some details I am still wrapping my head around to get the informal maths to correspond to formal maths but I figure I would start here, to at least get some ideas down.
Edit: (more context and better questions)
Let is the set of maximal abelian subgroups of , the finite subgroup of to be classified, let then the non-central part of is .
Let
For a given , the conjugacy class of is defined as (this is not quite docs#ConjClasses).
Similarly, let . The nice property now is that the partition as it is the equivalence class of in .
Then define , every element of lie within one of the as suppose then there exists a such that as the map defined by defines an automorphism, so restricting to defines a bijection, because if then . If then there is a such that a contradiction.
We also have the relation .
That is to say, there exists an indexing set (not sure how I would construct such a set or sidestep this construction yet) where:
(A)
I wonder if I should set up as having type Set
or I should fiddle a little bit with the approach to set up a Quotient
type....
From looking at the proof it seems sensible to define them as sets and maybe use something like docs#Finpartition.sum_card_parts on (A) to yield
Kevin Buzzard (Feb 20 2025 at 20:04):
What does "the non-central part of A" mean? What is \M? Can you ask a self-contained question?
Artie Khovanov (Feb 20 2025 at 22:09):
@Alex Brodbelt how about conjugatesOf and ConjClasses.carrier?
Artie Khovanov (Feb 20 2025 at 22:10):
In general going to the definition that doesn't quite work and poking around a bit often gets you what you want. Didn't try the AI tools as am on phone but I'd be surprised if they didn't suggest this, too.
Artie Khovanov (Feb 20 2025 at 22:11):
Like, you know you want the type to be Set G
, so I imagine mentioning "sets" would get you there.
Alex Brodbelt (Feb 21 2025 at 15:04):
I was thinking something like this too, i.e tweaking an existing definition. But if I could avoid doing this that would be ideal.
So far I am thinking of defining all of these as sets and proving that there is an equivalence relation on them which should then give me the partition of .
p.s: have made the question more self-contained - sorry I was a bit lazy when I wrote it.
Kevin Buzzard (Feb 21 2025 at 15:26):
Re "this is not quite docs#ConjClasses" -- this is not at all docs#ConjClasses, that's "the type of all conjugacy classes of elements in a group", not "one conjugacy class associated to a set".
Kevin Buzzard (Feb 21 2025 at 15:28):
By I'm assuming that you literally mean the subset ("A minus Z"), not some quotient. Whatever it means, I still can't make your claim that the partition typecheck. You have defined to be a set of sets, not a set of elements, and for a bunch of sets to be a partition of a subset of a group they need to be sets of elements. What am I missing?
Alex Brodbelt (Feb 21 2025 at 15:47):
Apologies! it indeed does not type-check (I like this way of thinking about it hehe) - I think I fixed it. Will check it over again just in case.
Kevin Buzzard (Feb 21 2025 at 16:01):
With the revised version I should think that the have type Set (SL_2(F))
.
Kevin Buzzard (Feb 21 2025 at 16:02):
Or possibly type Set G
depending on what you want to do with them. Without more context it's hard to know.
Alex Brodbelt (Feb 21 2025 at 16:03):
I think I'll have to see what clicks, but at least figuring out I want to use Set
is a good start! Thanks - Just wanted to consider options rather than jump straight in and then have to backtrack.
Alex Brodbelt (Feb 21 2025 at 18:03):
So far so good, I leave definitions in case something looks not so nice. But as somewhat anticipated, there is an issue with stating one of the key theorems:
I am not sure how to define the indexing set which comes from the fact that partition . The critical theorem I would like to state is:
where
Recall and .
My guess so far is that or the subset will come from the equivalence relation and the assumption that is finite, as is finite, is finite; so as .
But I'm not sure how I will convince lean of this, or how to get this indexing set .
Code
Alex Brodbelt (Feb 26 2025 at 13:32):
After discussions with Artie, I think the best way is again to lift some appropriate functions ...no need to faff around with silly sets.
Artie Khovanov (Feb 26 2025 at 15:03):
In general the concept of an "indexing set' is a formalisation red flag
Alex Brodbelt (Mar 01 2025 at 12:01):
This is what it looks like so far - I have lifted the function which computes the cardinality of the noncentral part of a maximal abelian subgroup.
import Mathlib
-- import ClassificationOfSubgroups.Ch5_PropertiesOfSLOverAlgClosedField.S2_SpecialSubgroups
-- import ClassificationOfSubgroups.Ch6_MaximalAbelianSubgroupClassEquation.S2_MaximalAbelianSubgroup
set_option maxHeartbeats 0
set_option linter.style.longLine true
variable {R F : Type*} [CommRing R] [Field F]
open Matrix MatrixGroups Subgroup MulAut Pointwise
def IsMaximalAbelian {L : Type*} [Group L] (G : Subgroup L) : Prop := Maximal (IsCommutative) G
def MaximalAbelianSubgroups { L : Type*} [Group L] (G : Subgroup L) : Set (Subgroup L) :=
{ K : Subgroup L | IsMaximalAbelian (K.subgroupOf G) ∧ K ≤ G}
lemma MaximalAbelianSubgroup.center_le {G : Type u_1} [Group G] (H A : Subgroup G) (hA : A ∈ MaximalAbelianSubgroups H)
(hH : center G ≤ H) : center G ≤ A := by sorry
def Z (R : Type*) [CommRing R] : Subgroup SL(2,R) := closure {(-1 : SL(2,R))}
lemma center_SL2_eq_Z (R : Type u_1) [CommRing R] [NoZeroDivisors R] : center SL(2, R) = Z R := by sorry
lemma mem_Z_iff {R : Type*} [CommRing R] {x : SL(2,R)}: x ∈ Z R ↔ x = 1 ∨ x = -1 := by sorry
instance : Finite (Z F) := by
simp only [mem_Z_iff]
exact Finite.Set.finite_insert 1 {-1}
/- The non-central part of a subgroup -/
def Subgroup.noncenter {G : Type*} [Group G] (H : Subgroup G) : Set G :=
{x : G | x ∈ H.carrier \ center G}
/-
We define the equivalence relation on the set of Maximal Abelian Subgroups of `G`, a finite
group of `SL(2,F)`
-/
instance MaximalAbelianSubgroups_lift {F : Type*} [Field F] (G : Subgroup SL(2,F)) :
Setoid (MaximalAbelianSubgroups G) where
r A B := ∃ (x : SL(2,F)), conj x • A.val = B.val
iseqv := {
refl A := ⟨1, by simp⟩
symm := by
rintro ⟨A, hA⟩ ⟨B, hB⟩ ⟨x, hx⟩
use x⁻¹
simp at hx ⊢
rw [inv_smul_eq_iff]
exact hx.symm
trans := by
rintro ⟨A, hA⟩ ⟨B, hB⟩ ⟨C, hC⟩ ⟨x, hx⟩ ⟨y, hy⟩
use y * x
rw [← hy, ← hx, smul_smul, MonoidHom.map_mul]
}
noncomputable def card_noncenter_MaximalAbelianSubgroupsOf {F : Type*} [Field F] (G : Subgroup SL(2,F))
[Finite G] : MaximalAbelianSubgroups G → ℕ :=
fun A => Nat.card ((A.val.carrier \ (center SL(2,F)).carrier) :)
lemma card_eq_of_related_noncenter_subgroups {F : Type*} [Field F] (G : Subgroup SL(2,F))
(center_le_G : center SL(2,F) ≤ G)[ hG : Finite G] :
∀ (A B : (MaximalAbelianSubgroups G)),
A ≈ B → card_noncenter_MaximalAbelianSubgroupsOf G A =
card_noncenter_MaximalAbelianSubgroupsOf G B:= by
rintro ⟨A, hA⟩ ⟨B, hB⟩ ArB
simp only [← Quotient.eq_iff_equiv, Quotient.eq] at ArB
obtain ⟨x, rfl⟩ := ArB
simp only [card_noncenter_MaximalAbelianSubgroupsOf, center_toSubmonoid,
Submonoid.center_toSubsemigroup, pointwise_smul_toSubmonoid, Set.Nat.card_coe_set_eq]
let center_finite : Finite (center SL(2, F)) := by
rw [center_SL2_eq_Z]
infer_instance
have center_le_A : (Subsemigroup.center SL(2, F)).carrier ⊆ A.carrier :=
@MaximalAbelianSubgroup.center_le SL(2,F) _ G A hA center_le_G
let center_coe_finite : Finite (Subsemigroup.center SL(2, F)).carrier := center_finite
have center_le_conj_A :
(Subsemigroup.center SL(2, F)).carrier ⊆ (conj x • A.toSubmonoid).carrier := by
intro z hz
rw [Submonoid.mem_carrier, Submonoid.mem_pointwise_smul_iff_inv_smul_mem]
have hz' := hz
rw [Subsemigroup.mem_carrier, Subsemigroup.mem_center_iff] at hz'
simp only [MulAut.smul_def, conj_inv_apply, mem_toSubmonoid]
rw [hz' x⁻¹]
group
exact center_le_A hz
rw [Set.ncard_diff center_le_A, Set.ncard_diff center_le_conj_A]
have key : (conj x • A.toSubmonoid).carrier.ncard = A.carrier.ncard := by
symm
refine Set.ncard_congr (fun a ha ↦ x * a * x⁻¹) ?closure ?injective ?surjective
case closure =>
intro a ha
simp only [Subsemigroup.mem_carrier, Submonoid.mem_toSubsemigroup,
Submonoid.mem_pointwise_smul_iff_inv_smul_mem,
smul_mul', MulAut.smul_def, conj_inv_apply, inv_mul_cancel, one_mul, smul_inv',
mem_toSubmonoid]
group
exact ha
case injective =>
intro a b ha hb hab
simp only [mul_left_inj, mul_right_inj] at hab
exact hab
case surjective =>
rintro b ⟨y, hy, rfl⟩
use y, hy
congr
rw [key]
/-
We lift the function which computes the cardinality of the noncentral part of a maximal subgroup
-/
noncomputable def lift_card {F : Type*} [Field F] (G : Subgroup SL(2,F))
(center_le_G : center SL(2,F) ≤ G) [Finite G] :=
@Quotient.lift _ _ (s := MaximalAbelianSubgroups_lift G)
(f := card_noncenter_MaximalAbelianSubgroupsOf G)
(card_eq_of_related_noncenter_subgroups G center_le_G)
Alex Brodbelt (Mar 01 2025 at 19:25):
The above was just in case someone spots something awful that should be different.
Alex Brodbelt (Mar 01 2025 at 19:36):
1) I am trying to state the final theorem for the classification of finite subgroups of and the last group I am trying to define is a bit strange as I need to embed into
I want to imitate how the Galois Field is defined to be the splitting field of docs#GaloisField which then allows to understand the Galois Field as an -algebra.
In my case, am correct (in informal maths) to think is the splitting field of ? And that (in formal maths) I am looking for the corresponding -algebra which will allows me to map into and the subsequently define the "injection" of into ?
Is this already defined or set up somewhere else? in case I don't have to rebuild (its already been invented, formalisation would be building(?) ...anyway I am rambling) the wheel.
Alex Brodbelt (Mar 01 2025 at 19:38):
2) Also, so far to make my final statement look pretty I am defining the following proposition:
import Mathlib
def Isomorphic (G H : Type*) [Group G] [Group H] :=
∃ φ : G ≃* H, True
It is a bit unfortunate I need to add the True
term. But maybe I am not aware of some nice construct? Not a big issue anyway.
Artie Khovanov (Mar 01 2025 at 22:29):
For the last thing, you're just asking for an isomorphism. So the final statement you want is just, the definition of the isomorphism.
Artie Khovanov (Mar 01 2025 at 22:30):
Oh I guess you can do like, Nonempty G ~=* H
Kevin Buzzard (Mar 01 2025 at 22:42):
(probably Nonempty (G \equiv* H)
)
Scott Carnahan (Mar 02 2025 at 02:47):
There is exactly one ring homomorphism from a field with elements to a field with elements, and you should be able to get it from the presentation as a splitting field of . (please disregard)
Kevin Buzzard (Mar 02 2025 at 07:53):
By Galois theory there are k ring homomorphisms.
Damiano Testa (Mar 02 2025 at 07:59):
I guess Scott meant that there is exactly one subfield with elements. This field has automorphisms.
Scott Carnahan (Mar 02 2025 at 17:29):
Let me try again. When working with algebraic groups over finite fields, you may find yourself with a finite field F and a quadratic extension K. While you can speak of K as a splitting field (unique up to isomorphism) of a specific large polynomial, in practice it is almost always better to assert that K = F[r] for some F-irrational element r of K. You can get a lot done by reasoning with the coefficients of its minimal polynomial in F, which up to sign are the trace and norm.
Alex Brodbelt (Mar 03 2025 at 16:47):
I somewhat follow the reasoning, I am not sure how to get the desired homomorphism from in Lean.
I am not familiar with the Galois theory part of mathlib - and I am doing a Galois theory course at the moment so I am by no means an expert.
The definition of splitting field in mathlib looks quite unwieldy to me, I expect there is some more elementary theorem which is more suitable for my purposes.
Kevin Buzzard (Mar 03 2025 at 17:15):
Can you formalize your question in Lean? I'm not clear which finite field you actually need in your application. Otherwise someone might come up with some code and say "this is the mathematical statement you want" and your response might be "yeah but cour code doesn't apply in my situation".
Alex Brodbelt (Mar 03 2025 at 17:16):
I want to define the group homomorphism below because I need to define the (normal) subgroup where and .
This is one of the cases of what the finite subgroup of is isomorphic to.
import Mathlib
open Subgroup MatrixGroups
def ringHom {p : ℕ} [Fact (Nat.Prime p)] {k : ℕ+}:
GaloisField p k →+* GaloisField p (2*k) := sorry
-- (x) The group hSL(2, Fq ), dπ i, where SL(2, Fq ) C hSL(2, Fq ), dπ i.
def monoidHom {R S : Type*} [CommRing R] [CommRing S] :
SL(2, R) →* SL(2, S) where
toFun A := sorry
map_one' := sorry
map_mul' := sorry
then I do map monoidHom (⊤ :SL(2, GaloisField p k)) ⊔ closure (d π)
Scott Carnahan (Mar 03 2025 at 17:27):
I think I see the problem: mathlib4 doesn't have any specialized API for extensions of finite fields yet. One possible path is to take fixed points of the p^k power map on GaloisField p (2 * k)
, and show that it is a splitting field of X ^ (p ^ k) - X
. Then you get existence of an isomorphism from GaloisField p k
.
Johan Commelin (Mar 03 2025 at 17:40):
But that def monoidHom
should be done for SL(n, R) -> SL(n, S)
for arbitrary ring homs R -> S
.
Johan Commelin (Mar 03 2025 at 17:40):
In other words: I encourage you to split this into two smaller targets.
Alex Brodbelt (Mar 03 2025 at 17:41):
this was my thought too - will update MWE
Yakov Pechersky (Mar 03 2025 at 18:46):
Something like?
import Mathlib
variable {p : ℕ} [Fact (Nat.Prime p)] {K L : Type*} [Field K] [Field L]
[Algebra (ZMod p) K] [Algebra (ZMod p) L] [Finite K]
noncomputable
def inclusion (h : Nat.card K ≤ Nat.card L) :
K →ₐ[ZMod p] L := by
let k := Nat.log p (Nat.card K)
let l := Nat.log p (Nat.card L)
have hk : Nat.card K = p ^ k := sorry
have hl : Nat.card L = p ^ l := sorry
let e : K ≃ₐ[ZMod p] GaloisField p k := GaloisField.algEquivGaloisField _ _ hk
let e' : L ≃ₐ[ZMod p] GaloisField p l := GaloisField.algEquivGaloisField _ _ hl
let hb := Basis.exists_basis (ZMod p) (GaloisField p k)
let ι := hb.choose
let b := Classical.choice hb.choose_spec
let hbf : Fintype ι := FiniteDimensional.fintypeBasisIndex b
let hb' := Basis.exists_basis (ZMod p) (GaloisField p l)
let ι' := hb'.choose
let b' := Classical.choice hb'.choose_spec
let hbf' : Fintype ι' := FiniteDimensional.fintypeBasisIndex b'
have : Fintype.card ι ≤ Fintype.card ι' := sorry
let f : ι → ι' := sorry
have hf : Function.Injective f := sorry
refine {
toFun x := e'.symm (Basis.constr b (ZMod p) (fun i ↦ b'.equivFun.symm (fun i' ↦ sorry)) (e x))
map_one' := sorry
map_mul' := sorry
map_zero' := sorry
map_add' := sorry
commutes' := sorry
}
Yakov Pechersky (Mar 03 2025 at 18:46):
not very familiar with Basis
API
Alex Brodbelt (Mar 03 2025 at 18:51):
Ohhhhh
Kevin Buzzard (Mar 03 2025 at 20:33):
and your monoidHom is docs#Matrix.SpecialLinearGroup.map
Kevin Buzzard (Mar 03 2025 at 20:36):
@Yakov Pechersky
import Mathlib
variable {p : ℕ} [Fact (Nat.Prime p)] {K L : Type*} [Field K] [Field L]
[Algebra (ZMod p) K] [Algebra (ZMod p) L] [Finite K]
noncomputable
def inclusion (h : Nat.card K ≤ Nat.card L) :
K →ₐ[ZMod p] L := by
...
isn't correct. If p is prime, if has size and if has size then there's no map from to because any such map would make into a -vector space of dimension . The correct claim is that for there are -algebra homs from to if and none otherwise.
Alex Brodbelt (Mar 04 2025 at 09:35):
Thanks! I am stubbing out everything so I can define all statements and dependencies and have nice looking dependency graph - so this will do for now :-)
Alex Brodbelt (Mar 04 2025 at 10:21):
For hopefully the last thing I need to stub out - The maximal abelian class equation
I have defined an equivalence relation on the set of maximal abelian subgroups of , (the definition should not matter too much - it is in the code if you need it) - this yields a Setoid
where if and only if
I have defined a function card_noncenter : MaximalAbelianSubgroups G → ℕ
defined by
I have lifted this function as the function card_noncenter
respects the equivalence relation/well-defined.
Now, all my effort is toward being able to state (caveat: the formula is not quite right it needs another term multiplying the sums):
I have shown the Quotient
defined from the Setoid
can be promoted to Fintype
as I have shown finiteness of the quotient.
but when I plug in the function into the sum over the fintype it is not happy with me summing natural numbers (the cardinality of the noncentral part of the equivalence relations) - it is expecting a Sort
? I am not sure why?
Code
Ruben Van de Velde (Mar 04 2025 at 10:31):
It seems to be complaining that the sum is not a proposition; if you add = 0
before the :=
, it works
Alex Brodbelt (Mar 04 2025 at 10:32):
Oh of course :clown: - sorry
Ruben Van de Velde (Mar 04 2025 at 10:59):
No worries
Yakov Pechersky (Mar 04 2025 at 15:14):
I apologize for the misleading snippet above. Here's another attempt for a general algHom, not one that necessarily has the properties you want.
import Mathlib
open Polynomial
variable {p : ℕ} [Fact (Nat.Prime p)] {n m : ℕ}
variable (p n) in
protected noncomputable
abbrev GaloisField.polynomial : (ZMod p)[X] := X ^ p ^ n - X
lemma GaloisField.polynomial_ne_zero : GaloisField.polynomial p n ≠ 0 := by
rw [GaloisField.polynomial]
sorry
lemma GaloisField.splits_of_dvd (hn : n ∣ m) :
Splits (algebraMap (ZMod p) (GaloisField p m)) (GaloisField.polynomial p n) := by
have hsk : Splits (algebraMap (ZMod p) (GaloisField p m)) (GaloisField.polynomial p m) :=
IsSplittingField.splits (GaloisField p m) (GaloisField.polynomial p m)
have hsk' : Splits (algebraMap (ZMod p) (GaloisField p m)) (X ^ (p ^ m - 1) - 1) := by
refine splits_of_splits_of_dvd _ polynomial_ne_zero hsk ⟨X, ?_⟩
suffices (X : (ZMod p)[X]) ^ p ^ m = X ^ (p ^ m - 1 + 1) by
simpa [GaloisField.polynomial, sub_mul, ← pow_succ]
rw [tsub_add_cancel_of_le]
exact Nat.pow_pos (Nat.Prime.pos Fact.out)
obtain ⟨k, rfl⟩ := hn
have hd : (p ^ n - 1) ∣ (p ^ (n * k) - 1) := by sorry
have hdx : (X : (ZMod p)[X]) ^ (p ^ n - 1) - 1 ∣ X ^ (p ^ (n * k) - 1) - 1 := by sorry
have hs' : Splits (algebraMap (ZMod p) (GaloisField p (n * k))) (X ^ (p ^ n - 1) - 1) := by
refine splits_of_splits_of_dvd _ ?_ hsk' hdx
sorry
have hs : Splits (algebraMap (ZMod p) (GaloisField p (n * k))) (GaloisField.polynomial p n) := by
rw [GaloisField.polynomial]
suffices Splits (algebraMap (ZMod p) (GaloisField p (n * k))) (X * (X ^ (p ^ n - 1) - 1)) by
convert this using 1
sorry
rw [splits_mul_iff]
exact ⟨splits_X _, hs'⟩
noncomputable
def GaloisField.algHom_of_dvd (hn : n ∣ m) : GaloisField p n →ₐ[ZMod p] GaloisField p m :=
Polynomial.SplittingField.lift _ (splits_of_dvd hn)
Alex Brodbelt (Mar 05 2025 at 22:50):
Wow! thank you! - filled in the remaining sorries!
Yakov Pechersky (Mar 06 2025 at 02:10):
Please PR these!
Alex Brodbelt (Mar 07 2025 at 09:29):
Will do! (but after submitting my thesis this Tuesday)
In the meantime, if anyone wants to golf the following:
Code
Last updated: May 02 2025 at 03:31 UTC