コンテンツにスキップ

長めの例: 共役部分群

群 G の部分群 S と元 g : G に対して, g S g⁻¹ = {x | ∃ s ∈ S, x = g * s * g⁻¹} はまた部分群です. これは抽象代数学の基本例で,閉性の証明に group がよく効きます.

section ConjugateSubgroup

variable {G : Type*} [Group G]

def conjugateSubgroup (g : G) (S : Subgroup G) : Subgroup G where
  carrier := {x : G | ∃ s, s ∈ S ∧ x = g * s * g⁻¹}
  one_mem' := by
    refine ⟨1, S.one_mem, ?_⟩
    group
  mul_mem' := by
    rintro x y ⟨s, hs, rfl⟩ ⟨t, ht, rfl⟩
    refine ⟨s * t, S.mul_mem hs ht, ?_⟩
    group
  inv_mem' := by
    rintro x ⟨s, hs, rfl⟩
    refine ⟨s⁻¹, S.inv_mem hs, ?_⟩
    group

example (g : G) (S : Subgroup G) {x : G} :
    x ∈ conjugateSubgroup g S ↔ ∃ s, s ∈ S ∧ x = g * s * g⁻¹ := by
  rfl

example (S : Subgroup G) {x : G} : x ∈ conjugateSubgroup (1 : G) S ↔ x ∈ S := by
  constructor
  · rintro ⟨s, hs, rfl⟩
    simpa using hs
  · intro hx
    refine ⟨x, hx, ?_⟩
    group

end ConjugateSubgroup

この例で使った証明パターンは,部分構造の自作で頻繁に現れます.

  • rintro ... ⟨s, hs, rfl⟩ で存在記号と等式を分解する.
  • 閉性は S.mul_mem,S.inv_mem などを使う.
  • 群の計算は group に任せる.

学部レベルの代数を形式化するときは,まずこのような「集合を carrier として持つ構造体」を自作できることが重要です.

演習問題

conjugateSubgroup について,g⁻¹ で再び共役すると元に戻ることを示してください.

example {G : Type*} [Group G] (g : G) (S : Subgroup G) :
    conjugateSubgroup g⁻¹ (conjugateSubgroup g S) = S := by
  -- `ext x` で部分群の等式を元ごとの同値にする.
  -- その後,存在記号を分解して `group` を使う.
  sorry