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 SL(2,F)\textrm{SL}(2, F), where FF is an algebraically closed field of characteristic pp.

This is relevant because PSL(2,F)PGL(2,F)\textrm{PSL}(2,F) \cong \textrm{PGL}(2,F) when FF is algebraically closed, and it should not be too much work to classify subgroups of PSL(2,F)\textrm{PSL}(2,F) from SL(2,F)\textrm{SL}(2,F) considering the center is I\langle -I \rangle.

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:

  • dδ=(δ00δ1)d_\delta = \begin{pmatrix}\delta & 0\\0 & \delta^{-1}\end{pmatrix}
  • tτ=(10τ1)t_\tau = \begin{pmatrix}1 & 0\\\tau & 1\end{pmatrix} (will be renamed after Kevin's comment)

  • D={dδδF×}D = \{d_\delta | \delta \in F^{\times} \}

  • T={tττF}T = \{t_\tau | \tau \in F\} (will probably be renamed after Kevin's comment)
  • Z=Z(SL(2,F))Z = Z(\textrm{SL}(2,F))
  • GG is a finite subgroup of SL(2,F)\textrm{SL}(2,F), which is the object to be classified.

Main results:

  • An element xx of SL(2,F)\textrm{SL}(2,F) is conjugate to either dδd_\delta or ±tτ\pm t_\tau. (1)

  • DF×D \cong F^{\times}. (2)

  • TFT \cong F (additive group within FF). (3)

  • CSL(2,F)(dδ)=DC_{\textrm{SL(2,F)}}(d_\delta) = D for δ1,1\delta \neq 1, -1.

  • CSL(2,F)(±tτ)=TZ=TZC_{\textrm{SL(2,F)}}(\pm t_\tau) = T \sqcup Z = T\cdot Z for τ0\tau \neq 0.

  • Conjugate elements have conjugate centralizers. (4)

  • CSL(2,F)(x)C_{\textrm{SL(2,F)}}(x) is commutative (using (1), (4) and (2) (3) ).

  • Results on normalizers of T0TT_0 \leq T and D0DD_0 \leq D.

Chapter 2 - The Maximal Abelian Subgroup Class Equation

Definitions:

  • MM is the set of maximal abelian subgroups of GG. 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 xGZx \in G \setminus Z then CG(x)=CSL(2,F)GMC_G(x) = C_{\textrm{SL(2,F)}} \sqcap G \in M.

  • If A,BMA, B \in M and ABA \neq B then AB=ZA \sqcap B = Z.

  • If AMA \in M either AA is cyclic and has order coprime to p=char(F)p = \textrm{char}(F) or it is isomorphic to QZQ \sqcup Z where QQ is elementary abelian pp-Sylow subgroup of GG (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

  • FF be a field of characteristic pp, the exposition does not treat the case when p=0p = 0 as far as I can see (even though it seems to assume it has been proven for this case).
  • GG a finite subgroup of SL(2,F)\textrm{SL}(2,F) containing the center ; G :SL(2,F) with center SL(2,F) = Z < G (explicitly, ZGZ \neq G - the case where they are equal has been treated).
  • AA be a maximal abelian subgroup of GG has type A : Subgroup Subgroup SL(2,F) with A ≤ G.

Then AA is either cyclic and has order coprime to p=char(F)p = \textrm{char}(F) or it is isomorphic to QZQ \sqcup Z where QQ is elementary abelian pp-Sylow subgroup of GG.

proof/formalization/sketch:

As Z<AZ < A there exists an element xAGZx \in A \subseteq G \setminus Z, such that CG(x)=AC_G(x) = A.

As xx is conjugate to dδd_\delta or ±tτ\pm t_\tau, (the case where xx is conjugate to dδd_\delta has been dealt with after help from Kevin and others in another thread) so we focus on the case where xx is conjugate to tτt_\tau (the case for tτ-t_\tau is exactly the same so we leave it).

There exists some τ0\tau \neq 0 (as otherwise, if τ=0\tau = 0, x=1SL(2,F)Zx = 1_{\textrm{SL(2,F)}} \in Z) such that xx is conjugate to tτt_\tau; because conjugate elements have conjugate centralizers, there exists some cSL(2,F)c \in \textrm{SL(2,F)} such that A=CG(x)=CSL(2,F)(x)G=c1CSL(2,F)(tτ)cGA = C_G(x) = C_{\textrm{SL(2,F)}}(x) \sqcap G =c^{-1} C_{\textrm{SL}(2,F)}(t_\tau) c \sqcap G.

Bearing in mind, CSL(2,F)(tτ)=TZ=TZT×ZC_{\textrm{SL}(2,F)}(t_\tau) = T \cdot Z = T \sqcup Z \cong T \times Z and taking into account Artie's reasoning.

c1CSL(2,F)(tτ)cG=(c1TZc)G=(c1TcZ)G=(c1TcG)Z(TcGc1)Zc^{-1} C_{\textrm{SL}(2,F)}(t_\tau) c \sqcap G = (c^{-1}T Z c)\sqcap G = (c^{−1}Tc⋅Z)\sqcap G = (c^{−1}Tc \sqcap G) \sqcup Z \cong (T \sqcap cGc^{-1} )\sqcup Z.

The last isomorphism is constructed by feeding in one isomorphism into another:
From the isomorphism c1TcGTcGc1c^{−1}Tc\sqcap G\cong T\sqcap cGc^{−1} and AZ=BZA \sqcup Z = B \sqcup Z for ABA \cong B, ZZ normal (as commutative) and trivial intersection between ZA={1}=ZBZ \sqcap A = \{1\} = Z \sqcap B. this is what I am stuck trying to formalize

All of this allows to conclude A(TcGc1ZA \cong (T \sqcap cGc^{-1} \sqcup Z, denote the isomorphism by$$\phi$$. Because GG is finite cGc1c G c^{-1} is finite and pulling back TcGc1T \sqcap cGc^{-1} along ϕ\phi is the desired Q=:ϕ1(TcGc1)Q =: \phi^{-1} (T \sqcap cGc^{-1}) as I believe ϕ1(Z)=Z\phi^{-1} (Z) = Z.

Assuming this last part is correct, then for characteristic pp take qQq \in Q, then as qTq \in T, there must exist τ\tau' such that tτ=qt_{\tau'} = q and qp=1q^p = 1, this was arbitrary for any qQq \in Q so this fact added with QQ being commutative, we can conclude QQ is elementary abelian.

...It being pp-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 ZZ commutes with everything, we have

A=(c1TZc)G=(c1TcZ)G=(c1TcG)Z.A=(c^{-1}TZc)\cap G=(c^{-1}Tc\cdot Z)\cap G=(c^{-1}Tc\cap G)Z.

So it's enough to show that c1TcGTcGc1c^{-1}Tc\cap G\cong T\cap cGc^{-1} is elementary abelian.

Now, I think you've told me you can prove that T0=TGT_0=T\cap G is elementary abelian. If you do this proof with GG replaced by cGc1cGc^{-1}, 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 SL2(F)\text{SL}_2(F) finite?

Artie Khovanov (Jan 22 2025 at 11:22):

I assumed FF was a finite field. Is it just any char pp 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):

FF 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 p=0p= 0, p=2p = 2 and when pp is a prime not equal to 22

Alex Brodbelt (Jan 22 2025 at 12:18):

for this particular case I am considering when p0p \neq 0

Alex Brodbelt (Jan 22 2025 at 12:19):

I eventually would like to cover the case p=0p = 0 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 p0p \neq 0

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 ZZ commutes with everything, we have

A=(c1TZc)G=(c1TcZ)G=(c1TcG)Z.A=(c^{-1}TZc)\cap G=(c^{-1}Tc\cdot Z)\cap G=(c^{-1}Tc\cap G)Z.

So it's enough to show that c1TcGTcGc1c^{-1}Tc\cap G\cong T\cap cGc^{-1} is elementary abelian.

Now, I think you've told me you can prove that T0=TGT_0=T\cap G is elementary abelian. If you do this proof with GG replaced by cGc1cGc^{-1}, 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:

left_inv_sorry

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 cc or the τ\tau you're using anywhere. Do we have τ0\tau\neq0? What about tτGt_\tau\in G? Can it be any τ\tau satisfying certain conditions, or are you saying only that some such τ\tau 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 AA mentions GG but you don't define GG until later.

Your claim that CSL(2,F)(tτ)=TZ(SL(2,F))C_{SL(2,F)}(t_\tau)=T\cup Z(SL(2,F)) is incorrect if τ=0\tau=0 (and this can happen if e.g. GG is abelian). Can you clarify whether you are interested in this case?

You have AA a subgroup of GG, and then you say ACG(tτ)A\cong C_G(t_\tau). But CG(tτ)C_G(t_\tau) and AA are both subgroups of GG. Do you mean A=CG(tτ)A=C_G(t_\tau) 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 H=NH=N? 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 c1TcGTcGc1c^{−1}Tc\sqcap G\cong T\sqcap cGc^{−1} and AZ=BZA \sqcup Z = B \sqcup Z for ABA \cong B, ZZ normal (as commutative) and trivial intersection between ZA={1}=ZBZ \sqcap A = \{1\} = Z \sqcap B. this is what I am stuck trying to formalize

It's easier than this. You can apply the conjugation by cc 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):

cc1TcGZc1c c^{-1} T c \sqcap G \sqcup Z c^{-1}

Artie Khovanov (Jan 24 2025 at 00:28):

Alex Brodbelt said:

Hmm so something like "simplifying":

cc1TcGZc1c c^{-1} T c \sqcap G \sqcup Z c^{-1}

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 cc, and the conjugation action of cc is just an automorphism of GG. 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 QQ

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 PSLn(F)PSL_n(F) to PGLn(F)PGL_n(F) when FF 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 φ:PSLn(F)PGLn(F)\varphi : \textrm{PSL}_n(F) \rightarrow \textrm{PGL}_n(F) be defined by
S  ωIi(S)  (F×I)S \; \langle \omega I\rangle \mapsto i(S) \; (F^\times I)

where i:SLn(F)GLn(F)i : \textrm{SL}_n(F) \hookrightarrow \textrm{GL}_n(F) is the natural injection of the special linear group into the general linear group.

We show φ\varphi is an isomorphism when FF is algebraically closed

  • We show φ\varphi is well-defined:

Let S,SSLn(F)S, S' \in \textrm{SL}_n(F), suppose SωI=SωIS \langle \omega I\rangle = S'\langle \omega I\rangle then because SS1I    SS1=ωkISS'^{-1} \in \langle -I\rangle \iff SS'^{-1} = \omega^k I for some kNk \in \mathbb{N} we have the following chain of set equalities

φ(SωI)=S(F×I)=S(F×I)=φ(SωI)\varphi(S \langle \omega I \rangle) = S (F^\times I) = S' (F^\times I) = \varphi(S' \langle \omega I\rangle)

because S=ωkISS = \omega^k I S and ωIF×I\omega I \in F^\times I

  • When FF is algebraically closed, we show φ\varphi in fact defines an isomorphism:

We show φ\varphi is multiplicative, injective and surjective (low-tech way):

  • φ\varphi is multiplicative:

    Let SI,QIPSLn(F)S \langle-I\rangle, Q\langle-I\rangle \in \textrm{PSL}_n(F) where S,QSLn(F)S, Q \in \textrm{SL}_n(F) then

φ(SIQI)=φ(SQI)=i(SQ)F×I=i(S)i(Q)F×I=i(S)(F×I)i(Q)(F×I)=φ(S)φ(Q)\begin{align*} \varphi(S \langle-I\rangle Q\langle-I\rangle ) &= \varphi(SQ \langle -I\rangle)\\ &= i(SQ) F^\times I\\ &= i(S) i(Q) F^\times I\\ &= i(S) (F^\times I) \cdot i(Q)(F^\times I) \\ &= \varphi(S) \varphi(Q) \end{align*}

Where the normality of ωI\langle \omega I \rangle is used, and because group injections define a homomorphism and by the normality of F×IF^\times I.

  • φ\varphi is injective:

Let SI,SIPSLn(F)S \langle -I\rangle, S'\langle-I\rangle \in \textrm{PSL}_n(F) and suppose
φ(SI)=φ(SI)\varphi(S \langle -I\rangle) = \varphi(S'\langle-I\rangle) then i(S)(F×I)=i(S)(F×I)i(S) (F^\times I) = i(S')(F^\times I) further implies i(S)i(S)1=cI i(S) i(S')^{-1} = cI

but i(S)i(S)1=i(SS1)i(S) i(S')^{-1} = i(S S'^{-1}) so det(i(S)i(S)1)=cn=1\det(i(S)i(S')^{-1}) = c^n = 1 and thus
c=ωkc = \omega^k for some kNk \in \N, where ω\omega is a primitive $$n$$th root of unity.

φ(SIQI)=φ(SQI)=i(SQ)F×I=i(S)i(Q)F×I=i(S)(F×I)i(Q)(F×I)=φ(S)φ(Q)\begin{align*} \varphi(S \langle-I\rangle Q\langle-I\rangle ) &= \varphi(SQ \langle -I\rangle) \\ &= i(SQ) F^\times I\\ &= i(S) i(Q) F^\times I\\ &= i(S) (F^\times I) \cdot i(Q)(F^\times I) \\ &= \varphi(S) \varphi(Q) \end{align*}

  • φ\varphi is surjective:

Let G  (F×I)=[G]PGLn(F)G \; (F^\times I) = [G] \in \textrm{PGL}_n(F), then GGLn(F)G \in \textrm{GL}_n(F) and so detG0\det G \ne 0, we can find a representative of [G][G'], 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 SLn(F)\textrm{SL}_n(F). Let

P(X):=Xndet(G)F[X]P(X) := X^n - \det(G) \in F[X]

By assumption, FF is algebraically closed so there exists a root α0F\alpha \ne 0\in F such that

αndet(G)=0    αn=det(G) \alpha^n - \det(G) = 0 \iff \alpha^n = \det(G)

We can define

G:=1αGG' := \frac{1}{\alpha} \cdot G where det(G)=1αndet(G)=1\det(G') = \frac{1}{\alpha^n} \det(G) = 1
Thus GSLn(F)GLn(F)G' \in \textrm{SL}_n(F) \leq \textrm{GL}_n(F) and given G=1αGG' = \frac{1}{\alpha} G we have that
G  (F×I)=G  (F×I)G' \; (F^\times I) = G \; (F^\times I).

Therefore, φ(G)=i(G)(F×I)=G(F×I)=G(F×I)\varphi(G') = i(G') (F^\times I) = G' (F^\times I) = G (F^\times I).

So far I am definining the monoid homomorphism from PSLn(R)PSL_n(R) into PGLn(R)PGL_n(R) when RR 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 detG\det G where GGLn(F)G \in \textrm{GL}_n(F).

I have the lemma for extracting this nth root and the corresponding matrix in SLn(F)\textrm{SL}_n(F) 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 GLn(R)\textrm{GL}_n(R), 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 := 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  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 For 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 For 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 yy 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 ss the “lift” of s~\tilde{s}.

: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 SL2(F)\textrm{SL}_2(F) might look like I need to construct the so called maximal abelian subgroup class equation (harnesses the fact that centralizers of SL2(F)\textrm{SL}_2(F) 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 M\mathfrak{M} is the set of maximal abelian subgroups of GG, the finite subgroup of SL2(F)\textrm{SL}_2(F) to be classified, let AMA \in \mathfrak{M} then the non-central part of AA is A=AZ(SL2(F))A^* = A \setminus Z(\textrm{SL}_2(F)).

Let M:={Ai    AiM}\mathfrak{M}^* := \{ A_i^* \; | \; A_i \in \mathfrak{M} \}

For a given AiA_i, the conjugacy class of AiA_i is defined as Ci={xAix1    xG}\mathcal{C}_i = \{x A_i x^{-1} \; |\; x \in G \} (this is not quite docs#ConjClasses).

Similarly, let Ci={xAix1    xG}\mathcal{C}_i* = \{x A_i^* x^{-1} \; | \; x \in G \}. The nice property now is that the Ci\mathcal{C}_i^* partition M\mathfrak{M}^* as it is the equivalence class of AiA_i^* in M\mathfrak{M}*.

Then define Ci=xGxAix1C_i^* = \cup_{x \in G} x A_i^* x^{-1}, every element of GZ(SL2(F))G \setminus Z(\textrm{SL}_2(F)) lie within one of the CiC_i^* as suppose aiAia_i \in A_i^* then there exists a yGy \in G such that yaiy1y a_i y^{-1} as the map fy:GGf_y : G \rightarrow G defined by xyxy1x \mapsto y x y^{-1} defines an automorphism, so restricting to GZ(SL2(F)G \setminus Z(\textrm{SL}_2(F) defines a bijection, because if x,yGZx, y \in G \setminus Z then yxy1GZy x y^{-1} G \setminus Z . If yxy1Zy x y^{-1} \in Z then there is a zZz \in Z such that zyxy1=1    yzx=y    x=z1Z z y x y^{-1} = 1 \iff y z x = y \iff x = z^{-1} \in Z a contradiction.

We also have the relation Ci=AiCi|C_i^*| = |A_i*| |\mathcal{C}_i*|.

That is to say, there exists an indexing set SS (not sure how I would construct such a set or sidestep this construction yet) where:

GZ(SL2(F))=iSCiG \setminus Z(\textrm{SL}_2(F)) = \bigcup_{i \in S} C_i^* (A)

I wonder if I should set up CiC_i^* 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

GZ(SL2(F))=iSCi|G \setminus Z(\textrm{SL}_2(F))| = \sum_{i \in S} |C_i^*|

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 CiC_i* and proving that there is an equivalence relation on them which should then give me the partition of GZ(SL2(F))G\setminus Z(\textrm{SL}_2(F)).

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 A\ZA \backslash Z 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 CiC_i^* partition G\ZG \backslash Z typecheck. You have defined CiC_i^* 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 CiC_i^* 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 SS which comes from the fact that CiC_i^* partition GZ(SL2(F)G \setminus Z(\textrm{SL}_2(F). The critical theorem I would like to state is:

GZ(SL2(F)=iSCi|G \setminus Z(\textrm{SL}_2(F)| = \sum_{i \in S} |C_i^*| where iSCi=M\bigcup_{i \in S} \mathcal{C}_i^* = \mathfrak{M}^*

Recall Ci={xAix1    xG}\mathcal{C}_i = \{x A_i x^{-1} \; | \; x \in G \} and Ci=xGxAix1C_i^* = \bigcup{x \in G} x A_i x^{-1}.

My guess so far is that SS or the subset {AiiS}\{A_i | i \in S\} will come from the equivalence relation and the assumption that SS is finite, as GG is finite, GZ(SL2(F)G \setminus Z(\textrm{SL}_2(F) is finite; so SGZ(SL2(F))|S| \leq |G \setminus Z(\textrm{SL}_2(F))| as Ci>0|C_i^*| > 0.

But I'm not sure how I will convince lean of this, or how to get this indexing set SS.

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 SL2(F)\textrm{SL}_2(F) and the last group I am trying to define is a bit strange as I need to embed Fpk\mathbb{F}_{p^k} into Fp2k\mathbb{F}_{p^{2k}}

image.png

I want to imitate how Fpk\mathbb{F}_{p^k} the Galois Field is defined to be the splitting field of XpkXFp[X]X^{p^k} - X \in \mathbb{F}_p[X] docs#GaloisField which then allows to understand the Galois Field as an Fp\mathbb{F}_p-algebra.

In my case, am correct (in informal maths) to think Fp2k\mathbb{F}_{p^{2k}} is the splitting field of XpkXFpk[X]X^{p^k} - X \in \mathbb{F_{p^k}}[X]? And that (in formal maths) I am looking for the corresponding Fpk\mathbb{F}_{p^k}-algebra which will allows me to map Fpk\mathbb{F}_{p^k} into Fp2k\mathbb{F}_{p^{2k}} and the subsequently define the "injection" of SL2(Fpk)\textrm{SL}_2(\mathbb{F}_{p^k}) into SL2(Fp2k)\textrm{SL}_2(\mathbb{F}_{p^{2k}})?

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 pkp^k elements to a field with p2kp^{2k} elements, and you should be able to get it from the presentation as a splitting field of Xp2kXX^{p^{2k}} - X. (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 pkp^k elements. This field has kk 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 FpkFp2k\mathbb{F}_{p^k} \rightarrow \mathbb{F}_{p^{2k}} 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 SL2(Fpk),dπSL2(Fp2k)\langle \textrm{SL}_2(F_{p^k}), d_\pi \rangle \lhd \textrm{SL}_2(F_{p^{2k}}) where πFp2kFpk\pi \in F_{p^{2k}} \setminus F_{p^k} and π2Fpk\pi^2\in F_{p^k}.

This is one of the cases of what GG the finite subgroup of SL2(F)\textrm{SL}_2(F) 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 KK has size p2p^2 and if LL has size p3p^3 then there's no map from KK to LL because any such map would make LL into a KK-vector space of dimension 3/23/2. The correct claim is that for k,n>0k,n>0 there are kk Z/pZ\mathbb{Z}/p\mathbb{Z}-algebra homs from GF(pk)GF(p^k) to GF(pn)GF(p^n) if knk|n 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 GG, M\mathfrak{M} (the definition should not matter too much - it is in the code if you need it) - this yields a Setoid M/\mathfrak{M} / \sim

where ABA \sim B if and only if xG,xAx1=B\exists x \in G, x A x^{-1} = B

I have defined a function card_noncenter : MaximalAbelianSubgroups G → ℕ defined by
AAZ(SL2(F))A \mapsto |A \setminus Z(\textrm{SL}_2(F))|

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):

GZ(SL2(F))=AM/card_noncenter(A)|G \setminus Z(\textrm{SL}_2(F))| = \sum_{ A \in \mathfrak{M} / \sim } \textrm{card\textunderscore noncenter}(A)

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