Cyclic permutations #
Main definitions #
In the following, f : equiv.perm β
.
equiv.perm.is_cycle
:f.is_cycle
when two nonfixed points ofβ
are related by repeated application off
.equiv.perm.same_cycle
:f.same_cycle x y
whenx
andy
are in the same cycle off
.
The following two definitions require that β
is a fintype
:
equiv.perm.cycle_of
:f.cycle_of x
is the cycle off
thatx
belongs to.equiv.perm.cycle_factors
:f.cycle_factors
is a list of disjoint cyclic permutations that multiply tof
.
Main results #
- This file contains several closure results:
closure_is_cycle
: The symmetric group is generated by cyclesclosure_cycle_adjacent_swap
: The symmetric group is generated by a cycle and an adjacent transpositionclosure_cycle_coprime_swap
: The symmetric group is generated by a cycle and a coprime transpositionclosure_prime_cycle_swap
: The symmetric group is generated by a prime cycle and a transposition
is_cycle
#
theorem
equiv.perm.is_cycle.two_le_card_support
{α : Type u_1}
[decidable_eq α]
[fintype α]
{f : equiv.perm α}
(h : f.is_cycle) :
theorem
equiv.perm.is_cycle_swap
{α : Type u_1}
[decidable_eq α]
{x y : α}
(hxy : x ≠ y) :
(equiv.swap x y).is_cycle
theorem
equiv.perm.is_swap.is_cycle
{α : Type u_1}
[decidable_eq α]
{f : equiv.perm α}
(hf : f.is_swap) :
f.is_cycle
def
equiv.perm.is_cycle.gpowers_equiv_support
{α : Type u_1}
[decidable_eq α]
[fintype α]
{σ : equiv.perm α}
(hσ : σ.is_cycle) :
The subgroup generated by a cycle is in bijection with its support
Equations
- hσ.gpowers_equiv_support = equiv.of_bijective (λ (τ : ↥↑(subgroup.gpowers σ)), ⟨⇑τ (classical.some hσ), _⟩) _
@[simp]
theorem
equiv.perm.is_cycle.gpowers_equiv_support_apply
{α : Type u_1}
[decidable_eq α]
[fintype α]
{σ : equiv.perm α}
(hσ : σ.is_cycle)
{n : ℕ} :
⇑(hσ.gpowers_equiv_support) ⟨σ ^ n, _⟩ = ⟨⇑(σ ^ n) (classical.some hσ), _⟩
@[simp]
theorem
equiv.perm.is_cycle.gpowers_equiv_support_symm_apply
{α : Type u_1}
[decidable_eq α]
[fintype α]
{σ : equiv.perm α}
(hσ : σ.is_cycle)
(n : ℕ) :
⇑(hσ.gpowers_equiv_support.symm) ⟨⇑(σ ^ n) (classical.some hσ), _⟩ = ⟨σ ^ n, _⟩
theorem
equiv.perm.order_of_is_cycle
{α : Type u_1}
[decidable_eq α]
[fintype α]
{σ : equiv.perm α}
(hσ : σ.is_cycle) :
theorem
equiv.perm.is_cycle_swap_mul_aux₁
{α : Type u_1}
[decidable_eq α]
(n : ℕ)
{b x : α}
{f : equiv.perm α}
(hb : (⇑(equiv.swap x (⇑f x)) * f) b ≠ b)
(h : ⇑(f ^ n) (⇑f x) = b) :
theorem
equiv.perm.is_cycle_swap_mul_aux₂
{α : Type u_1}
[decidable_eq α]
(n : ℤ)
{b x : α}
{f : equiv.perm α}
(hb : (⇑(equiv.swap x (⇑f x)) * f) b ≠ b)
(h : ⇑(f ^ n) (⇑f x) = b) :
theorem
equiv.perm.is_cycle.eq_swap_of_apply_apply_eq_self
{α : Type u_1}
[decidable_eq α]
{f : equiv.perm α}
(hf : f.is_cycle)
{x : α}
(hfx : ⇑f x ≠ x)
(hffx : ⇑f (⇑f x) = x) :
f = equiv.swap x (⇑f x)
theorem
equiv.perm.is_cycle.swap_mul
{α : Type u_1}
[decidable_eq α]
{f : equiv.perm α}
(hf : f.is_cycle)
{x : α}
(hx : ⇑f x ≠ x)
(hffx : ⇑f (⇑f x) ≠ x) :
((equiv.swap x (⇑f x)) * f).is_cycle
theorem
equiv.perm.is_cycle.sign
{α : Type u_1}
[decidable_eq α]
[fintype α]
{f : equiv.perm α}
(hf : f.is_cycle) :
theorem
equiv.perm.is_cycle_of_is_cycle_pow
{α : Type u_1}
[decidable_eq α]
[fintype α]
{σ : equiv.perm α}
{n : ℤ}
(h1 : (σ ^ n).is_cycle)
(h2 : σ.support ≤ (σ ^ n).support) :
σ.is_cycle
theorem
equiv.perm.is_cycle.extend_domain
{β : Type u_2}
{α : Type u_1}
{p : β → Prop}
[decidable_pred p]
(f : α ≃ subtype p)
{g : equiv.perm α}
(h : g.is_cycle) :
(g.extend_domain f).is_cycle
same_cycle
#
The equivalence relation indicating that two points are in the same cycle of a permutation.
theorem
equiv.perm.same_cycle.symm
{β : Type u_2}
(f : equiv.perm β)
{x y : β} :
f.same_cycle x y → f.same_cycle y x
theorem
equiv.perm.same_cycle.trans
{β : Type u_2}
(f : equiv.perm β)
{x y z : β} :
f.same_cycle x y → f.same_cycle y z → f.same_cycle x z
theorem
equiv.perm.is_cycle.same_cycle
{β : Type u_2}
{f : equiv.perm β}
(hf : f.is_cycle)
{x y : β}
(hx : ⇑f x ≠ x)
(hy : ⇑f y ≠ y) :
f.same_cycle x y
@[protected, instance]
def
equiv.perm.same_cycle.decidable_rel
{α : Type u_1}
[decidable_eq α]
[fintype α]
(f : equiv.perm α) :
Equations
- equiv.perm.same_cycle.decidable_rel f = λ (x y : α), decidable_of_iff (∃ (n : ℕ) (H : n ∈ list.range (fintype.card (equiv.perm α))), ⇑(f ^ n) x = y) _
theorem
equiv.perm.same_cycle_apply
{β : Type u_2}
{f : equiv.perm β}
{x y : β} :
f.same_cycle x (⇑f y) ↔ f.same_cycle x y
theorem
equiv.perm.same_cycle_inv
{β : Type u_2}
(f : equiv.perm β)
{x y : β} :
f⁻¹.same_cycle x y ↔ f.same_cycle x y
theorem
equiv.perm.same_cycle_inv_apply
{β : Type u_2}
{f : equiv.perm β}
{x y : β} :
f.same_cycle x (⇑f⁻¹ y) ↔ f.same_cycle x y
cycle_of
#
f.cycle_of x
is the cycle of the permutation f
to which x
belongs.
Equations
- f.cycle_of x = ⇑equiv.perm.of_subtype (f.subtype_perm _)
theorem
equiv.perm.cycle_of_apply
{α : Type u_1}
[decidable_eq α]
[fintype α]
(f : equiv.perm α)
(x y : α) :
theorem
equiv.perm.cycle_of_inv
{α : Type u_1}
[decidable_eq α]
[fintype α]
(f : equiv.perm α)
(x : α) :
@[simp]
theorem
equiv.perm.cycle_of_pow_apply_self
{α : Type u_1}
[decidable_eq α]
[fintype α]
(f : equiv.perm α)
(x : α)
(n : ℕ) :
@[simp]
theorem
equiv.perm.cycle_of_gpow_apply_self
{α : Type u_1}
[decidable_eq α]
[fintype α]
(f : equiv.perm α)
(x : α)
(n : ℤ) :
theorem
equiv.perm.same_cycle.cycle_of_apply
{α : Type u_1}
[decidable_eq α]
[fintype α]
{f : equiv.perm α}
{x y : α}
(h : f.same_cycle x y) :
theorem
equiv.perm.cycle_of_apply_of_not_same_cycle
{α : Type u_1}
[decidable_eq α]
[fintype α]
{f : equiv.perm α}
{x y : α}
(h : ¬f.same_cycle x y) :
@[simp]
theorem
equiv.perm.cycle_of_apply_self
{α : Type u_1}
[decidable_eq α]
[fintype α]
(f : equiv.perm α)
(x : α) :
theorem
equiv.perm.is_cycle.cycle_of_eq
{α : Type u_1}
[decidable_eq α]
[fintype α]
{f : equiv.perm α}
(hf : f.is_cycle)
{x : α}
(hx : ⇑f x ≠ x) :
@[simp]
theorem
equiv.perm.cycle_of_eq_one_iff
{α : Type u_1}
[decidable_eq α]
[fintype α]
(f : equiv.perm α)
{x : α} :
theorem
equiv.perm.is_cycle.cycle_of
{α : Type u_1}
[decidable_eq α]
[fintype α]
{f : equiv.perm α}
(hf : f.is_cycle)
{x : α} :
theorem
equiv.perm.is_cycle_cycle_of
{α : Type u_1}
[decidable_eq α]
[fintype α]
(f : equiv.perm α)
{x : α}
(hx : ⇑f x ≠ x) :
cycle_factors
#
def
equiv.perm.cycle_factors_aux
{α : Type u_1}
[decidable_eq α]
[fintype α]
(l : list α)
(f : equiv.perm α) :
(∀ {x : α}, ⇑f x ≠ x → x ∈ l) → {l // l.prod = f ∧ (∀ (g : equiv.perm α), g ∈ l → g.is_cycle) ∧ list.pairwise equiv.perm.disjoint l}
Given a list l : list α
and a permutation f : perm α
whose nonfixed points are all in l
,
recursively factors f
into cycles.
Equations
- equiv.perm.cycle_factors_aux (x :: l) f h = dite (⇑f x = x) (λ (hx : ⇑f x = x), equiv.perm.cycle_factors_aux l f _) (λ (hx : ¬⇑f x = x), equiv.perm.cycle_factors_aux._match_1 x f hx (equiv.perm.cycle_factors_aux l ((f.cycle_of x)⁻¹ * f) _))
- equiv.perm.cycle_factors_aux list.nil f h = ⟨list.nil (equiv.perm α), _⟩
- equiv.perm.cycle_factors_aux._match_1 x f hx ⟨m, _⟩ = ⟨f.cycle_of x :: m, _⟩
def
equiv.perm.cycle_factors
{α : Type u_1}
[decidable_eq α]
[fintype α]
[linear_order α]
(f : equiv.perm α) :
{l // l.prod = f ∧ (∀ (g : equiv.perm α), g ∈ l → g.is_cycle) ∧ list.pairwise equiv.perm.disjoint l}
Factors a permutation f
into a list of disjoint cyclic permutations that multiply to f
.
Equations
def
equiv.perm.trunc_cycle_factors
{α : Type u_1}
[decidable_eq α]
[fintype α]
(f : equiv.perm α) :
trunc {l // l.prod = f ∧ (∀ (g : equiv.perm α), g ∈ l → g.is_cycle) ∧ list.pairwise equiv.perm.disjoint l}
Factors a permutation f
into a list of disjoint cyclic permutations that multiply to f
,
without a linear order.
Equations
- f.trunc_cycle_factors = quotient.rec_on_subsingleton finset.univ.val (λ (l : list α) (h : ∀ (x : α), ⇑f x ≠ x → x ∈ ⟦l⟧), trunc.mk (equiv.perm.cycle_factors_aux l f h)) _
theorem
equiv.perm.cycle_induction_on
{β : Type u_2}
[fintype β]
(P : equiv.perm β → Prop)
(σ : equiv.perm β)
(base_one : P 1)
(base_cycles : ∀ (σ : equiv.perm β), σ.is_cycle → P σ)
(induction_disjoint : ∀ (σ τ : equiv.perm β), σ.disjoint τ → σ.is_cycle → P σ → P τ → P (σ * τ)) :
P σ
theorem
equiv.perm.closure_is_cycle
{β : Type u_2}
[fintype β] :
subgroup.closure {σ : equiv.perm β | σ.is_cycle} = ⊤
theorem
equiv.perm.closure_cycle_adjacent_swap
{α : Type u_1}
[decidable_eq α]
[fintype α]
{σ : equiv.perm α}
(h1 : σ.is_cycle)
(h2 : σ.support = ⊤)
(x : α) :
subgroup.closure {σ, equiv.swap x (⇑σ x)} = ⊤
theorem
equiv.perm.closure_cycle_coprime_swap
{α : Type u_1}
[decidable_eq α]
[fintype α]
{n : ℕ}
{σ : equiv.perm α}
(h0 : n.coprime (fintype.card α))
(h1 : σ.is_cycle)
(h2 : σ.support = finset.univ)
(x : α) :
subgroup.closure {σ, equiv.swap x (⇑(σ ^ n) x)} = ⊤
theorem
equiv.perm.closure_prime_cycle_swap
{α : Type u_1}
[decidable_eq α]
[fintype α]
{σ τ : equiv.perm α}
(h0 : nat.prime (fintype.card α))
(h1 : σ.is_cycle)
(h2 : σ.support = finset.univ)
(h3 : τ.is_swap) :
subgroup.closure {σ, τ} = ⊤
theorem
equiv.perm.is_cycle.is_conj
{α : Type u_1}
[decidable_eq α]
[fintype α]
{σ τ : equiv.perm α}
(hσ : σ.is_cycle)
(hτ : τ.is_cycle)
(h : σ.support.card = τ.support.card) :
is_conj σ τ
theorem
equiv.perm.is_cycle.is_conj_iff
{α : Type u_1}
[decidable_eq α]
[fintype α]
{σ τ : equiv.perm α}
(hσ : σ.is_cycle)
(hτ : τ.is_cycle) :
@[simp]
theorem
equiv.perm.support_conj
{α : Type u_1}
[decidable_eq α]
[fintype α]
{σ τ : equiv.perm α} :
((σ * τ) * σ⁻¹).support = finset.map (equiv.to_embedding σ) τ.support
theorem
equiv.perm.card_support_conj
{α : Type u_1}
[decidable_eq α]
[fintype α]
{σ τ : equiv.perm α} :
Fixed points #
theorem
equiv.perm.fixed_point_card_lt_of_ne_one
{α : Type u_1}
[decidable_eq α]
[fintype α]
{σ : equiv.perm α}
(h : σ ≠ 1) :
(finset.filter (λ (x : α), ⇑σ x = x) finset.univ).card < fintype.card α - 1