Zulip Chat Archive

Stream: new members

Topic: Trying to construct A_4 using permutation.


Nick_adfor (May 18 2025 at 10:20):

I was trying to construct A_4 using permutation. It need (1)(2)(3)(4)=e, (a b c), and (a b)(c d), the first is to prove they are elements of A_4, the second is to count them up and get 12. With |A_4|=12, the proof is finished.

import Mathlib

open Equiv Perm

def IsDoubleTransposition (σ : Perm (Fin 4)) : Prop :=
   (a b c d : Fin 4), a  b  c  d 
  Disjoint (support (swap a b)) (support (swap c d)) 
  σ = swap a b * swap c d

def doubleTranspositions : List (Perm (Fin 4)) :=
  [swap 0 1 * swap 2 3,
   swap 0 2 * swap 1 3,
   swap 0 3 * swap 1 2]

lemma mem_doubleTranspositions_iff {σ : Perm (Fin 4)} :
  σ  doubleTranspositions  IsDoubleTransposition σ := by
  revert σ
  simp only [doubleTranspositions, IsDoubleTransposition]
  decide

lemma doubleTranspositions_mem_A4 :
     σ  doubleTranspositions, σ  alternatingGroup (Fin 4) := by
  simp only [Equiv.Perm.mem_alternatingGroup, Equiv.Perm.sign_mul, Equiv.Perm.IsSwap.sign_eq]
  decide

def ThreeCycles : List (Perm (Fin 4)) :=
  [swap 0 1 * swap 0 2,  -- (0 1 2)
   swap 0 2 * swap 0 1,  -- (0 2 1)
   swap 0 1 * swap 0 3,  -- (0 1 3)
   swap 0 3 * swap 0 1,  -- (0 3 1)
   swap 0 2 * swap 0 3,  -- (0 2 3)
   swap 0 3 * swap 0 2,  -- (0 3 2)
   swap 1 2 * swap 1 3,  -- (1 2 3)
   swap 1 3 * swap 1 2]  -- (1 3 2)
--lean does not have a good way to deFine a list of all 3-cycles, so I use swap products.

lemma mem_allThreeCycles_iff {σ : Perm (Fin 4)} :
    σ  ThreeCycles  σ.IsThreeCycle := by
  revert σ
  simp only [ThreeCycles,  card_support_eq_three_iff]
  decide

lemma ThreeCycles_mem_A4 :
     σ  ThreeCycles, σ  alternatingGroup (Fin 4) := by
  simp only [Equiv.Perm.mem_alternatingGroup, Equiv.Perm.sign_mul, Equiv.Perm.IsSwap.sign_eq]
  decide

lemma one_mem_A4 : (1 : Perm (Fin 4))  alternatingGroup (Fin 4) := by
  simp only [Equiv.Perm.mem_alternatingGroup, Perm.sign_one]

lemma card_A4_Fin4 : Fintype.card (alternatingGroup (Fin 4)) = 12 := by
  have h1 := @Fintype.card_perm (Fin 4) _ _
  have h2 := @two_mul_card_alternatingGroup (Fin 4) _ _ _
  rw [h1] at h2
  norm_num at h2
  exact (Nat.eq_of_mul_eq_mul_left zero_lt_two h2).symm

def generators : List (Perm (Fin 4)) :=
  (1 : Perm (Fin 4)) :: (ThreeCycles ++ doubleTranspositions)

lemma generators_subset_A4 :  σ  generators, σ  alternatingGroup (Fin 4) := by
  intros σ 
  simp only [generators] at 
  cases 
  · -- σ = 1
    exact one_mem_A4
  · -- σ ∈ ThreeCycles ++ doubleTranspositions
    rename_i h
    change σ  ThreeCycles ++ doubleTranspositions at h
    simp only [List.mem_append] at h
    cases h
    · rename_i h'
      exact ThreeCycles_mem_A4 σ h'
    · rename_i h'
      exact doubleTranspositions_mem_A4 σ h'

lemma generators_card : generators.length = 1 + ThreeCycles.length + doubleTranspositions.length := by
  simp [generators]
  linarith

def G : Subgroup (Perm (Fin 4)) := Subgroup.closure generators.toFinset

lemma G_subset_A4 : G  alternatingGroup (Fin 4) := by
  dsimp [G]
  rw [Subgroup.closure_le]
  intros σ 
  have h_mem := List.mem_toFinset.mp 
  exact generators_subset_A4 σ h_mem

open scoped Classical

lemma G_eq_A4 : G = alternatingGroup (Fin 4) := by
  let A4 := alternatingGroup (Fin 4)
  have hG_le : G  A4 := G_subset_A4
  haveI : Finite G := inferInstance
  haveI : Finite A4 := inferInstance
  apply le_antisymm hG_le
  letI := Fintype.ofFinite G
  suffices Nat.card G = Nat.card A4 by
    sorry
  have hG_card : Fintype.card G = 12 := by
    sorry
  have hA4_card : Fintype.card A4 = 12 := card_A4_Fin4
  rw [Nat.card_eq_fintype_card, Nat.card_eq_fintype_card, hG_card, hA4_card]

But I cannot find a good method to fill the two sorry. It seems that I'm too tired and my mind get stuck. That's terrible.


Last updated: Dec 20 2025 at 21:32 UTC