コンテンツにスキップ

長めの例: 共役部分群

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_memS.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