Zulip Chat Archive

Stream: mathlib4

Topic: cosset


vxctyxeha (Apr 13 2025 at 03:25):

Can this code be simplified?

import Mathlib
open Equiv Equiv.Perm Subgroup Set Finset MulOpposite
open Classical
open scoped Pointwise
abbrev S3 := Perm (Fin 3)
theorem H_left_cosets_in_S3_local_defs :
    let H : Subgroup S3 := Subgroup.closure {swap 0 1}
    let S3_elements : Finset S3 := univ
    Finset.image (fun g => g  (H : Set S3)) S3_elements =
    {
      {1, swap 0 1},                      -- H = eH
      {swap 0 2, swap 0 1 * swap 1 2},    -- (0 2)H = {(0 2), (0 1 2)}
      {swap 1 2, swap 1 2 * swap 0 1}     -- (1 2)H = {(1 2), (0 2 1)}
    }
  := by
    sorry
theorem H_right_cosets_in_S3_local_defs :
    let H : Subgroup S3 := Subgroup.closure {swap 0 1}
    let S3_elements : Finset S3 := univ
    Finset.image (fun g => op g  (H : Set S3)) S3_elements =

    {
      {1, swap 0 1},                     -- H = He
      {swap 0 2, swap 1 2 * swap 0 1},    -- H(0 2) = {(0 2), (0 2 1)}
      {swap 1 2, swap 0 1 * swap 1 2}     -- H(1 2) = {(1 2), (0 1 2)}
    }
  := by
    sorry

Kim Morrison (Apr 13 2025 at 03:33):

State it as two separate theorems.

Edison Xie (Apr 13 2025 at 03:48):

import Mathlib

open scoped Pointwise
abbrev S3 := Equiv.Perm (Fin 3)

open Equiv MulOpposite in
theorem h (H : Subgroup S3) (hH : H = Subgroup.closure {swap 0 1}) :
    {g  (H : Set S3) | g : S3} = {{1, swap 0 1}, {swap 0 2, swap 0 1 * swap 1 2},
    {swap 1 2, swap 1 2 * swap 0 1}}  {op g  (H : Set S3) | g : S3} = {{1, swap 0 1},
    {swap 0 2, swap 1 2 * swap 0 1}, {swap 1 2, swap 0 1 * swap 1 2}} := by
  sorry

vxctyxeha (Jun 06 2025 at 03:46):

What does it represent? too many arguments supplied to use

import Mathlib
open Function Nat Pointwise

abbrev S3 := Equiv.Perm (Fin 3)
open Equiv MulOpposite
theorem Subgroup.index_op {G : Type*} [Group G] (H : Subgroup G) :
    H.op.index = H.index := by
  trans (H.comap (MulEquiv.inv' G).symm.toMonoidHom).index
  · congr 1
    ext; simp
  · exact Subgroup.index_comap_of_surjective _ (MulEquiv.inv' G).symm.surjective
theorem h (H : Subgroup S3) (hH : H = Subgroup.closure {swap 0 1}) :
    {g  (H : Set S3) | g : S3} = {{1, swap 0 1}, {swap 0 2, swap 0 1 * swap 1 2},
    {swap 1 2, swap 1 2 * swap 0 1}}  {op g  (H : Set S3) | g : S3} = {{1, swap 0 1},
    {swap 0 2, swap 1 2 * swap 0 1}, {swap 1 2, swap 0 1 * swap 1 2}} := by
  let e : S3 := 1
  let s01 : S3 := Equiv.swap 0 1
  let s02 : S3 := Equiv.swap 0 2
  let s12 : S3 := Equiv.swap 1 2
  let c012 : S3 := s01 * s12 -- (01)(12) = (012)
  let c021 : S3 := s12 * s01 -- (12)(01) = (021)
  have H_set_eq : (H : Set S3) = {e, s01} := by
    rw [hH] -- Substitute the definition of H
    ext x
    rw [SetLike.mem_coe, Subgroup.mem_closure_singleton]
    simp only [Set.mem_insert_iff, Set.mem_singleton_iff]
    constructor
    rintro k, rfl -- Assume x = s01 ^ k
    have h_s01_sq : s01 ^ 2 = e := by native_decide
    have h_order_s01_is_2 : orderOf s01 = 2 := by
        rw [@orderOf_eq_prime_iff];apply And.intro;rw [h_s01_sq] ;simp only [ne_eq, s01, e]
        decide -- 展开定义,目标变为 Equiv.swap (0 : Fin 3) 1 ≠ 1
    rw [ zpow_mod_orderOf s01 k, h_order_s01_is_2]
    rcases Int.emod_two_eq_zero_or_one k with h_mod_eq_zero | h_mod_eq_one
    left;simp only [cast_ofNat, s01];rw [h_mod_eq_zero];simp;rfl
    right;simp only [cast_ofNat, s01];rw [h_mod_eq_one];simp
    --Mathlib, this might be Subgroup.mem_closure_singleton)
    rintro (rfl | rfl) -- Case on x = e or x = s01
    use 0; simp -- If x = e, use k = 0, s01 ^ 0 = e
    use 1; simp -- If x = s01, use k = 1, s01 ^ 1 = s01

Last updated: Dec 20 2025 at 21:32 UTC