Zulip Chat Archive

Stream: new members

Topic: Find the center of dihedral group.


Tristan (Feb 27 2025 at 15:55):

It's easy to know that The center of the dihedral group $D_n$ is : if n is odd, then $Z(D_n)$ = \{e\} ; otherwise, $Z(D_n)$ = \{e, $r^{n/2}$\} .

open DihedralGroup

theorem center_of_dihedralGroup (n : ) :
  IsSubgroup.center (DihedralGroup n) =
    if Even n then {1, r (Int.div2 n)} else {1} := by

However, I am puzzled about how to iterate over the elements of the dihedral group, specifically the elements of the forms $r$ and $sr$, to prove such an expression below.

1 goal
case pos.h.mpr.inr
n : 
h : Even n
x g : DihedralGroup n
hx : x = r (n).div2
 g * x = x * g

I have a group element $g$ that I want to iterate over all elements of the dihedral group $D_n$, but I'm not sure how to do this.

Yakov Pechersky (Feb 27 2025 at 17:23):

Here's a start. I hope you see how I am able to iterate over all elements of the group using rintro. Your theorem isn't exactly true:

import Mathlib

@[to_additive (attr := simp)]
lemma isMulCentral_subsingleton {G : Type*} [Mul G] [Subsingleton G] (x : G) :
    IsMulCentral x := by
  constructor <;> intros <;> exact Subsingleton.elim _ _

@[simp]
lemma Set.center_subsingleton {G : Type*} [Mul G] [Subsingleton G] :
    Set.center G = univ := by
  ext; simp [Set.mem_center_iff]

open DihedralGroup

lemma isMulCentral_r_of_even (n : ) :
    IsMulCentral (r n : DihedralGroup (2 * n)) := by
  constructor <;> repeat' (rintro ⟨⟩)
  rotate_left
  · simp [sub_eq_iff_eq_add, add_assoc,  Nat.cast_add,  two_mul n]
  all_goals simp; ring

lemma isMulCentral_sr_of_two (k : ZMod 2) : IsMulCentral (sr k) := by
  have hp : (2 : ZMod 2) = 0 := rfl
  constructor <;> repeat' (rintro (⟨⟩|⟨⟩))
  all_goals try (simp; ring1)
  · simp [eq_sub_iff_add_eq, add_assoc,  two_mul, hp]
  · simp only [sr_mul_sr, r.injEq, eq_sub_iff_add_eq] -- annoying trivial rearrangement goal
    rw [sub_eq_add_neg, add_right_comm,  two_mul,   sub_eq_add_neg, sub_eq_iff_eq_add,
       two_mul, hp]
    simp

lemma isMulCentral_sr_iff {n : } {k : ZMod n} :
    IsMulCentral (sr k)  n = 1  n = 2 := by
  constructor
  · contrapose!
    intro hn h
    have key : (2 : ZMod n)  0 := by
      contrapose! hn
      -- annoying CharP goals
      rcases n with (_|_|_|_)
      · simp at hn
      · simp
      · simp
      · rw [ (ZMod.val_injective _).eq_iff, ZMod.val_two_eq_two_mod] at hn
        simp [Nat.mod_eq_of_lt] at hn
    apply key
    simpa [eq_neg_iff_add_eq_zero,  two_mul] using h.comm (sr (k + 1))
  · rintro (rfl|rfl)
    · constructor <;> repeat' (rintro (⟨⟩|⟨⟩)) <;> repeat' (rintro (⟨⟩|⟨⟩)) <;>
      all_goals try (simp [ mul_assoc]; exact Subsingleton.elim _ _)
      all_goals (simp; exact Subsingleton.elim _ _)
    · exact isMulCentral_sr_of_two k


-- this is your theorem
theorem center_of_dihedralGroup_even (n : ) :
    (Set.center (DihedralGroup (2 * n))) = {1, r n} := by
  rcases eq_or_ne n 1 with rfl|hn
  · ext (k⟩|⟨k)
    · fin_cases k
      · simp
      · simpa [Set.mem_center_iff] using isMulCentral_r_of_even 1
    · sorry -- false, since sr 0 is in the center, and it isn't 1 or r n
  refine (le_antisymm ?_ ?_).symm
  · intro g
    simp only [Set.mem_insert_iff, Set.mem_singleton_iff]
    rintro (rfl|rfl)
    · simp
    · simp only [Set.mem_center_iff, isMulCentral_r_of_even n]
  rintro (k⟩|⟨k) <;>
    simp only [Set.mem_center_iff, Set.mem_insert_iff, Set.mem_singleton_iff, reduceCtorEq,
      or_false, r.injEq]
  · sorry
  · sorry

Aaron Liu (Feb 27 2025 at 18:00):

Since DihedralGroup 2 is isomorphic to the klein-four group, its center is the whole group.
Since DihedralGroup 1 is cyclic, its center is also the whole group.
The center of DihedralGroup 0 is trivial, and does not include sr 0.

You should be able to prove the theorem assuming 3 ≤ n.

Tristan (Mar 07 2025 at 14:13):

Thank you very much! With your guidance, I was able to complete the subsequent proof. However, I’m quite curious—how did you come up with the final simp only statement:
simp only [Set.mem_center_iff, Set.mem_insert_iff, Set.mem_singleton_iff, reduceCtorEq, or_false, r.injEq]
I tried using simp?, but it didn't simplify to this level. I truly admire your expertise in writing Lean code!

Tristan (Mar 07 2025 at 14:14):

Yakov Pechersky said:

Here's a start. I hope you see how I am able to iterate over all elements of the group using rintro. Your theorem isn't exactly true:

import Mathlib

@[to_additive (attr := simp)]
lemma isMulCentral_subsingleton {G : Type*} [Mul G] [Subsingleton G] (x : G) :
    IsMulCentral x := by
  constructor <;> intros <;> exact Subsingleton.elim _ _

@[simp]
lemma Set.center_subsingleton {G : Type*} [Mul G] [Subsingleton G] :
    Set.center G = univ := by
  ext; simp [Set.mem_center_iff]

open DihedralGroup

lemma isMulCentral_r_of_even (n : ) :
    IsMulCentral (r n : DihedralGroup (2 * n)) := by
  constructor <;> repeat' (rintro ⟨⟩)
  rotate_left
  · simp [sub_eq_iff_eq_add, add_assoc,  Nat.cast_add,  two_mul n]
  all_goals simp; ring

lemma isMulCentral_sr_of_two (k : ZMod 2) : IsMulCentral (sr k) := by
  have hp : (2 : ZMod 2) = 0 := rfl
  constructor <;> repeat' (rintro (⟨⟩|⟨⟩))
  all_goals try (simp; ring1)
  · simp [eq_sub_iff_add_eq, add_assoc,  two_mul, hp]
  · simp only [sr_mul_sr, r.injEq, eq_sub_iff_add_eq] -- annoying trivial rearrangement goal
    rw [sub_eq_add_neg, add_right_comm,  two_mul,   sub_eq_add_neg, sub_eq_iff_eq_add,
       two_mul, hp]
    simp

lemma isMulCentral_sr_iff {n : } {k : ZMod n} :
    IsMulCentral (sr k)  n = 1  n = 2 := by
  constructor
  · contrapose!
    intro hn h
    have key : (2 : ZMod n)  0 := by
      contrapose! hn
      -- annoying CharP goals
      rcases n with (_|_|_|_)
      · simp at hn
      · simp
      · simp
      · rw [ (ZMod.val_injective _).eq_iff, ZMod.val_two_eq_two_mod] at hn
        simp [Nat.mod_eq_of_lt] at hn
    apply key
    simpa [eq_neg_iff_add_eq_zero,  two_mul] using h.comm (sr (k + 1))
  · rintro (rfl|rfl)
    · constructor <;> repeat' (rintro (⟨⟩|⟨⟩)) <;> repeat' (rintro (⟨⟩|⟨⟩)) <;>
      all_goals try (simp [ mul_assoc]; exact Subsingleton.elim _ _)
      all_goals (simp; exact Subsingleton.elim _ _)
    · exact isMulCentral_sr_of_two k


-- this is your theorem
theorem center_of_dihedralGroup_even (n : ) :
    (Set.center (DihedralGroup (2 * n))) = {1, r n} := by
  rcases eq_or_ne n 1 with rfl|hn
  · ext (k⟩|⟨k)
    · fin_cases k
      · simp
      · simpa [Set.mem_center_iff] using isMulCentral_r_of_even 1
    · sorry -- false, since sr 0 is in the center, and it isn't 1 or r n
  refine (le_antisymm ?_ ?_).symm
  · intro g
    simp only [Set.mem_insert_iff, Set.mem_singleton_iff]
    rintro (rfl|rfl)
    · simp
    · simp only [Set.mem_center_iff, isMulCentral_r_of_even n]
  rintro (k⟩|⟨k) <;>
    simp only [Set.mem_center_iff, Set.mem_insert_iff, Set.mem_singleton_iff, reduceCtorEq,
      or_false, r.injEq]
  · sorry
  · sorry

Thank you very much! With your guidance, I was able to complete the subsequent proof. However, I’m quite curious—how did you come up with the final simp only statement:
simp only [Set.mem_center_iff, Set.mem_insert_iff, Set.mem_singleton_iff, reduceCtorEq, or_false, r.injEq]
I tried using simp?, but it didn't simplify to this level. I truly admire your expertise in writing Lean code!

Tristan (Mar 07 2025 at 14:16):

Aaron Liu said:

Since DihedralGroup 2 is isomorphic to the klein-four group, its center is the whole group.
Since DihedralGroup 1 is cyclic, its center is also the whole group.
The center of DihedralGroup 0 is trivial, and does not include sr 0.

You should be able to prove the theorem assuming 3 ≤ n.

Thanks for your advice, that was my oversight.

Yakov Pechersky (Mar 07 2025 at 15:48):

Here is how I got the all-goal simp only: I did a simp? [Set.mem_center_iff] on both subgoals and then used the union:

  rintro (k⟩|⟨k)
  · simp? [Set.mem_center_iff] -- Try this: simp only [Set.mem_center_iff, Set.mem_insert_iff, Set.mem_singleton_iff, r.injEq]
  · simp? [Set.mem_center_iff] -- simp only [Set.mem_center_iff, Set.mem_insert_iff, Set.mem_singleton_iff, reduceCtorEq, or_false]

Last updated: May 02 2025 at 03:31 UTC