Module docstring
{"# Subgroups generated by an element
Tags
subgroup, subgroups
"}
{"# Subgroups generated by an element
subgroup, subgroups
"}
Subgroup.zpowers
definition
(g : G) : Subgroup G
/-- The subgroup generated by an element. -/
@[to_additive "The additive subgroup generated by an element."]
def zpowers (g : G) : Subgroup G where
carrier := Set.range (g ^ · : ℤ → G)
one_mem' := ⟨0, zpow_zero g⟩
mul_mem' := by rintro _ _ ⟨a, rfl⟩ ⟨b, rfl⟩; exact ⟨a + b, zpow_add ..⟩
inv_mem' := by rintro _ ⟨a, rfl⟩; exact ⟨-a, zpow_neg ..⟩
Subgroup.mem_zpowers
theorem
(g : G) : g ∈ zpowers g
@[to_additive (attr := simp)]
theorem mem_zpowers (g : G) : g ∈ zpowers g :=
⟨1, zpow_one _⟩
Subgroup.coe_zpowers
theorem
(g : G) : ↑(zpowers g) = Set.range (g ^ · : ℤ → G)
@[to_additive (attr := norm_cast)] -- TODO: simp?
theorem coe_zpowers (g : G) : ↑(zpowers g) = Set.range (g ^ · : ℤ → G) :=
rfl
Subgroup.decidableMemZPowers
instance
{a : G} : DecidablePred (· ∈ Subgroup.zpowers a)
@[to_additive] -- TODO: delete?
noncomputable instance decidableMemZPowers {a : G} : DecidablePred (· ∈ Subgroup.zpowers a) :=
Classical.decPred _
Subgroup.zpowers_eq_closure
theorem
(g : G) : zpowers g = closure { g }
@[to_additive]
theorem zpowers_eq_closure (g : G) : zpowers g = closure {g} := by
ext
exact mem_closure_singleton.symm
Subgroup.mem_zpowers_iff
theorem
{g h : G} : h ∈ zpowers g ↔ ∃ k : ℤ, g ^ k = h
@[to_additive]
theorem mem_zpowers_iff {g h : G} : h ∈ zpowers gh ∈ zpowers g ↔ ∃ k : ℤ, g ^ k = h :=
Iff.rfl
Subgroup.zpow_mem_zpowers
theorem
(g : G) (k : ℤ) : g ^ k ∈ zpowers g
@[to_additive (attr := simp)]
theorem zpow_mem_zpowers (g : G) (k : ℤ) : g ^ k ∈ zpowers g :=
mem_zpowers_iff.mpr ⟨k, rfl⟩
Subgroup.npow_mem_zpowers
theorem
(g : G) (k : ℕ) : g ^ k ∈ zpowers g
@[to_additive (attr := simp)]
theorem npow_mem_zpowers (g : G) (k : ℕ) : g ^ k ∈ zpowers g :=
zpow_natCast g k ▸ zpow_mem_zpowers g k
Subgroup.forall_zpowers
theorem
{x : G} {p : zpowers x → Prop} : (∀ g, p g) ↔ ∀ m : ℤ, p ⟨x ^ m, m, rfl⟩
@[to_additive (attr := simp 1100)]
theorem forall_zpowers {x : G} {p : zpowers x → Prop} : (∀ g, p g) ↔ ∀ m : ℤ, p ⟨x ^ m, m, rfl⟩ :=
Set.forall_subtype_range_iff
Subgroup.exists_zpowers
theorem
{x : G} {p : zpowers x → Prop} : (∃ g, p g) ↔ ∃ m : ℤ, p ⟨x ^ m, m, rfl⟩
@[to_additive (attr := simp 1100)]
theorem exists_zpowers {x : G} {p : zpowers x → Prop} : (∃ g, p g) ↔ ∃ m : ℤ, p ⟨x ^ m, m, rfl⟩ :=
Set.exists_subtype_range_iff
Subgroup.forall_mem_zpowers
theorem
{x : G} {p : G → Prop} : (∀ g ∈ zpowers x, p g) ↔ ∀ m : ℤ, p (x ^ m)
@[to_additive]
theorem forall_mem_zpowers {x : G} {p : G → Prop} : (∀ g ∈ zpowers x, p g) ↔ ∀ m : ℤ, p (x ^ m) :=
Set.forall_mem_range
Subgroup.exists_mem_zpowers
theorem
{x : G} {p : G → Prop} : (∃ g ∈ zpowers x, p g) ↔ ∃ m : ℤ, p (x ^ m)
@[to_additive]
theorem exists_mem_zpowers {x : G} {p : G → Prop} : (∃ g ∈ zpowers x, p g) ↔ ∃ m : ℤ, p (x ^ m) :=
Set.exists_range_iff
MonoidHom.map_zpowers
theorem
(f : G →* N) (x : G) : (Subgroup.zpowers x).map f = Subgroup.zpowers (f x)
@[to_additive (attr := simp)]
theorem MonoidHom.map_zpowers (f : G →* N) (x : G) :
(Subgroup.zpowers x).map f = Subgroup.zpowers (f x) := by
rw [Subgroup.zpowers_eq_closure, Subgroup.zpowers_eq_closure, f.map_closure, Set.image_singleton]
Int.mem_zmultiples_iff
theorem
{a b : ℤ} : b ∈ AddSubgroup.zmultiples a ↔ a ∣ b
theorem Int.mem_zmultiples_iff {a b : ℤ} : b ∈ AddSubgroup.zmultiples ab ∈ AddSubgroup.zmultiples a ↔ a ∣ b :=
exists_congr fun k => by rw [mul_comm, eq_comm, ← smul_eq_mul]
Int.zmultiples_one
theorem
: AddSubgroup.zmultiples (1 : ℤ) = ⊤
@[simp]
lemma Int.zmultiples_one : AddSubgroup.zmultiples (1 : ℤ) = ⊤ := by
ext z
simpa only [AddSubgroup.mem_top, iff_true] using ⟨z, zsmul_int_one z⟩
ofMul_image_zpowers_eq_zmultiples_ofMul
theorem
{x : G} : Additive.ofMul '' (Subgroup.zpowers x : Set G) = AddSubgroup.zmultiples (Additive.ofMul x)
theorem ofMul_image_zpowers_eq_zmultiples_ofMul {x : G} :
Additive.ofMulAdditive.ofMul '' (Subgroup.zpowers x : Set G) = AddSubgroup.zmultiples (Additive.ofMul x) := by
ext y
constructor
· rintro ⟨z, ⟨m, hm⟩, hz2⟩
use m
simp only at *
rwa [← ofMul_zpow, hm]
· rintro ⟨n, hn⟩
refine ⟨x ^ n, ⟨n, rfl⟩, ?_⟩
rwa [ofMul_zpow]
ofAdd_image_zmultiples_eq_zpowers_ofAdd
theorem
{x : A} : Multiplicative.ofAdd '' (AddSubgroup.zmultiples x : Set A) = Subgroup.zpowers (Multiplicative.ofAdd x)
theorem ofAdd_image_zmultiples_eq_zpowers_ofAdd {x : A} :
Multiplicative.ofAddMultiplicative.ofAdd '' (AddSubgroup.zmultiples x : Set A) =
Subgroup.zpowers (Multiplicative.ofAdd x) := by
symm
rw [Equiv.eq_image_iff_symm_image_eq]
exact ofMul_image_zpowers_eq_zmultiples_ofMul
Subgroup.zpowers_isMulCommutative
instance
(g : G) : IsMulCommutative (zpowers g)
Subgroup.zpowers_le
theorem
{g : G} {H : Subgroup G} : zpowers g ≤ H ↔ g ∈ H
@[to_additive (attr := simp)]
theorem zpowers_le {g : G} {H : Subgroup G} : zpowerszpowers g ≤ H ↔ g ∈ H := by
rw [zpowers_eq_closure, closure_le, Set.singleton_subset_iff, SetLike.mem_coe]
Subgroup.zpowers_eq_bot
theorem
{g : G} : zpowers g = ⊥ ↔ g = 1
@[to_additive (attr := simp)]
theorem zpowers_eq_bot {g : G} : zpowerszpowers g = ⊥ ↔ g = 1 := by rw [eq_bot_iff, zpowers_le, mem_bot]
Subgroup.zpowers_ne_bot
theorem
: zpowers g ≠ ⊥ ↔ g ≠ 1
@[to_additive]
theorem zpowers_ne_bot : zpowerszpowers g ≠ ⊥zpowers g ≠ ⊥ ↔ g ≠ 1 :=
zpowers_eq_bot.not
Subgroup.zpowers_one_eq_bot
theorem
: Subgroup.zpowers (1 : G) = ⊥
@[to_additive (attr := simp)]
theorem zpowers_one_eq_bot : Subgroup.zpowers (1 : G) = ⊥ :=
Subgroup.zpowers_eq_bot.mpr rfl
Subgroup.zpowers_inv
theorem
: zpowers g⁻¹ = zpowers g
@[to_additive (attr := simp)]
theorem zpowers_inv : zpowers g⁻¹ = zpowers g :=
eq_of_forall_ge_iff fun _ ↦ by simp only [zpowers_le, inv_mem_iff]
Int.zmultiples_natAbs
theorem
(a : ℤ) : AddSubgroup.zmultiples (a.natAbs : ℤ) = AddSubgroup.zmultiples a
theorem Int.zmultiples_natAbs (a : ℤ) :
AddSubgroup.zmultiples (a.natAbs : ℤ) = AddSubgroup.zmultiples a := by
simp [le_antisymm_iff, Int.mem_zmultiples_iff, Int.dvd_natAbs, Int.natAbs_dvd]
AddSubgroup.closure_singleton_int_one_eq_top
theorem
: closure ({ 1 } : Set ℤ) = ⊤
lemma AddSubgroup.closure_singleton_int_one_eq_top : closure ({1} : Set ℤ) = ⊤ := by
ext
simp [mem_closure_singleton]
AddSubgroup.zmultiples_one_eq_top
theorem
: zmultiples (1 : ℤ) = ⊤
lemma AddSubgroup.zmultiples_one_eq_top : zmultiples (1 : ℤ) = ⊤ := by
rw [zmultiples_eq_closure, closure_singleton_int_one_eq_top]