[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
p : α → Prop
x y z : α
h : x = y
f : Perm α
⊢ SameCycle f x y
[PROOFSTEP]
rw [h]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
p : α → Prop
x y z : α
x✝ : SameCycle f x y
i : ℤ
hi : ↑(f ^ i) x = y
⊢ ↑(f ^ (-i)) y = x
[PROOFSTEP]
rw [zpow_neg, ← hi, inv_apply_self]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
p : α → Prop
x y z : α
x✝¹ : SameCycle f x y
x✝ : SameCycle f y z
i : ℤ
hi : ↑(f ^ i) x = y
j : ℤ
hj : ↑(f ^ j) y = z
⊢ ↑(f ^ (j + i)) x = z
[PROOFSTEP]
rw [zpow_add, mul_apply, hi, hj]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
p : α → Prop
x y z : α
⊢ SameCycle 1 x y ↔ x = y
[PROOFSTEP]
simp [SameCycle]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
p : α → Prop
x y z : α
⊢ (∃ b, ↑(f⁻¹ ^ ↑(Equiv.neg ℤ).symm b) x = y) ↔ SameCycle f x y
[PROOFSTEP]
simp [SameCycle]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
p : α → Prop
x y z : α
i : ℤ
⊢ ↑((g * f * g⁻¹) ^ i) x = y ↔ ↑(f ^ i) (↑g⁻¹ x) = ↑g⁻¹ y
[PROOFSTEP]
simp [conj_zpow, eq_inv_iff_eq]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
p : α → Prop
x y z : α
⊢ SameCycle f x y → SameCycle (g * f * g⁻¹) (↑g x) (↑g y)
[PROOFSTEP]
simp [sameCycle_conj]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
p : α → Prop
x y z : α
x✝ : SameCycle f x y
i : ℤ
hi : ↑(f ^ i) x = y
⊢ ↑f x = x ↔ ↑f y = y
[PROOFSTEP]
rw [← hi, ← mul_apply, ← zpow_one_add, add_comm, zpow_add_one, mul_apply, (f ^ i).injective.eq_iff]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
p : α → Prop
x y z : α
⊢ (∃ b, ↑(f ^ ↑(Equiv.addRight 1).symm b) (↑f x) = y) ↔ SameCycle f x y
[PROOFSTEP]
simp [zpow_sub, SameCycle, Int.add_neg_one, Function.comp]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
p : α → Prop
x y z : α
⊢ SameCycle f x (↑f y) ↔ SameCycle f x y
[PROOFSTEP]
rw [sameCycle_comm, sameCycle_apply_left, sameCycle_comm]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
p : α → Prop
x y z : α
⊢ SameCycle f (↑f⁻¹ x) y ↔ SameCycle f x y
[PROOFSTEP]
rw [← sameCycle_apply_left, apply_inv_self]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
p : α → Prop
x y z : α
⊢ SameCycle f x (↑f⁻¹ y) ↔ SameCycle f x y
[PROOFSTEP]
rw [← sameCycle_apply_right, apply_inv_self]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
p : α → Prop
x y z : α
n : ℤ
⊢ (∃ b, ↑(f ^ ↑(Equiv.addRight n).symm b) (↑(f ^ n) x) = y) ↔ SameCycle f x y
[PROOFSTEP]
simp [SameCycle, zpow_add]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
p : α → Prop
x y z : α
n : ℤ
⊢ SameCycle f x (↑(f ^ n) y) ↔ SameCycle f x y
[PROOFSTEP]
rw [sameCycle_comm, sameCycle_zpow_left, sameCycle_comm]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
p : α → Prop
x y z : α
n : ℕ
⊢ SameCycle f (↑(f ^ n) x) y ↔ SameCycle f x y
[PROOFSTEP]
rw [← zpow_ofNat, sameCycle_zpow_left]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
p : α → Prop
x y z : α
n : ℕ
⊢ SameCycle f x (↑(f ^ n) y) ↔ SameCycle f x y
[PROOFSTEP]
rw [← zpow_ofNat, sameCycle_zpow_right]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
p : α → Prop
x y z : α
n : ℕ
x✝ : SameCycle (f ^ n) x y
m : ℤ
h : ↑((f ^ n) ^ m) x = y
⊢ ↑(f ^ (↑n * m)) x = y
[PROOFSTEP]
simp [zpow_mul, h]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
p : α → Prop
x y z : α
n : ℤ
x✝ : SameCycle (f ^ n) x y
m : ℤ
h : ↑((f ^ n) ^ m) x = y
⊢ ↑(f ^ (n * m)) x = y
[PROOFSTEP]
simp [zpow_mul, h]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
p : α → Prop
x✝ y✝ z : α
h : ∀ (x : α), p x ↔ p (↑f x)
x y : { x // p x }
n : ℤ
⊢ ↑(subtypePerm f h ^ n) x = y ↔ ↑(f ^ n) ↑x = ↑y
[PROOFSTEP]
simp [Subtype.ext_iff]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
p✝ : α → Prop
x y z : α
p : β → Prop
inst✝ : DecidablePred p
f : α ≃ Subtype p
n : ℤ
⊢ ↑(extendDomain g f ^ n) ↑(↑f x) = ↑(↑f y) ↔ ↑(g ^ n) x = y
[PROOFSTEP]
rw [← extendDomain_zpow, extendDomain_apply_image, Subtype.coe_inj, f.injective.eq_iff]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
p : α → Prop
x y z : α
inst✝ : Finite α
⊢ SameCycle f x y → ∃ i, i < orderOf f ∧ ↑(f ^ i) x = y
[PROOFSTEP]
classical
rintro ⟨k, rfl⟩
use(k % orderOf f).natAbs
have h₀ := Int.coe_nat_pos.mpr (orderOf_pos f)
have h₁ := Int.emod_nonneg k h₀.ne'
rw [← zpow_ofNat, Int.natAbs_of_nonneg h₁, ← zpow_eq_mod_orderOf]
refine' ⟨_, by rfl⟩
rw [← Int.ofNat_lt, Int.natAbs_of_nonneg h₁]
exact Int.emod_lt_of_pos _ h₀
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
p : α → Prop
x y z : α
inst✝ : Finite α
⊢ SameCycle f x y → ∃ i, i < orderOf f ∧ ↑(f ^ i) x = y
[PROOFSTEP]
rintro ⟨k, rfl⟩
[GOAL]
case intro
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
p : α → Prop
x z : α
inst✝ : Finite α
k : ℤ
⊢ ∃ i, i < orderOf f ∧ ↑(f ^ i) x = ↑(f ^ k) x
[PROOFSTEP]
use(k % orderOf f).natAbs
[GOAL]
case h
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
p : α → Prop
x z : α
inst✝ : Finite α
k : ℤ
⊢ Int.natAbs (k % ↑(orderOf f)) < orderOf f ∧ ↑(f ^ Int.natAbs (k % ↑(orderOf f))) x = ↑(f ^ k) x
[PROOFSTEP]
have h₀ := Int.coe_nat_pos.mpr (orderOf_pos f)
[GOAL]
case h
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
p : α → Prop
x z : α
inst✝ : Finite α
k : ℤ
h₀ : 0 < ↑(orderOf f)
⊢ Int.natAbs (k % ↑(orderOf f)) < orderOf f ∧ ↑(f ^ Int.natAbs (k % ↑(orderOf f))) x = ↑(f ^ k) x
[PROOFSTEP]
have h₁ := Int.emod_nonneg k h₀.ne'
[GOAL]
case h
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
p : α → Prop
x z : α
inst✝ : Finite α
k : ℤ
h₀ : 0 < ↑(orderOf f)
h₁ : 0 ≤ k % ↑(orderOf f)
⊢ Int.natAbs (k % ↑(orderOf f)) < orderOf f ∧ ↑(f ^ Int.natAbs (k % ↑(orderOf f))) x = ↑(f ^ k) x
[PROOFSTEP]
rw [← zpow_ofNat, Int.natAbs_of_nonneg h₁, ← zpow_eq_mod_orderOf]
[GOAL]
case h
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
p : α → Prop
x z : α
inst✝ : Finite α
k : ℤ
h₀ : 0 < ↑(orderOf f)
h₁ : 0 ≤ k % ↑(orderOf f)
⊢ Int.natAbs (k % ↑(orderOf f)) < orderOf f ∧ ↑(f ^ k) x = ↑(f ^ k) x
[PROOFSTEP]
refine' ⟨_, by rfl⟩
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
p : α → Prop
x z : α
inst✝ : Finite α
k : ℤ
h₀ : 0 < ↑(orderOf f)
h₁ : 0 ≤ k % ↑(orderOf f)
⊢ ↑(f ^ k) x = ↑(f ^ k) x
[PROOFSTEP]
rfl
[GOAL]
case h
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
p : α → Prop
x z : α
inst✝ : Finite α
k : ℤ
h₀ : 0 < ↑(orderOf f)
h₁ : 0 ≤ k % ↑(orderOf f)
⊢ Int.natAbs (k % ↑(orderOf f)) < orderOf f
[PROOFSTEP]
rw [← Int.ofNat_lt, Int.natAbs_of_nonneg h₁]
[GOAL]
case h
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
p : α → Prop
x z : α
inst✝ : Finite α
k : ℤ
h₀ : 0 < ↑(orderOf f)
h₁ : 0 ≤ k % ↑(orderOf f)
⊢ k % ↑(orderOf f) < ↑(orderOf f)
[PROOFSTEP]
exact Int.emod_lt_of_pos _ h₀
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
p : α → Prop
x y z : α
inst✝ : Finite α
h : SameCycle f x y
⊢ ∃ i x_1 x_2, ↑(f ^ i) x = y
[PROOFSTEP]
classical
obtain ⟨_ | i, hi, rfl⟩ := h.exists_pow_eq'
· refine' ⟨orderOf f, orderOf_pos f, le_rfl, _⟩
  rw [pow_orderOf_eq_one, pow_zero]
· exact ⟨i.succ, i.zero_lt_succ, hi.le, by rfl⟩
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
p : α → Prop
x y z : α
inst✝ : Finite α
h : SameCycle f x y
⊢ ∃ i x_1 x_2, ↑(f ^ i) x = y
[PROOFSTEP]
obtain ⟨_ | i, hi, rfl⟩ := h.exists_pow_eq'
[GOAL]
case intro.zero.intro
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
p : α → Prop
x z : α
inst✝ : Finite α
hi : Nat.zero < orderOf f
h : SameCycle f x (↑(f ^ Nat.zero) x)
⊢ ∃ i x_1 x_2, ↑(f ^ i) x = ↑(f ^ Nat.zero) x
[PROOFSTEP]
refine' ⟨orderOf f, orderOf_pos f, le_rfl, _⟩
[GOAL]
case intro.zero.intro
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
p : α → Prop
x z : α
inst✝ : Finite α
hi : Nat.zero < orderOf f
h : SameCycle f x (↑(f ^ Nat.zero) x)
⊢ ↑(f ^ orderOf f) x = ↑(f ^ Nat.zero) x
[PROOFSTEP]
rw [pow_orderOf_eq_one, pow_zero]
[GOAL]
case intro.succ.intro
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
p : α → Prop
x z : α
inst✝ : Finite α
i : ℕ
hi : Nat.succ i < orderOf f
h : SameCycle f x (↑(f ^ Nat.succ i) x)
⊢ ∃ i_1 x_1 x_2, ↑(f ^ i_1) x = ↑(f ^ Nat.succ i) x
[PROOFSTEP]
exact ⟨i.succ, i.zero_lt_succ, hi.le, by rfl⟩
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
p : α → Prop
x z : α
inst✝ : Finite α
i : ℕ
hi : Nat.succ i < orderOf f
h : SameCycle f x (↑(f ^ Nat.succ i) x)
⊢ ↑(f ^ Nat.succ i) x = ↑(f ^ Nat.succ i) x
[PROOFSTEP]
rfl
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
p : α → Prop
x✝¹ y✝ z : α
inst✝¹ : Fintype α
inst✝ : DecidableEq α
f : Perm α
x y : α
x✝ : SameCycle f x y
i : ℤ
hi : ↑(f ^ i) x = y
⊢ ↑(Int.natAbs (i % ↑(orderOf f))) < ↑(Fintype.card (Perm α))
[PROOFSTEP]
rw [Int.natAbs_of_nonneg (Int.emod_nonneg _ <| Int.coe_nat_ne_zero.2 (orderOf_pos _).ne')]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
p : α → Prop
x✝¹ y✝ z : α
inst✝¹ : Fintype α
inst✝ : DecidableEq α
f : Perm α
x y : α
x✝ : SameCycle f x y
i : ℤ
hi : ↑(f ^ i) x = y
⊢ i % ↑(orderOf f) < ↑(Fintype.card (Perm α))
[PROOFSTEP]
refine' (Int.emod_lt _ <| Int.coe_nat_ne_zero_iff_pos.2 <| orderOf_pos _).trans_le _
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
p : α → Prop
x✝¹ y✝ z : α
inst✝¹ : Fintype α
inst✝ : DecidableEq α
f : Perm α
x y : α
x✝ : SameCycle f x y
i : ℤ
hi : ↑(f ^ i) x = y
⊢ |↑(orderOf f)| ≤ ↑(Fintype.card (Perm α))
[PROOFSTEP]
simp [orderOf_le_card_univ]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
p : α → Prop
x✝¹ y✝ z : α
inst✝¹ : Fintype α
inst✝ : DecidableEq α
f : Perm α
x y : α
x✝ : SameCycle f x y
i : ℤ
hi : ↑(f ^ i) x = y
⊢ ↑(f ^ Int.natAbs (i % ↑(orderOf f))) x = y
[PROOFSTEP]
rw [← zpow_ofNat, Int.natAbs_of_nonneg (Int.emod_nonneg _ <| Int.coe_nat_ne_zero_iff_pos.2 <| orderOf_pos _), ←
  zpow_eq_mod_orderOf, hi]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x y : α
h : IsCycle f
hf : f = 1
⊢ False
[PROOFSTEP]
simp [hf, IsCycle] at h 
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g✝ : Perm α
x y : α
hf : IsCycle f
hx : ↑f x ≠ x
hy : ↑f y ≠ y
g : α
hg : ↑f g ≠ g ∧ ∀ ⦃y : α⦄, ↑f y ≠ y → SameCycle f g y
a : ℤ
ha : ↑(f ^ a) g = x
b : ℤ
hb : ↑(f ^ b) g = y
⊢ ↑(f ^ (b - a)) x = y
[PROOFSTEP]
rw [← ha, ← mul_apply, ← zpow_add, sub_add_cancel, hb]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x y : α
⊢ IsCycle f → IsCycle (g * f * g⁻¹)
[PROOFSTEP]
rintro ⟨x, hx, h⟩
[GOAL]
case intro.intro
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x✝ y x : α
hx : ↑f x ≠ x
h : ∀ ⦃y : α⦄, ↑f y ≠ y → SameCycle f x y
⊢ IsCycle (g * f * g⁻¹)
[PROOFSTEP]
refine' ⟨g x, by simp [coe_mul, inv_apply_self, hx], fun y hy => _⟩
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x✝ y x : α
hx : ↑f x ≠ x
h : ∀ ⦃y : α⦄, ↑f y ≠ y → SameCycle f x y
⊢ ↑(g * f * g⁻¹) (↑g x) ≠ ↑g x
[PROOFSTEP]
simp [coe_mul, inv_apply_self, hx]
[GOAL]
case intro.intro
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x✝ y✝ x : α
hx : ↑f x ≠ x
h : ∀ ⦃y : α⦄, ↑f y ≠ y → SameCycle f x y
y : α
hy : ↑(g * f * g⁻¹) y ≠ y
⊢ SameCycle (g * f * g⁻¹) (↑g x) y
[PROOFSTEP]
rw [← apply_inv_self g y]
[GOAL]
case intro.intro
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x✝ y✝ x : α
hx : ↑f x ≠ x
h : ∀ ⦃y : α⦄, ↑f y ≠ y → SameCycle f x y
y : α
hy : ↑(g * f * g⁻¹) y ≠ y
⊢ SameCycle (g * f * g⁻¹) (↑g x) (↑g (↑g⁻¹ y))
[PROOFSTEP]
exact (h <| eq_inv_iff_eq.not.2 hy).conj
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x y : α
p : β → Prop
inst✝ : DecidablePred p
f : α ≃ Subtype p
⊢ IsCycle g → IsCycle (extendDomain g f)
[PROOFSTEP]
rintro ⟨a, ha, ha'⟩
[GOAL]
case intro.intro
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x y : α
p : β → Prop
inst✝ : DecidablePred p
f : α ≃ Subtype p
a : α
ha : ↑g a ≠ a
ha' : ∀ ⦃y : α⦄, ↑g y ≠ y → SameCycle g a y
⊢ IsCycle (extendDomain g f)
[PROOFSTEP]
refine' ⟨f a, _, fun b hb => _⟩
[GOAL]
case intro.intro.refine'_1
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x y : α
p : β → Prop
inst✝ : DecidablePred p
f : α ≃ Subtype p
a : α
ha : ↑g a ≠ a
ha' : ∀ ⦃y : α⦄, ↑g y ≠ y → SameCycle g a y
⊢ ↑(extendDomain g f) ↑(↑f a) ≠ ↑(↑f a)
[PROOFSTEP]
rw [extendDomain_apply_image]
[GOAL]
case intro.intro.refine'_1
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x y : α
p : β → Prop
inst✝ : DecidablePred p
f : α ≃ Subtype p
a : α
ha : ↑g a ≠ a
ha' : ∀ ⦃y : α⦄, ↑g y ≠ y → SameCycle g a y
⊢ ↑(↑f (↑g a)) ≠ ↑(↑f a)
[PROOFSTEP]
exact Subtype.coe_injective.ne (f.injective.ne ha)
[GOAL]
case intro.intro.refine'_2
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x y : α
p : β → Prop
inst✝ : DecidablePred p
f : α ≃ Subtype p
a : α
ha : ↑g a ≠ a
ha' : ∀ ⦃y : α⦄, ↑g y ≠ y → SameCycle g a y
b : β
hb : ↑(extendDomain g f) b ≠ b
⊢ SameCycle (extendDomain g f) (↑(↑f a)) b
[PROOFSTEP]
have h : b = f (f.symm ⟨b, of_not_not <| hb ∘ extendDomain_apply_not_subtype _ _⟩) := by
  rw [apply_symm_apply, Subtype.coe_mk]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x y : α
p : β → Prop
inst✝ : DecidablePred p
f : α ≃ Subtype p
a : α
ha : ↑g a ≠ a
ha' : ∀ ⦃y : α⦄, ↑g y ≠ y → SameCycle g a y
b : β
hb : ↑(extendDomain g f) b ≠ b
⊢ b = ↑(↑f (↑f.symm { val := b, property := (_ : p b) }))
[PROOFSTEP]
rw [apply_symm_apply, Subtype.coe_mk]
[GOAL]
case intro.intro.refine'_2
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x y : α
p : β → Prop
inst✝ : DecidablePred p
f : α ≃ Subtype p
a : α
ha : ↑g a ≠ a
ha' : ∀ ⦃y : α⦄, ↑g y ≠ y → SameCycle g a y
b : β
hb : ↑(extendDomain g f) b ≠ b
h : b = ↑(↑f (↑f.symm { val := b, property := (_ : p b) }))
⊢ SameCycle (extendDomain g f) (↑(↑f a)) b
[PROOFSTEP]
rw [h] at hb ⊢
[GOAL]
case intro.intro.refine'_2
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x y : α
p : β → Prop
inst✝ : DecidablePred p
f : α ≃ Subtype p
a : α
ha : ↑g a ≠ a
ha' : ∀ ⦃y : α⦄, ↑g y ≠ y → SameCycle g a y
b : β
hb✝ : ↑(extendDomain g f) b ≠ b
hb :
  ↑(extendDomain g f) ↑(↑f (↑f.symm { val := b, property := (_ : p b) })) ≠
    ↑(↑f (↑f.symm { val := b, property := (_ : p b) }))
h : b = ↑(↑f (↑f.symm { val := b, property := (_ : p b) }))
⊢ SameCycle (extendDomain g f) ↑(↑f a) ↑(↑f (↑f.symm { val := b, property := (_ : p b) }))
[PROOFSTEP]
simp only [extendDomain_apply_image, Subtype.coe_injective.ne_iff, f.injective.ne_iff] at hb 
[GOAL]
case intro.intro.refine'_2
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x y : α
p : β → Prop
inst✝ : DecidablePred p
f : α ≃ Subtype p
a : α
ha : ↑g a ≠ a
ha' : ∀ ⦃y : α⦄, ↑g y ≠ y → SameCycle g a y
b : β
hb✝ : ↑(extendDomain g f) b ≠ b
h : b = ↑(↑f (↑f.symm { val := b, property := (_ : p b) }))
hb : ↑g (↑f.symm { val := b, property := (_ : p b) }) ≠ ↑f.symm { val := b, property := (_ : p b) }
⊢ SameCycle (extendDomain g f) ↑(↑f a) ↑(↑f (↑f.symm { val := b, property := (_ : p b) }))
[PROOFSTEP]
exact (ha' hb).extendDomain
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x y✝ : α
hx : ↑f x ≠ x
hf : IsCycle f
y : α
x✝ : SameCycle f x y
hy : ↑f y = y
i : ℤ
hi : ↑(f ^ i) x = y
⊢ ↑f x = x
[PROOFSTEP]
rw [← zpow_apply_eq_self_of_apply_eq_self hy i, (f ^ i).injective.eq_iff] at hi 
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x y✝ : α
hx : ↑f x ≠ x
hf : IsCycle f
y : α
x✝ : SameCycle f x y
hy : ↑f y = y
i : ℤ
hi : x = y
⊢ ↑f x = x
[PROOFSTEP]
rw [hi, hy]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x y : α
inst✝ : Finite α
hf : IsCycle f
hx : ↑f x ≠ x
hy : ↑f y ≠ y
⊢ ∃ i, ↑(f ^ i) x = y
[PROOFSTEP]
let ⟨n, hn⟩ := hf.exists_zpow_eq hx hy
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x y : α
inst✝ : Finite α
hf : IsCycle f
hx : ↑f x ≠ x
hy : ↑f y ≠ y
n : ℤ
hn : ↑(f ^ n) x = y
⊢ ∃ i, ↑(f ^ i) x = y
[PROOFSTEP]
classical exact
  ⟨(n % orderOf f).toNat, by
    {
    have := n.emod_nonneg (Int.coe_nat_ne_zero.mpr (ne_of_gt (orderOf_pos f)))
    rwa [← zpow_ofNat, Int.toNat_of_nonneg this, ← zpow_eq_mod_orderOf]
  }⟩
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x y : α
inst✝ : Finite α
hf : IsCycle f
hx : ↑f x ≠ x
hy : ↑f y ≠ y
n : ℤ
hn : ↑(f ^ n) x = y
⊢ ∃ i, ↑(f ^ i) x = y
[PROOFSTEP]
exact
  ⟨(n % orderOf f).toNat, by
    {
    have := n.emod_nonneg (Int.coe_nat_ne_zero.mpr (ne_of_gt (orderOf_pos f)))
    rwa [← zpow_ofNat, Int.toNat_of_nonneg this, ← zpow_eq_mod_orderOf]
  }⟩
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x y : α
inst✝ : Finite α
hf : IsCycle f
hx : ↑f x ≠ x
hy : ↑f y ≠ y
n : ℤ
hn : ↑(f ^ n) x = y
⊢ ↑(f ^ Int.toNat (n % ↑(orderOf f))) x = y
[PROOFSTEP]
{ have := n.emod_nonneg (Int.coe_nat_ne_zero.mpr (ne_of_gt (orderOf_pos f)))
  rwa [← zpow_ofNat, Int.toNat_of_nonneg this, ← zpow_eq_mod_orderOf]
}
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x y : α
inst✝ : Finite α
hf : IsCycle f
hx : ↑f x ≠ x
hy : ↑f y ≠ y
n : ℤ
hn : ↑(f ^ n) x = y
⊢ ↑(f ^ Int.toNat (n % ↑(orderOf f))) x = y
[PROOFSTEP]
have := n.emod_nonneg (Int.coe_nat_ne_zero.mpr (ne_of_gt (orderOf_pos f)))
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x y : α
inst✝ : Finite α
hf : IsCycle f
hx : ↑f x ≠ x
hy : ↑f y ≠ y
n : ℤ
hn : ↑(f ^ n) x = y
this : 0 ≤ n % ↑(orderOf f)
⊢ ↑(f ^ Int.toNat (n % ↑(orderOf f))) x = y
[PROOFSTEP]
rwa [← zpow_ofNat, Int.toNat_of_nonneg this, ← zpow_eq_mod_orderOf]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x y : α
inst✝ : DecidableEq α
hxy : x ≠ y
⊢ ↑(swap x y) y ≠ y
[PROOFSTEP]
rwa [swap_apply_right]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x y : α
inst✝ : DecidableEq α
hxy : x ≠ y
a : α
ha : (if a = x then y else if a = y then x else a) ≠ a
hya : ¬y = a
⊢ ↑(swap x y ^ 1) y = a
[PROOFSTEP]
rw [zpow_one, swap_apply_def]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x y : α
inst✝ : DecidableEq α
hxy : x ≠ y
a : α
ha : (if a = x then y else if a = y then x else a) ≠ a
hya : ¬y = a
⊢ (if y = x then y else if y = y then x else y) = a
[PROOFSTEP]
split_ifs at *
[GOAL]
case pos
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x y : α
inst✝ : DecidableEq α
hxy : x ≠ y
a : α
hya : ¬y = a
h✝¹ : y = x
h✝ : a = x
ha : y ≠ a
⊢ y = a
[PROOFSTEP]
tauto
[GOAL]
case pos
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x y : α
inst✝ : DecidableEq α
hxy : x ≠ y
a : α
hya : ¬y = a
h✝² : y = x
h✝¹ : ¬a = x
h✝ : a = y
ha : x ≠ a
⊢ y = a
[PROOFSTEP]
tauto
[GOAL]
case neg
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x y : α
inst✝ : DecidableEq α
hxy : x ≠ y
a : α
hya : ¬y = a
h✝² : y = x
h✝¹ : ¬a = x
h✝ : ¬a = y
ha : a ≠ a
⊢ y = a
[PROOFSTEP]
tauto
[GOAL]
case pos
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x y : α
inst✝ : DecidableEq α
hxy : x ≠ y
a : α
hya : ¬y = a
h✝² : ¬y = x
h✝¹ : y = y
h✝ : a = x
ha : y ≠ a
⊢ x = a
[PROOFSTEP]
tauto
[GOAL]
case pos
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x y : α
inst✝ : DecidableEq α
hxy : x ≠ y
a : α
hya : ¬y = a
h✝³ : ¬y = x
h✝² : y = y
h✝¹ : ¬a = x
h✝ : a = y
ha : x ≠ a
⊢ x = a
[PROOFSTEP]
tauto
[GOAL]
case neg
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x y : α
inst✝ : DecidableEq α
hxy : x ≠ y
a : α
hya : ¬y = a
h✝³ : ¬y = x
h✝² : y = y
h✝¹ : ¬a = x
h✝ : ¬a = y
ha : a ≠ a
⊢ x = a
[PROOFSTEP]
tauto
[GOAL]
case pos
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x y : α
inst✝ : DecidableEq α
hxy : x ≠ y
a : α
hya : ¬y = a
h✝² : ¬y = x
h✝¹ : ¬y = y
h✝ : a = x
ha : y ≠ a
⊢ y = a
[PROOFSTEP]
tauto
[GOAL]
case pos
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x y : α
inst✝ : DecidableEq α
hxy : x ≠ y
a : α
hya : ¬y = a
h✝³ : ¬y = x
h✝² : ¬y = y
h✝¹ : ¬a = x
h✝ : a = y
ha : x ≠ a
⊢ y = a
[PROOFSTEP]
tauto
[GOAL]
case neg
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x y : α
inst✝ : DecidableEq α
hxy : x ≠ y
a : α
hya : ¬y = a
h✝³ : ¬y = x
h✝² : ¬y = y
h✝¹ : ¬a = x
h✝ : ¬a = y
ha : a ≠ a
⊢ y = a
[PROOFSTEP]
tauto
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x y : α
inst✝ : DecidableEq α
⊢ IsSwap f → IsCycle f
[PROOFSTEP]
rintro ⟨x, y, hxy, rfl⟩
[GOAL]
case intro.intro.intro
ι : Type u_1
α : Type u_2
β : Type u_3
g : Perm α
x✝ y✝ : α
inst✝ : DecidableEq α
x y : α
hxy : x ≠ y
⊢ IsCycle (swap x y)
[PROOFSTEP]
exact isCycle_swap hxy
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x y : α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : Finite β
f : Perm β
hf : IsCycle f
⊢ ∃ k x, f ^ k = 1
[PROOFSTEP]
classical
have : IsOfFinOrder f := by exact _root_.exists_pow_eq_one f
rw [isOfFinOrder_iff_pow_eq_one] at this 
obtain ⟨x, hx, _⟩ := hf
obtain ⟨_ | _ | k, hk, hk'⟩ := this
· exact absurd hk (lt_asymm hk)
· rw [pow_one] at hk' 
  simp [hk'] at hx 
· exact ⟨k + 2, by simp, hk'⟩
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x y : α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : Finite β
f : Perm β
hf : IsCycle f
⊢ ∃ k x, f ^ k = 1
[PROOFSTEP]
have : IsOfFinOrder f := by exact _root_.exists_pow_eq_one f
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x y : α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : Finite β
f : Perm β
hf : IsCycle f
⊢ IsOfFinOrder f
[PROOFSTEP]
exact _root_.exists_pow_eq_one f
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x y : α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : Finite β
f : Perm β
hf : IsCycle f
this : IsOfFinOrder f
⊢ ∃ k x, f ^ k = 1
[PROOFSTEP]
rw [isOfFinOrder_iff_pow_eq_one] at this 
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x y : α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : Finite β
f : Perm β
hf : IsCycle f
this : ∃ n, 0 < n ∧ f ^ n = 1
⊢ ∃ k x, f ^ k = 1
[PROOFSTEP]
obtain ⟨x, hx, _⟩ := hf
[GOAL]
case intro.intro
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x✝ y : α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : Finite β
f : Perm β
this : ∃ n, 0 < n ∧ f ^ n = 1
x : β
hx : ↑f x ≠ x
right✝ : ∀ ⦃y : β⦄, ↑f y ≠ y → SameCycle f x y
⊢ ∃ k x, f ^ k = 1
[PROOFSTEP]
obtain ⟨_ | _ | k, hk, hk'⟩ := this
[GOAL]
case intro.intro.intro.zero.intro
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x✝ y : α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : Finite β
f : Perm β
x : β
hx : ↑f x ≠ x
right✝ : ∀ ⦃y : β⦄, ↑f y ≠ y → SameCycle f x y
hk : 0 < Nat.zero
hk' : f ^ Nat.zero = 1
⊢ ∃ k x, f ^ k = 1
[PROOFSTEP]
exact absurd hk (lt_asymm hk)
[GOAL]
case intro.intro.intro.succ.zero.intro
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x✝ y : α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : Finite β
f : Perm β
x : β
hx : ↑f x ≠ x
right✝ : ∀ ⦃y : β⦄, ↑f y ≠ y → SameCycle f x y
hk : 0 < Nat.succ Nat.zero
hk' : f ^ Nat.succ Nat.zero = 1
⊢ ∃ k x, f ^ k = 1
[PROOFSTEP]
rw [pow_one] at hk' 
[GOAL]
case intro.intro.intro.succ.zero.intro
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x✝ y : α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : Finite β
f : Perm β
x : β
hx : ↑f x ≠ x
right✝ : ∀ ⦃y : β⦄, ↑f y ≠ y → SameCycle f x y
hk : 0 < Nat.succ Nat.zero
hk' : f = 1
⊢ ∃ k x, f ^ k = 1
[PROOFSTEP]
simp [hk'] at hx 
[GOAL]
case intro.intro.intro.succ.succ.intro
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x✝ y : α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : Finite β
f : Perm β
x : β
hx : ↑f x ≠ x
right✝ : ∀ ⦃y : β⦄, ↑f y ≠ y → SameCycle f x y
k : ℕ
hk : 0 < Nat.succ (Nat.succ k)
hk' : f ^ Nat.succ (Nat.succ k) = 1
⊢ ∃ k x, f ^ k = 1
[PROOFSTEP]
exact ⟨k + 2, by simp, hk'⟩
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x✝ y : α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : Finite β
f : Perm β
x : β
hx : ↑f x ≠ x
right✝ : ∀ ⦃y : β⦄, ↑f y ≠ y → SameCycle f x y
k : ℕ
hk : 0 < Nat.succ (Nat.succ k)
hk' : f ^ Nat.succ (Nat.succ k) = 1
⊢ 1 < k + 2
[PROOFSTEP]
simp
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x y : α
inst✝¹ : DecidableEq α
inst✝ : Fintype α
σ : Perm α
hσ : IsCycle σ
τ : ↑↑(Subgroup.zpowers σ)
⊢ ↑↑τ (Classical.choose hσ) ∈ support σ
[PROOFSTEP]
obtain ⟨τ, n, rfl⟩ := τ
[GOAL]
case mk.intro
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x y : α
inst✝¹ : DecidableEq α
inst✝ : Fintype α
σ : Perm α
hσ : IsCycle σ
n : ℤ
⊢ ↑↑{ val := (fun x x_1 => x ^ x_1) σ n,
            property := (_ : ∃ y, (fun x x_1 => x ^ x_1) σ y = (fun x x_1 => x ^ x_1) σ n) }
      (Classical.choose hσ) ∈
    support σ
[PROOFSTEP]
erw [Finset.mem_coe, Subtype.coe_mk, zpow_apply_mem_support, mem_support]
[GOAL]
case mk.intro
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x y : α
inst✝¹ : DecidableEq α
inst✝ : Fintype α
σ : Perm α
hσ : IsCycle σ
n : ℤ
⊢ ↑σ (Classical.choose hσ) ≠ Classical.choose hσ
[PROOFSTEP]
exact (Classical.choose_spec hσ).1
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x y : α
inst✝¹ : DecidableEq α
inst✝ : Fintype α
σ : Perm α
hσ : IsCycle σ
⊢ Bijective fun τ => { val := ↑↑τ (Classical.choose hσ), property := (_ : ↑↑τ (Classical.choose hσ) ∈ support σ) }
[PROOFSTEP]
constructor
[GOAL]
case left
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x y : α
inst✝¹ : DecidableEq α
inst✝ : Fintype α
σ : Perm α
hσ : IsCycle σ
⊢ Injective fun τ => { val := ↑↑τ (Classical.choose hσ), property := (_ : ↑↑τ (Classical.choose hσ) ∈ support σ) }
[PROOFSTEP]
rintro ⟨a, m, rfl⟩ ⟨b, n, rfl⟩ h
[GOAL]
case left.mk.intro.mk.intro
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x y : α
inst✝¹ : DecidableEq α
inst✝ : Fintype α
σ : Perm α
hσ : IsCycle σ
m n : ℤ
h :
  (fun τ => { val := ↑↑τ (Classical.choose hσ), property := (_ : ↑↑τ (Classical.choose hσ) ∈ support σ) })
      { val := (fun x x_1 => x ^ x_1) σ m,
        property := (_ : ∃ y, (fun x x_1 => x ^ x_1) σ y = (fun x x_1 => x ^ x_1) σ m) } =
    (fun τ => { val := ↑↑τ (Classical.choose hσ), property := (_ : ↑↑τ (Classical.choose hσ) ∈ support σ) })
      { val := (fun x x_1 => x ^ x_1) σ n,
        property := (_ : ∃ y, (fun x x_1 => x ^ x_1) σ y = (fun x x_1 => x ^ x_1) σ n) }
⊢ { val := (fun x x_1 => x ^ x_1) σ m,
      property := (_ : ∃ y, (fun x x_1 => x ^ x_1) σ y = (fun x x_1 => x ^ x_1) σ m) } =
    { val := (fun x x_1 => x ^ x_1) σ n,
      property := (_ : ∃ y, (fun x x_1 => x ^ x_1) σ y = (fun x x_1 => x ^ x_1) σ n) }
[PROOFSTEP]
ext y
[GOAL]
case left.mk.intro.mk.intro.a.H
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x y✝ : α
inst✝¹ : DecidableEq α
inst✝ : Fintype α
σ : Perm α
hσ : IsCycle σ
m n : ℤ
h :
  (fun τ => { val := ↑↑τ (Classical.choose hσ), property := (_ : ↑↑τ (Classical.choose hσ) ∈ support σ) })
      { val := (fun x x_1 => x ^ x_1) σ m,
        property := (_ : ∃ y, (fun x x_1 => x ^ x_1) σ y = (fun x x_1 => x ^ x_1) σ m) } =
    (fun τ => { val := ↑↑τ (Classical.choose hσ), property := (_ : ↑↑τ (Classical.choose hσ) ∈ support σ) })
      { val := (fun x x_1 => x ^ x_1) σ n,
        property := (_ : ∃ y, (fun x x_1 => x ^ x_1) σ y = (fun x x_1 => x ^ x_1) σ n) }
y : α
⊢ ↑↑{ val := (fun x x_1 => x ^ x_1) σ m,
            property := (_ : ∃ y, (fun x x_1 => x ^ x_1) σ y = (fun x x_1 => x ^ x_1) σ m) }
      y =
    ↑↑{ val := (fun x x_1 => x ^ x_1) σ n,
            property := (_ : ∃ y, (fun x x_1 => x ^ x_1) σ y = (fun x x_1 => x ^ x_1) σ n) }
      y
[PROOFSTEP]
by_cases hy : σ y = y
[GOAL]
case pos
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x y✝ : α
inst✝¹ : DecidableEq α
inst✝ : Fintype α
σ : Perm α
hσ : IsCycle σ
m n : ℤ
h :
  (fun τ => { val := ↑↑τ (Classical.choose hσ), property := (_ : ↑↑τ (Classical.choose hσ) ∈ support σ) })
      { val := (fun x x_1 => x ^ x_1) σ m,
        property := (_ : ∃ y, (fun x x_1 => x ^ x_1) σ y = (fun x x_1 => x ^ x_1) σ m) } =
    (fun τ => { val := ↑↑τ (Classical.choose hσ), property := (_ : ↑↑τ (Classical.choose hσ) ∈ support σ) })
      { val := (fun x x_1 => x ^ x_1) σ n,
        property := (_ : ∃ y, (fun x x_1 => x ^ x_1) σ y = (fun x x_1 => x ^ x_1) σ n) }
y : α
hy : ↑σ y = y
⊢ ↑↑{ val := (fun x x_1 => x ^ x_1) σ m,
            property := (_ : ∃ y, (fun x x_1 => x ^ x_1) σ y = (fun x x_1 => x ^ x_1) σ m) }
      y =
    ↑↑{ val := (fun x x_1 => x ^ x_1) σ n,
            property := (_ : ∃ y, (fun x x_1 => x ^ x_1) σ y = (fun x x_1 => x ^ x_1) σ n) }
      y
[PROOFSTEP]
simp_rw [zpow_apply_eq_self_of_apply_eq_self hy]
[GOAL]
case neg
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x y✝ : α
inst✝¹ : DecidableEq α
inst✝ : Fintype α
σ : Perm α
hσ : IsCycle σ
m n : ℤ
h :
  (fun τ => { val := ↑↑τ (Classical.choose hσ), property := (_ : ↑↑τ (Classical.choose hσ) ∈ support σ) })
      { val := (fun x x_1 => x ^ x_1) σ m,
        property := (_ : ∃ y, (fun x x_1 => x ^ x_1) σ y = (fun x x_1 => x ^ x_1) σ m) } =
    (fun τ => { val := ↑↑τ (Classical.choose hσ), property := (_ : ↑↑τ (Classical.choose hσ) ∈ support σ) })
      { val := (fun x x_1 => x ^ x_1) σ n,
        property := (_ : ∃ y, (fun x x_1 => x ^ x_1) σ y = (fun x x_1 => x ^ x_1) σ n) }
y : α
hy : ¬↑σ y = y
⊢ ↑↑{ val := (fun x x_1 => x ^ x_1) σ m,
            property := (_ : ∃ y, (fun x x_1 => x ^ x_1) σ y = (fun x x_1 => x ^ x_1) σ m) }
      y =
    ↑↑{ val := (fun x x_1 => x ^ x_1) σ n,
            property := (_ : ∃ y, (fun x x_1 => x ^ x_1) σ y = (fun x x_1 => x ^ x_1) σ n) }
      y
[PROOFSTEP]
obtain ⟨i, rfl⟩ := (Classical.choose_spec hσ).2 hy
[GOAL]
case neg.intro
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x y : α
inst✝¹ : DecidableEq α
inst✝ : Fintype α
σ : Perm α
hσ : IsCycle σ
m n : ℤ
h :
  (fun τ => { val := ↑↑τ (Classical.choose hσ), property := (_ : ↑↑τ (Classical.choose hσ) ∈ support σ) })
      { val := (fun x x_1 => x ^ x_1) σ m,
        property := (_ : ∃ y, (fun x x_1 => x ^ x_1) σ y = (fun x x_1 => x ^ x_1) σ m) } =
    (fun τ => { val := ↑↑τ (Classical.choose hσ), property := (_ : ↑↑τ (Classical.choose hσ) ∈ support σ) })
      { val := (fun x x_1 => x ^ x_1) σ n,
        property := (_ : ∃ y, (fun x x_1 => x ^ x_1) σ y = (fun x x_1 => x ^ x_1) σ n) }
i : ℤ
hy : ¬↑σ (↑(σ ^ i) (Classical.choose hσ)) = ↑(σ ^ i) (Classical.choose hσ)
⊢ ↑↑{ val := (fun x x_1 => x ^ x_1) σ m,
            property := (_ : ∃ y, (fun x x_1 => x ^ x_1) σ y = (fun x x_1 => x ^ x_1) σ m) }
      (↑(σ ^ i) (Classical.choose hσ)) =
    ↑↑{ val := (fun x x_1 => x ^ x_1) σ n,
            property := (_ : ∃ y, (fun x x_1 => x ^ x_1) σ y = (fun x x_1 => x ^ x_1) σ n) }
      (↑(σ ^ i) (Classical.choose hσ))
[PROOFSTEP]
rw [Subtype.coe_mk, Subtype.coe_mk, zpow_apply_comm σ m i, zpow_apply_comm σ n i]
[GOAL]
case neg.intro
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x y : α
inst✝¹ : DecidableEq α
inst✝ : Fintype α
σ : Perm α
hσ : IsCycle σ
m n : ℤ
h :
  (fun τ => { val := ↑↑τ (Classical.choose hσ), property := (_ : ↑↑τ (Classical.choose hσ) ∈ support σ) })
      { val := (fun x x_1 => x ^ x_1) σ m,
        property := (_ : ∃ y, (fun x x_1 => x ^ x_1) σ y = (fun x x_1 => x ^ x_1) σ m) } =
    (fun τ => { val := ↑↑τ (Classical.choose hσ), property := (_ : ↑↑τ (Classical.choose hσ) ∈ support σ) })
      { val := (fun x x_1 => x ^ x_1) σ n,
        property := (_ : ∃ y, (fun x x_1 => x ^ x_1) σ y = (fun x x_1 => x ^ x_1) σ n) }
i : ℤ
hy : ¬↑σ (↑(σ ^ i) (Classical.choose hσ)) = ↑(σ ^ i) (Classical.choose hσ)
⊢ ↑(σ ^ i) (↑(σ ^ m) (Classical.choose hσ)) = ↑(σ ^ i) (↑(σ ^ n) (Classical.choose hσ))
[PROOFSTEP]
exact congr_arg _ (Subtype.ext_iff.mp h)
[GOAL]
case right
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x y : α
inst✝¹ : DecidableEq α
inst✝ : Fintype α
σ : Perm α
hσ : IsCycle σ
⊢ Surjective fun τ => { val := ↑↑τ (Classical.choose hσ), property := (_ : ↑↑τ (Classical.choose hσ) ∈ support σ) }
[PROOFSTEP]
rintro ⟨y, hy⟩
[GOAL]
case right.mk
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x y✝ : α
inst✝¹ : DecidableEq α
inst✝ : Fintype α
σ : Perm α
hσ : IsCycle σ
y : α
hy : y ∈ support σ
⊢ ∃ a,
    (fun τ => { val := ↑↑τ (Classical.choose hσ), property := (_ : ↑↑τ (Classical.choose hσ) ∈ support σ) }) a =
      { val := y, property := hy }
[PROOFSTEP]
erw [Finset.mem_coe, mem_support] at hy 
[GOAL]
case right.mk
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x y✝ : α
inst✝¹ : DecidableEq α
inst✝ : Fintype α
σ : Perm α
hσ : IsCycle σ
y : α
hy✝ : y ∈ support σ
hy : ↑σ y ≠ y
⊢ ∃ a,
    (fun τ => { val := ↑↑τ (Classical.choose hσ), property := (_ : ↑↑τ (Classical.choose hσ) ∈ support σ) }) a =
      { val := y, property := hy✝ }
[PROOFSTEP]
obtain ⟨n, rfl⟩ := (Classical.choose_spec hσ).2 hy
[GOAL]
case right.mk.intro
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x y : α
inst✝¹ : DecidableEq α
inst✝ : Fintype α
σ : Perm α
hσ : IsCycle σ
n : ℤ
hy✝ : ↑(σ ^ n) (Classical.choose hσ) ∈ support σ
hy : ↑σ (↑(σ ^ n) (Classical.choose hσ)) ≠ ↑(σ ^ n) (Classical.choose hσ)
⊢ ∃ a,
    (fun τ => { val := ↑↑τ (Classical.choose hσ), property := (_ : ↑↑τ (Classical.choose hσ) ∈ support σ) }) a =
      { val := ↑(σ ^ n) (Classical.choose hσ), property := hy✝ }
[PROOFSTEP]
exact ⟨⟨σ ^ n, n, rfl⟩, rfl⟩
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x y : α
inst✝¹ : DecidableEq α
inst✝ : Fintype α
hf : IsCycle f
⊢ orderOf f = card (support f)
[PROOFSTEP]
rw [orderOf_eq_card_zpowers, ← Fintype.card_coe]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x y : α
inst✝¹ : DecidableEq α
inst✝ : Fintype α
hf : IsCycle f
⊢ Fintype.card { x // x ∈ Subgroup.zpowers f } = Fintype.card { x // x ∈ support f }
[PROOFSTEP]
convert Fintype.card_congr (IsCycle.zpowersEquivSupport hf)
[GOAL]
ι : Type u_1
α✝ : Type u_2
β : Type u_3
f g : Perm α✝
x y : α✝
inst✝² : DecidableEq α✝
inst✝¹ : Fintype α✝
α : Type u_4
inst✝ : DecidableEq α
⊢ ∀ (n : ℕ) {b x : α} {f : Perm α},
    ↑(swap x (↑f x) * f) b ≠ b → ↑(f ^ n) (↑f x) = b → ∃ i, ↑((swap x (↑f x) * f) ^ i) (↑f x) = b
[PROOFSTEP]
intro n
[GOAL]
ι : Type u_1
α✝ : Type u_2
β : Type u_3
f g : Perm α✝
x y : α✝
inst✝² : DecidableEq α✝
inst✝¹ : Fintype α✝
α : Type u_4
inst✝ : DecidableEq α
n : ℕ
⊢ ∀ {b x : α} {f : Perm α},
    ↑(swap x (↑f x) * f) b ≠ b → ↑(f ^ n) (↑f x) = b → ∃ i, ↑((swap x (↑f x) * f) ^ i) (↑f x) = b
[PROOFSTEP]
induction' n with n hn
[GOAL]
case zero
ι : Type u_1
α✝ : Type u_2
β : Type u_3
f g : Perm α✝
x y : α✝
inst✝² : DecidableEq α✝
inst✝¹ : Fintype α✝
α : Type u_4
inst✝ : DecidableEq α
⊢ ∀ {b x : α} {f : Perm α},
    ↑(swap x (↑f x) * f) b ≠ b → ↑(f ^ Nat.zero) (↑f x) = b → ∃ i, ↑((swap x (↑f x) * f) ^ i) (↑f x) = b
[PROOFSTEP]
exact fun _ h => ⟨0, h⟩
[GOAL]
case succ
ι : Type u_1
α✝ : Type u_2
β : Type u_3
f g : Perm α✝
x y : α✝
inst✝² : DecidableEq α✝
inst✝¹ : Fintype α✝
α : Type u_4
inst✝ : DecidableEq α
n : ℕ
hn :
  ∀ {b x : α} {f : Perm α},
    ↑(swap x (↑f x) * f) b ≠ b → ↑(f ^ n) (↑f x) = b → ∃ i, ↑((swap x (↑f x) * f) ^ i) (↑f x) = b
⊢ ∀ {b x : α} {f : Perm α},
    ↑(swap x (↑f x) * f) b ≠ b → ↑(f ^ Nat.succ n) (↑f x) = b → ∃ i, ↑((swap x (↑f x) * f) ^ i) (↑f x) = b
[PROOFSTEP]
intro b x f hb h
[GOAL]
case succ
ι : Type u_1
α✝ : Type u_2
β : Type u_3
f✝ g : Perm α✝
x✝ y : α✝
inst✝² : DecidableEq α✝
inst✝¹ : Fintype α✝
α : Type u_4
inst✝ : DecidableEq α
n : ℕ
hn :
  ∀ {b x : α} {f : Perm α},
    ↑(swap x (↑f x) * f) b ≠ b → ↑(f ^ n) (↑f x) = b → ∃ i, ↑((swap x (↑f x) * f) ^ i) (↑f x) = b
b x : α
f : Perm α
hb : ↑(swap x (↑f x) * f) b ≠ b
h : ↑(f ^ Nat.succ n) (↑f x) = b
⊢ ∃ i, ↑((swap x (↑f x) * f) ^ i) (↑f x) = b
[PROOFSTEP]
exact
  if hfbx : f x = b then ⟨0, hfbx⟩
  else
    have : f b ≠ b ∧ b ≠ x := ne_and_ne_of_swap_mul_apply_ne_self hb
    have hb' : (swap x (f x) * f) (f⁻¹ b) ≠ f⁻¹ b :=
      by
      rw [mul_apply, apply_inv_self, swap_apply_of_ne_of_ne this.2 (Ne.symm hfbx), Ne.def, ← f.injective.eq_iff,
        apply_inv_self]
      exact this.1
    let ⟨i, hi⟩ := hn hb' (f.injective <| by rw [apply_inv_self]; rwa [pow_succ, mul_apply] at h )
    ⟨i + 1, by
      rw [add_comm, zpow_add, mul_apply, hi, zpow_one, mul_apply, apply_inv_self,
        swap_apply_of_ne_of_ne (ne_and_ne_of_swap_mul_apply_ne_self hb).2 (Ne.symm hfbx)]⟩
[GOAL]
ι : Type u_1
α✝ : Type u_2
β : Type u_3
f✝ g : Perm α✝
x✝ y : α✝
inst✝² : DecidableEq α✝
inst✝¹ : Fintype α✝
α : Type u_4
inst✝ : DecidableEq α
n : ℕ
hn :
  ∀ {b x : α} {f : Perm α},
    ↑(swap x (↑f x) * f) b ≠ b → ↑(f ^ n) (↑f x) = b → ∃ i, ↑((swap x (↑f x) * f) ^ i) (↑f x) = b
b x : α
f : Perm α
hb : ↑(swap x (↑f x) * f) b ≠ b
h : ↑(f ^ Nat.succ n) (↑f x) = b
hfbx : ¬↑f x = b
this : ↑f b ≠ b ∧ b ≠ x
⊢ ↑(swap x (↑f x) * f) (↑f⁻¹ b) ≠ ↑f⁻¹ b
[PROOFSTEP]
rw [mul_apply, apply_inv_self, swap_apply_of_ne_of_ne this.2 (Ne.symm hfbx), Ne.def, ← f.injective.eq_iff,
  apply_inv_self]
[GOAL]
ι : Type u_1
α✝ : Type u_2
β : Type u_3
f✝ g : Perm α✝
x✝ y : α✝
inst✝² : DecidableEq α✝
inst✝¹ : Fintype α✝
α : Type u_4
inst✝ : DecidableEq α
n : ℕ
hn :
  ∀ {b x : α} {f : Perm α},
    ↑(swap x (↑f x) * f) b ≠ b → ↑(f ^ n) (↑f x) = b → ∃ i, ↑((swap x (↑f x) * f) ^ i) (↑f x) = b
b x : α
f : Perm α
hb : ↑(swap x (↑f x) * f) b ≠ b
h : ↑(f ^ Nat.succ n) (↑f x) = b
hfbx : ¬↑f x = b
this : ↑f b ≠ b ∧ b ≠ x
⊢ ¬↑f b = b
[PROOFSTEP]
exact this.1
[GOAL]
ι : Type u_1
α✝ : Type u_2
β : Type u_3
f✝ g : Perm α✝
x✝ y : α✝
inst✝² : DecidableEq α✝
inst✝¹ : Fintype α✝
α : Type u_4
inst✝ : DecidableEq α
n : ℕ
hn :
  ∀ {b x : α} {f : Perm α},
    ↑(swap x (↑f x) * f) b ≠ b → ↑(f ^ n) (↑f x) = b → ∃ i, ↑((swap x (↑f x) * f) ^ i) (↑f x) = b
b x : α
f : Perm α
hb : ↑(swap x (↑f x) * f) b ≠ b
h : ↑(f ^ Nat.succ n) (↑f x) = b
hfbx : ¬↑f x = b
this : ↑f b ≠ b ∧ b ≠ x
hb' : ↑(swap x (↑f x) * f) (↑f⁻¹ b) ≠ ↑f⁻¹ b
⊢ ↑f (↑(f ^ n) (↑f x)) = ↑f (↑f⁻¹ b)
[PROOFSTEP]
rw [apply_inv_self]
[GOAL]
ι : Type u_1
α✝ : Type u_2
β : Type u_3
f✝ g : Perm α✝
x✝ y : α✝
inst✝² : DecidableEq α✝
inst✝¹ : Fintype α✝
α : Type u_4
inst✝ : DecidableEq α
n : ℕ
hn :
  ∀ {b x : α} {f : Perm α},
    ↑(swap x (↑f x) * f) b ≠ b → ↑(f ^ n) (↑f x) = b → ∃ i, ↑((swap x (↑f x) * f) ^ i) (↑f x) = b
b x : α
f : Perm α
hb : ↑(swap x (↑f x) * f) b ≠ b
h : ↑(f ^ Nat.succ n) (↑f x) = b
hfbx : ¬↑f x = b
this : ↑f b ≠ b ∧ b ≠ x
hb' : ↑(swap x (↑f x) * f) (↑f⁻¹ b) ≠ ↑f⁻¹ b
⊢ ↑f (↑(f ^ n) (↑f x)) = b
[PROOFSTEP]
rwa [pow_succ, mul_apply] at h 
[GOAL]
ι : Type u_1
α✝ : Type u_2
β : Type u_3
f✝ g : Perm α✝
x✝ y : α✝
inst✝² : DecidableEq α✝
inst✝¹ : Fintype α✝
α : Type u_4
inst✝ : DecidableEq α
n : ℕ
hn :
  ∀ {b x : α} {f : Perm α},
    ↑(swap x (↑f x) * f) b ≠ b → ↑(f ^ n) (↑f x) = b → ∃ i, ↑((swap x (↑f x) * f) ^ i) (↑f x) = b
b x : α
f : Perm α
hb : ↑(swap x (↑f x) * f) b ≠ b
h : ↑(f ^ Nat.succ n) (↑f x) = b
hfbx : ¬↑f x = b
this : ↑f b ≠ b ∧ b ≠ x
hb' : ↑(swap x (↑f x) * f) (↑f⁻¹ b) ≠ ↑f⁻¹ b
i : ℤ
hi : ↑((swap x (↑f x) * f) ^ i) (↑f x) = ↑f⁻¹ b
⊢ ↑((swap x (↑f x) * f) ^ (i + 1)) (↑f x) = b
[PROOFSTEP]
rw [add_comm, zpow_add, mul_apply, hi, zpow_one, mul_apply, apply_inv_self,
  swap_apply_of_ne_of_ne (ne_and_ne_of_swap_mul_apply_ne_self hb).2 (Ne.symm hfbx)]
[GOAL]
ι : Type u_1
α✝ : Type u_2
β : Type u_3
f g : Perm α✝
x y : α✝
inst✝² : DecidableEq α✝
inst✝¹ : Fintype α✝
α : Type u_4
inst✝ : DecidableEq α
⊢ ∀ (n : ℤ) {b x : α} {f : Perm α},
    ↑(swap x (↑f x) * f) b ≠ b → ↑(f ^ n) (↑f x) = b → ∃ i, ↑((swap x (↑f x) * f) ^ i) (↑f x) = b
[PROOFSTEP]
intro n
[GOAL]
ι : Type u_1
α✝ : Type u_2
β : Type u_3
f g : Perm α✝
x y : α✝
inst✝² : DecidableEq α✝
inst✝¹ : Fintype α✝
α : Type u_4
inst✝ : DecidableEq α
n : ℤ
⊢ ∀ {b x : α} {f : Perm α},
    ↑(swap x (↑f x) * f) b ≠ b → ↑(f ^ n) (↑f x) = b → ∃ i, ↑((swap x (↑f x) * f) ^ i) (↑f x) = b
[PROOFSTEP]
induction' n with n n
[GOAL]
case ofNat
ι : Type u_1
α✝ : Type u_2
β : Type u_3
f g : Perm α✝
x y : α✝
inst✝² : DecidableEq α✝
inst✝¹ : Fintype α✝
α : Type u_4
inst✝ : DecidableEq α
n : ℕ
⊢ ∀ {b x : α} {f : Perm α},
    ↑(swap x (↑f x) * f) b ≠ b → ↑(f ^ Int.ofNat n) (↑f x) = b → ∃ i, ↑((swap x (↑f x) * f) ^ i) (↑f x) = b
[PROOFSTEP]
exact isCycle_swap_mul_aux₁ n
[GOAL]
case negSucc
ι : Type u_1
α✝ : Type u_2
β : Type u_3
f g : Perm α✝
x y : α✝
inst✝² : DecidableEq α✝
inst✝¹ : Fintype α✝
α : Type u_4
inst✝ : DecidableEq α
n : ℕ
⊢ ∀ {b x : α} {f : Perm α},
    ↑(swap x (↑f x) * f) b ≠ b → ↑(f ^ Int.negSucc n) (↑f x) = b → ∃ i, ↑((swap x (↑f x) * f) ^ i) (↑f x) = b
[PROOFSTEP]
intro b x f hb h
[GOAL]
case negSucc
ι : Type u_1
α✝ : Type u_2
β : Type u_3
f✝ g : Perm α✝
x✝ y : α✝
inst✝² : DecidableEq α✝
inst✝¹ : Fintype α✝
α : Type u_4
inst✝ : DecidableEq α
n : ℕ
b x : α
f : Perm α
hb : ↑(swap x (↑f x) * f) b ≠ b
h : ↑(f ^ Int.negSucc n) (↑f x) = b
⊢ ∃ i, ↑((swap x (↑f x) * f) ^ i) (↑f x) = b
[PROOFSTEP]
exact
  if hfbx' : f x = b then ⟨0, hfbx'⟩
  else
    have : f b ≠ b ∧ b ≠ x := ne_and_ne_of_swap_mul_apply_ne_self hb
    have hb : (swap x (f⁻¹ x) * f⁻¹) (f⁻¹ b) ≠ f⁻¹ b :=
      by
      rw [mul_apply, swap_apply_def]
      split_ifs <;> simp only [inv_eq_iff_eq, Perm.mul_apply, zpow_negSucc, Ne.def, Perm.apply_inv_self] at * <;> tauto
    let ⟨i, hi⟩ :=
      isCycle_swap_mul_aux₁ n hb
        (show (f⁻¹ ^ n) (f⁻¹ x) = f⁻¹ b by
          rw [← zpow_ofNat, ← h, ← mul_apply, ← mul_apply, ← mul_apply, zpow_negSucc, ← inv_pow, pow_succ', mul_assoc,
            mul_assoc, inv_mul_self, mul_one, zpow_ofNat, ← pow_succ', ← pow_succ])
    have h : (swap x (f⁻¹ x) * f⁻¹) (f x) = f⁻¹ x := by rw [mul_apply, inv_apply_self, swap_apply_left]
    ⟨-i, by
      rw [← add_sub_cancel i 1, neg_sub, sub_eq_add_neg, zpow_add, zpow_one, zpow_neg, ← inv_zpow, mul_inv_rev,
        swap_inv, mul_swap_eq_swap_mul, inv_apply_self, swap_comm _ x, zpow_add, zpow_one, mul_apply, mul_apply (_ ^ i),
        h, hi, mul_apply, apply_inv_self, swap_apply_of_ne_of_ne this.2 (Ne.symm hfbx')]⟩
[GOAL]
ι : Type u_1
α✝ : Type u_2
β : Type u_3
f✝ g : Perm α✝
x✝ y : α✝
inst✝² : DecidableEq α✝
inst✝¹ : Fintype α✝
α : Type u_4
inst✝ : DecidableEq α
n : ℕ
b x : α
f : Perm α
hb : ↑(swap x (↑f x) * f) b ≠ b
h : ↑(f ^ Int.negSucc n) (↑f x) = b
hfbx' : ¬↑f x = b
this : ↑f b ≠ b ∧ b ≠ x
⊢ ↑(swap x (↑f⁻¹ x) * f⁻¹) (↑f⁻¹ b) ≠ ↑f⁻¹ b
[PROOFSTEP]
rw [mul_apply, swap_apply_def]
[GOAL]
ι : Type u_1
α✝ : Type u_2
β : Type u_3
f✝ g : Perm α✝
x✝ y : α✝
inst✝² : DecidableEq α✝
inst✝¹ : Fintype α✝
α : Type u_4
inst✝ : DecidableEq α
n : ℕ
b x : α
f : Perm α
hb : ↑(swap x (↑f x) * f) b ≠ b
h : ↑(f ^ Int.negSucc n) (↑f x) = b
hfbx' : ¬↑f x = b
this : ↑f b ≠ b ∧ b ≠ x
⊢ (if ↑f⁻¹ (↑f⁻¹ b) = x then ↑f⁻¹ x else if ↑f⁻¹ (↑f⁻¹ b) = ↑f⁻¹ x then x else ↑f⁻¹ (↑f⁻¹ b)) ≠ ↑f⁻¹ b
[PROOFSTEP]
split_ifs
[GOAL]
case pos
ι : Type u_1
α✝ : Type u_2
β : Type u_3
f✝ g : Perm α✝
x✝ y : α✝
inst✝² : DecidableEq α✝
inst✝¹ : Fintype α✝
α : Type u_4
inst✝ : DecidableEq α
n : ℕ
b x : α
f : Perm α
hb : ↑(swap x (↑f x) * f) b ≠ b
h : ↑(f ^ Int.negSucc n) (↑f x) = b
hfbx' : ¬↑f x = b
this : ↑f b ≠ b ∧ b ≠ x
h✝ : ↑f⁻¹ (↑f⁻¹ b) = x
⊢ ↑f⁻¹ x ≠ ↑f⁻¹ b
[PROOFSTEP]
simp only [inv_eq_iff_eq, Perm.mul_apply, zpow_negSucc, Ne.def, Perm.apply_inv_self] at *
[GOAL]
case pos
ι : Type u_1
α✝ : Type u_2
β : Type u_3
f✝ g : Perm α✝
x✝ y : α✝
inst✝² : DecidableEq α✝
inst✝¹ : Fintype α✝
α : Type u_4
inst✝ : DecidableEq α
n : ℕ
b x : α
f : Perm α
hb : ↑(swap x (↑f x) * f) b ≠ b
h : ↑(f ^ Int.negSucc n) (↑f x) = b
hfbx' : ¬↑f x = b
this : ↑f b ≠ b ∧ b ≠ x
h✝¹ : ¬↑f⁻¹ (↑f⁻¹ b) = x
h✝ : ↑f⁻¹ (↑f⁻¹ b) = ↑f⁻¹ x
⊢ x ≠ ↑f⁻¹ b
[PROOFSTEP]
simp only [inv_eq_iff_eq, Perm.mul_apply, zpow_negSucc, Ne.def, Perm.apply_inv_self] at *
[GOAL]
case neg
ι : Type u_1
α✝ : Type u_2
β : Type u_3
f✝ g : Perm α✝
x✝ y : α✝
inst✝² : DecidableEq α✝
inst✝¹ : Fintype α✝
α : Type u_4
inst✝ : DecidableEq α
n : ℕ
b x : α
f : Perm α
hb : ↑(swap x (↑f x) * f) b ≠ b
h : ↑(f ^ Int.negSucc n) (↑f x) = b
hfbx' : ¬↑f x = b
this : ↑f b ≠ b ∧ b ≠ x
h✝¹ : ¬↑f⁻¹ (↑f⁻¹ b) = x
h✝ : ¬↑f⁻¹ (↑f⁻¹ b) = ↑f⁻¹ x
⊢ ↑f⁻¹ (↑f⁻¹ b) ≠ ↑f⁻¹ b
[PROOFSTEP]
simp only [inv_eq_iff_eq, Perm.mul_apply, zpow_negSucc, Ne.def, Perm.apply_inv_self] at *
[GOAL]
case pos
ι : Type u_1
α✝ : Type u_2
β : Type u_3
f✝ g : Perm α✝
x✝ y : α✝
inst✝² : DecidableEq α✝
inst✝¹ : Fintype α✝
α : Type u_4
inst✝ : DecidableEq α
n : ℕ
b x : α
f : Perm α
hb : ¬↑(swap x (↑f x)) (↑f b) = b
hfbx' : ¬↑f x = b
this : ¬↑f b = b ∧ ¬b = x
h : ↑f x = ↑(f ^ (n + 1)) b
h✝ : b = ↑f (↑f x)
⊢ ¬x = b
[PROOFSTEP]
tauto
[GOAL]
case pos
ι : Type u_1
α✝ : Type u_2
β : Type u_3
f✝ g : Perm α✝
x✝ y : α✝
inst✝² : DecidableEq α✝
inst✝¹ : Fintype α✝
α : Type u_4
inst✝ : DecidableEq α
n : ℕ
b x : α
f : Perm α
hb : ¬↑(swap x (↑f x)) (↑f b) = b
hfbx' : ¬↑f x = b
this : ¬↑f b = b ∧ ¬b = x
h : ↑f x = ↑(f ^ (n + 1)) b
h✝¹ : ¬b = ↑f (↑f x)
h✝ : b = ↑f x
⊢ ¬x = ↑f⁻¹ b
[PROOFSTEP]
tauto
[GOAL]
case neg
ι : Type u_1
α✝ : Type u_2
β : Type u_3
f✝ g : Perm α✝
x✝ y : α✝
inst✝² : DecidableEq α✝
inst✝¹ : Fintype α✝
α : Type u_4
inst✝ : DecidableEq α
n : ℕ
b x : α
f : Perm α
hb : ¬↑(swap x (↑f x)) (↑f b) = b
hfbx' : ¬↑f x = b
this : ¬↑f b = b ∧ ¬b = x
h : ↑f x = ↑(f ^ (n + 1)) b
h✝¹ : ¬b = ↑f (↑f x)
h✝ : ¬b = ↑f x
⊢ ¬b = ↑f b
[PROOFSTEP]
tauto
[GOAL]
ι : Type u_1
α✝ : Type u_2
β : Type u_3
f✝ g : Perm α✝
x✝ y : α✝
inst✝² : DecidableEq α✝
inst✝¹ : Fintype α✝
α : Type u_4
inst✝ : DecidableEq α
n : ℕ
b x : α
f : Perm α
hb✝ : ↑(swap x (↑f x) * f) b ≠ b
h : ↑(f ^ Int.negSucc n) (↑f x) = b
hfbx' : ¬↑f x = b
this : ↑f b ≠ b ∧ b ≠ x
hb : ↑(swap x (↑f⁻¹ x) * f⁻¹) (↑f⁻¹ b) ≠ ↑f⁻¹ b
⊢ ↑(f⁻¹ ^ n) (↑f⁻¹ x) = ↑f⁻¹ b
[PROOFSTEP]
rw [← zpow_ofNat, ← h, ← mul_apply, ← mul_apply, ← mul_apply, zpow_negSucc, ← inv_pow, pow_succ', mul_assoc, mul_assoc,
  inv_mul_self, mul_one, zpow_ofNat, ← pow_succ', ← pow_succ]
[GOAL]
ι : Type u_1
α✝ : Type u_2
β : Type u_3
f✝ g : Perm α✝
x✝ y : α✝
inst✝² : DecidableEq α✝
inst✝¹ : Fintype α✝
α : Type u_4
inst✝ : DecidableEq α
n : ℕ
b x : α
f : Perm α
hb✝ : ↑(swap x (↑f x) * f) b ≠ b
h : ↑(f ^ Int.negSucc n) (↑f x) = b
hfbx' : ¬↑f x = b
this : ↑f b ≠ b ∧ b ≠ x
hb : ↑(swap x (↑f⁻¹ x) * f⁻¹) (↑f⁻¹ b) ≠ ↑f⁻¹ b
i : ℤ
hi : ↑((swap x (↑f⁻¹ x) * f⁻¹) ^ i) (↑f⁻¹ x) = ↑f⁻¹ b
⊢ ↑(swap x (↑f⁻¹ x) * f⁻¹) (↑f x) = ↑f⁻¹ x
[PROOFSTEP]
rw [mul_apply, inv_apply_self, swap_apply_left]
[GOAL]
ι : Type u_1
α✝ : Type u_2
β : Type u_3
f✝ g : Perm α✝
x✝ y : α✝
inst✝² : DecidableEq α✝
inst✝¹ : Fintype α✝
α : Type u_4
inst✝ : DecidableEq α
n : ℕ
b x : α
f : Perm α
hb✝ : ↑(swap x (↑f x) * f) b ≠ b
h✝ : ↑(f ^ Int.negSucc n) (↑f x) = b
hfbx' : ¬↑f x = b
this : ↑f b ≠ b ∧ b ≠ x
hb : ↑(swap x (↑f⁻¹ x) * f⁻¹) (↑f⁻¹ b) ≠ ↑f⁻¹ b
i : ℤ
hi : ↑((swap x (↑f⁻¹ x) * f⁻¹) ^ i) (↑f⁻¹ x) = ↑f⁻¹ b
h : ↑(swap x (↑f⁻¹ x) * f⁻¹) (↑f x) = ↑f⁻¹ x
⊢ ↑((swap x (↑f x) * f) ^ (-i)) (↑f x) = b
[PROOFSTEP]
rw [← add_sub_cancel i 1, neg_sub, sub_eq_add_neg, zpow_add, zpow_one, zpow_neg, ← inv_zpow, mul_inv_rev, swap_inv,
  mul_swap_eq_swap_mul, inv_apply_self, swap_comm _ x, zpow_add, zpow_one, mul_apply, mul_apply (_ ^ i), h, hi,
  mul_apply, apply_inv_self, swap_apply_of_ne_of_ne this.2 (Ne.symm hfbx')]
[GOAL]
ι : Type u_1
α✝ : Type u_2
β : Type u_3
f✝ g : Perm α✝
x✝ y✝ : α✝
inst✝² : DecidableEq α✝
inst✝¹ : Fintype α✝
α : Type u_4
inst✝ : DecidableEq α
f : Perm α
hf : IsCycle f
x : α
hfx : ↑f x ≠ x
hffx : ↑f (↑f x) = x
y z : α
hz : ↑f z ≠ z ∧ ∀ ⦃y : α⦄, ↑f y ≠ y → SameCycle f z y
i : ℤ
hi : ↑(f ^ i) z = x
hyx : y = x
⊢ ↑f y = ↑(swap x (↑f x)) y
[PROOFSTEP]
simp [hyx]
[GOAL]
ι : Type u_1
α✝ : Type u_2
β : Type u_3
f✝ g : Perm α✝
x✝ y✝ : α✝
inst✝² : DecidableEq α✝
inst✝¹ : Fintype α✝
α : Type u_4
inst✝ : DecidableEq α
f : Perm α
hf : IsCycle f
x : α
hfx : ↑f x ≠ x
hffx : ↑f (↑f x) = x
y z : α
hz : ↑f z ≠ z ∧ ∀ ⦃y : α⦄, ↑f y ≠ y → SameCycle f z y
i : ℤ
hi : ↑(f ^ i) z = x
hyx : ¬y = x
hfyx : y = ↑f x
⊢ ↑f y = ↑(swap x (↑f x)) y
[PROOFSTEP]
simp [hfyx, hffx]
[GOAL]
ι : Type u_1
α✝ : Type u_2
β : Type u_3
f✝ g : Perm α✝
x✝ y✝ : α✝
inst✝² : DecidableEq α✝
inst✝¹ : Fintype α✝
α : Type u_4
inst✝ : DecidableEq α
f : Perm α
hf : IsCycle f
x : α
hfx : ↑f x ≠ x
hffx : ↑f (↑f x) = x
y z : α
hz : ↑f z ≠ z ∧ ∀ ⦃y : α⦄, ↑f y ≠ y → SameCycle f z y
i : ℤ
hi : ↑(f ^ i) z = x
hyx : ¬y = x
hfyx : ¬y = ↑f x
⊢ ↑f y = ↑(swap x (↑f x)) y
[PROOFSTEP]
rw [swap_apply_of_ne_of_ne hyx hfyx]
[GOAL]
ι : Type u_1
α✝ : Type u_2
β : Type u_3
f✝ g : Perm α✝
x✝ y✝ : α✝
inst✝² : DecidableEq α✝
inst✝¹ : Fintype α✝
α : Type u_4
inst✝ : DecidableEq α
f : Perm α
hf : IsCycle f
x : α
hfx : ↑f x ≠ x
hffx : ↑f (↑f x) = x
y z : α
hz : ↑f z ≠ z ∧ ∀ ⦃y : α⦄, ↑f y ≠ y → SameCycle f z y
i : ℤ
hi : ↑(f ^ i) z = x
hyx : ¬y = x
hfyx : ¬y = ↑f x
⊢ ↑f y = y
[PROOFSTEP]
refine' by_contradiction fun hy => _
[GOAL]
ι : Type u_1
α✝ : Type u_2
β : Type u_3
f✝ g : Perm α✝
x✝ y✝ : α✝
inst✝² : DecidableEq α✝
inst✝¹ : Fintype α✝
α : Type u_4
inst✝ : DecidableEq α
f : Perm α
hf : IsCycle f
x : α
hfx : ↑f x ≠ x
hffx : ↑f (↑f x) = x
y z : α
hz : ↑f z ≠ z ∧ ∀ ⦃y : α⦄, ↑f y ≠ y → SameCycle f z y
i : ℤ
hi : ↑(f ^ i) z = x
hyx : ¬y = x
hfyx : ¬y = ↑f x
hy : ¬↑f y = y
⊢ False
[PROOFSTEP]
cases' hz.2 hy with j hj
[GOAL]
case intro
ι : Type u_1
α✝ : Type u_2
β : Type u_3
f✝ g : Perm α✝
x✝ y✝ : α✝
inst✝² : DecidableEq α✝
inst✝¹ : Fintype α✝
α : Type u_4
inst✝ : DecidableEq α
f : Perm α
hf : IsCycle f
x : α
hfx : ↑f x ≠ x
hffx : ↑f (↑f x) = x
y z : α
hz : ↑f z ≠ z ∧ ∀ ⦃y : α⦄, ↑f y ≠ y → SameCycle f z y
i : ℤ
hi : ↑(f ^ i) z = x
hyx : ¬y = x
hfyx : ¬y = ↑f x
hy : ¬↑f y = y
j : ℤ
hj : ↑(f ^ j) z = y
⊢ False
[PROOFSTEP]
rw [← sub_add_cancel j i, zpow_add, mul_apply, hi] at hj 
[GOAL]
case intro
ι : Type u_1
α✝ : Type u_2
β : Type u_3
f✝ g : Perm α✝
x✝ y✝ : α✝
inst✝² : DecidableEq α✝
inst✝¹ : Fintype α✝
α : Type u_4
inst✝ : DecidableEq α
f : Perm α
hf : IsCycle f
x : α
hfx : ↑f x ≠ x
hffx : ↑f (↑f x) = x
y z : α
hz : ↑f z ≠ z ∧ ∀ ⦃y : α⦄, ↑f y ≠ y → SameCycle f z y
i : ℤ
hi : ↑(f ^ i) z = x
hyx : ¬y = x
hfyx : ¬y = ↑f x
hy : ¬↑f y = y
j : ℤ
hj : ↑(f ^ (j - i)) x = y
⊢ False
[PROOFSTEP]
cases' zpow_apply_eq_of_apply_apply_eq_self hffx (j - i) with hji hji
[GOAL]
case intro.inl
ι : Type u_1
α✝ : Type u_2
β : Type u_3
f✝ g : Perm α✝
x✝ y✝ : α✝
inst✝² : DecidableEq α✝
inst✝¹ : Fintype α✝
α : Type u_4
inst✝ : DecidableEq α
f : Perm α
hf : IsCycle f
x : α
hfx : ↑f x ≠ x
hffx : ↑f (↑f x) = x
y z : α
hz : ↑f z ≠ z ∧ ∀ ⦃y : α⦄, ↑f y ≠ y → SameCycle f z y
i : ℤ
hi : ↑(f ^ i) z = x
hyx : ¬y = x
hfyx : ¬y = ↑f x
hy : ¬↑f y = y
j : ℤ
hj : ↑(f ^ (j - i)) x = y
hji : ↑(f ^ (j - i)) x = x
⊢ False
[PROOFSTEP]
rw [← hj, hji] at hyx 
[GOAL]
case intro.inl
ι : Type u_1
α✝ : Type u_2
β : Type u_3
f✝ g : Perm α✝
x✝ y✝ : α✝
inst✝² : DecidableEq α✝
inst✝¹ : Fintype α✝
α : Type u_4
inst✝ : DecidableEq α
f : Perm α
hf : IsCycle f
x : α
hfx : ↑f x ≠ x
hffx : ↑f (↑f x) = x
y z : α
hz : ↑f z ≠ z ∧ ∀ ⦃y : α⦄, ↑f y ≠ y → SameCycle f z y
i : ℤ
hi : ↑(f ^ i) z = x
hfyx : ¬y = ↑f x
hy : ¬↑f y = y
j : ℤ
hyx : ¬x = x
hj : ↑(f ^ (j - i)) x = y
hji : ↑(f ^ (j - i)) x = x
⊢ False
[PROOFSTEP]
tauto
[GOAL]
case intro.inr
ι : Type u_1
α✝ : Type u_2
β : Type u_3
f✝ g : Perm α✝
x✝ y✝ : α✝
inst✝² : DecidableEq α✝
inst✝¹ : Fintype α✝
α : Type u_4
inst✝ : DecidableEq α
f : Perm α
hf : IsCycle f
x : α
hfx : ↑f x ≠ x
hffx : ↑f (↑f x) = x
y z : α
hz : ↑f z ≠ z ∧ ∀ ⦃y : α⦄, ↑f y ≠ y → SameCycle f z y
i : ℤ
hi : ↑(f ^ i) z = x
hyx : ¬y = x
hfyx : ¬y = ↑f x
hy : ¬↑f y = y
j : ℤ
hj : ↑(f ^ (j - i)) x = y
hji : ↑(f ^ (j - i)) x = ↑f x
⊢ False
[PROOFSTEP]
rw [← hj, hji] at hfyx 
[GOAL]
case intro.inr
ι : Type u_1
α✝ : Type u_2
β : Type u_3
f✝ g : Perm α✝
x✝ y✝ : α✝
inst✝² : DecidableEq α✝
inst✝¹ : Fintype α✝
α : Type u_4
inst✝ : DecidableEq α
f : Perm α
hf : IsCycle f
x : α
hfx : ↑f x ≠ x
hffx : ↑f (↑f x) = x
y z : α
hz : ↑f z ≠ z ∧ ∀ ⦃y : α⦄, ↑f y ≠ y → SameCycle f z y
i : ℤ
hi : ↑(f ^ i) z = x
hyx : ¬y = x
hy : ¬↑f y = y
j : ℤ
hfyx : ¬↑f x = ↑f x
hj : ↑(f ^ (j - i)) x = y
hji : ↑(f ^ (j - i)) x = ↑f x
⊢ False
[PROOFSTEP]
tauto
[GOAL]
ι : Type u_1
α✝ : Type u_2
β : Type u_3
f✝ g : Perm α✝
x✝ y : α✝
inst✝² : DecidableEq α✝
inst✝¹ : Fintype α✝
α : Type u_4
inst✝ : DecidableEq α
f : Perm α
hf : IsCycle f
x : α
hx : ↑f x ≠ x
hffx : ↑f (↑f x) ≠ x
⊢ ↑(swap x (↑f x) * f) (↑f x) ≠ ↑f x
[PROOFSTEP]
simp [swap_apply_def, mul_apply, if_neg hffx, f.injective.eq_iff, if_neg hx, hx]
[GOAL]
ι : Type u_1
α✝ : Type u_2
β : Type u_3
f✝ g : Perm α✝
x✝ y✝ : α✝
inst✝² : DecidableEq α✝
inst✝¹ : Fintype α✝
α : Type u_4
inst✝ : DecidableEq α
f : Perm α
hf : IsCycle f
x : α
hx : ↑f x ≠ x
hffx : ↑f (↑f x) ≠ x
y : α
hy : ↑(swap x (↑f x) * f) y ≠ y
i : ℤ
hi : ↑(f ^ i) x = y
⊢ ↑(f ^ (i - 1)) (↑f x) = ↑(f ^ (i - 1) * f ^ 1) x
[PROOFSTEP]
simp
[GOAL]
ι : Type u_1
α✝ : Type u_2
β : Type u_3
f✝ g : Perm α✝
x✝ y✝ : α✝
inst✝² : DecidableEq α✝
inst✝¹ : Fintype α✝
α : Type u_4
inst✝ : DecidableEq α
f : Perm α
hf : IsCycle f
x : α
hx : ↑f x ≠ x
hffx : ↑f (↑f x) ≠ x
y : α
hy : ↑(swap x (↑f x) * f) y ≠ y
i : ℤ
hi : ↑(f ^ i) x = y
⊢ ↑(f ^ (i - 1) * f ^ 1) x = y
[PROOFSTEP]
rwa [← zpow_add, sub_add_cancel]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x✝ y : α
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f : Perm α
hf : IsCycle f
x : α
hx : ↑f x ≠ x ∧ ∀ ⦃y : α⦄, ↑f y ≠ y → SameCycle f x y
⊢ ↑Perm.sign f = ↑Perm.sign (swap x (↑f x) * (swap x (↑f x) * f))
[PROOFSTEP]
{rw [← mul_assoc, mul_def, mul_def, swap_swap, trans_refl]
}
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x✝ y : α
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f : Perm α
hf : IsCycle f
x : α
hx : ↑f x ≠ x ∧ ∀ ⦃y : α⦄, ↑f y ≠ y → SameCycle f x y
⊢ ↑Perm.sign f = ↑Perm.sign (swap x (↑f x) * (swap x (↑f x) * f))
[PROOFSTEP]
rw [← mul_assoc, mul_def, mul_def, swap_swap, trans_refl]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x✝ y : α
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f : Perm α
hf : IsCycle f
x : α
hx : ↑f x ≠ x ∧ ∀ ⦃y : α⦄, ↑f y ≠ y → SameCycle f x y
h1 : ↑f (↑f x) = x
⊢ ↑Perm.sign (swap x (↑f x) * (swap x (↑f x) * f)) = -(-1) ^ card (support f)
[PROOFSTEP]
have h : swap x (f x) * f = 1 := by
  simp only [mul_def, one_def]
  rw [hf.eq_swap_of_apply_apply_eq_self hx.1 h1, swap_apply_left, swap_swap]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x✝ y : α
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f : Perm α
hf : IsCycle f
x : α
hx : ↑f x ≠ x ∧ ∀ ⦃y : α⦄, ↑f y ≠ y → SameCycle f x y
h1 : ↑f (↑f x) = x
⊢ swap x (↑f x) * f = 1
[PROOFSTEP]
simp only [mul_def, one_def]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x✝ y : α
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f : Perm α
hf : IsCycle f
x : α
hx : ↑f x ≠ x ∧ ∀ ⦃y : α⦄, ↑f y ≠ y → SameCycle f x y
h1 : ↑f (↑f x) = x
⊢ f.trans (swap x (↑f x)) = Equiv.refl α
[PROOFSTEP]
rw [hf.eq_swap_of_apply_apply_eq_self hx.1 h1, swap_apply_left, swap_swap]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x✝ y : α
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f : Perm α
hf : IsCycle f
x : α
hx : ↑f x ≠ x ∧ ∀ ⦃y : α⦄, ↑f y ≠ y → SameCycle f x y
h1 : ↑f (↑f x) = x
h : swap x (↑f x) * f = 1
⊢ ↑Perm.sign (swap x (↑f x) * (swap x (↑f x) * f)) = -(-1) ^ card (support f)
[PROOFSTEP]
dsimp only
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x✝ y : α
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f : Perm α
hf : IsCycle f
x : α
hx : ↑f x ≠ x ∧ ∀ ⦃y : α⦄, ↑f y ≠ y → SameCycle f x y
h1 : ↑f (↑f x) = x
h : swap x (↑f x) * f = 1
⊢ ↑Perm.sign (swap x (↑f x) * (swap x (↑f x) * f)) = -(-1) ^ card (support f)
[PROOFSTEP]
rw [sign_mul, sign_swap hx.1.symm, h, sign_one, hf.eq_swap_of_apply_apply_eq_self hx.1 h1, card_support_swap hx.1.symm]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x✝ y : α
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f : Perm α
hf : IsCycle f
x : α
hx : ↑f x ≠ x ∧ ∀ ⦃y : α⦄, ↑f y ≠ y → SameCycle f x y
h1 : ↑f (↑f x) = x
h : swap x (↑f x) * f = 1
⊢ -1 * 1 = -(-1) ^ 2
[PROOFSTEP]
rfl
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x✝ y : α
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f : Perm α
hf : IsCycle f
x : α
hx : ↑f x ≠ x ∧ ∀ ⦃y : α⦄, ↑f y ≠ y → SameCycle f x y
h1 : ¬↑f (↑f x) = x
⊢ ↑Perm.sign (swap x (↑f x) * (swap x (↑f x) * f)) = -(-1) ^ card (support f)
[PROOFSTEP]
have h : card (support (swap x (f x) * f)) + 1 = card (support f) := by
  rw [← insert_erase (mem_support.2 hx.1), support_swap_mul_eq _ _ h1, card_insert_of_not_mem (not_mem_erase _ _),
    sdiff_singleton_eq_erase]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x✝ y : α
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f : Perm α
hf : IsCycle f
x : α
hx : ↑f x ≠ x ∧ ∀ ⦃y : α⦄, ↑f y ≠ y → SameCycle f x y
h1 : ¬↑f (↑f x) = x
⊢ card (support (swap x (↑f x) * f)) + 1 = card (support f)
[PROOFSTEP]
rw [← insert_erase (mem_support.2 hx.1), support_swap_mul_eq _ _ h1, card_insert_of_not_mem (not_mem_erase _ _),
  sdiff_singleton_eq_erase]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x✝ y : α
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f : Perm α
hf : IsCycle f
x : α
hx : ↑f x ≠ x ∧ ∀ ⦃y : α⦄, ↑f y ≠ y → SameCycle f x y
h1 : ¬↑f (↑f x) = x
h : card (support (swap x (↑f x) * f)) + 1 = card (support f)
⊢ ↑Perm.sign (swap x (↑f x) * (swap x (↑f x) * f)) = -(-1) ^ card (support f)
[PROOFSTEP]
have : card (support (swap x (f x) * f)) < card (support f) := card_support_swap_mul hx.1
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x✝ y : α
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f : Perm α
hf : IsCycle f
x : α
hx : ↑f x ≠ x ∧ ∀ ⦃y : α⦄, ↑f y ≠ y → SameCycle f x y
h1 : ¬↑f (↑f x) = x
h : card (support (swap x (↑f x) * f)) + 1 = card (support f)
this : card (support (swap x (↑f x) * f)) < card (support f)
⊢ ↑Perm.sign (swap x (↑f x) * (swap x (↑f x) * f)) = -(-1) ^ card (support f)
[PROOFSTEP]
dsimp only
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x✝ y : α
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f : Perm α
hf : IsCycle f
x : α
hx : ↑f x ≠ x ∧ ∀ ⦃y : α⦄, ↑f y ≠ y → SameCycle f x y
h1 : ¬↑f (↑f x) = x
h : card (support (swap x (↑f x) * f)) + 1 = card (support f)
this : card (support (swap x (↑f x) * f)) < card (support f)
⊢ ↑Perm.sign (swap x (↑f x) * (swap x (↑f x) * f)) = -(-1) ^ card (support f)
[PROOFSTEP]
rw [sign_mul, sign_swap hx.1.symm, (hf.swap_mul hx.1 h1).sign, ← h]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x✝ y : α
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f : Perm α
hf : IsCycle f
x : α
hx : ↑f x ≠ x ∧ ∀ ⦃y : α⦄, ↑f y ≠ y → SameCycle f x y
h1 : ¬↑f (↑f x) = x
h : card (support (swap x (↑f x) * f)) + 1 = card (support f)
this : card (support (swap x (↑f x) * f)) < card (support f)
⊢ -1 * -(-1) ^ card (support (swap x (↑f x) * f)) = -(-1) ^ (card (support (swap x (↑f x) * f)) + 1)
[PROOFSTEP]
simp only [mul_neg, neg_mul, one_mul, neg_neg, pow_add, pow_one, mul_one]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x y : α
inst✝¹ : DecidableEq α
inst✝ : Fintype α
n : ℕ
h1 : IsCycle (f ^ n)
h2 : support f ⊆ support (f ^ n)
⊢ IsCycle f
[PROOFSTEP]
have key : ∀ x : α, (f ^ n) x ≠ x ↔ f x ≠ x :=
  by
  simp_rw [← mem_support, ← Finset.ext_iff]
  exact (support_pow_le _ n).antisymm h2
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x y : α
inst✝¹ : DecidableEq α
inst✝ : Fintype α
n : ℕ
h1 : IsCycle (f ^ n)
h2 : support f ⊆ support (f ^ n)
⊢ ∀ (x : α), ↑(f ^ n) x ≠ x ↔ ↑f x ≠ x
[PROOFSTEP]
simp_rw [← mem_support, ← Finset.ext_iff]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x y : α
inst✝¹ : DecidableEq α
inst✝ : Fintype α
n : ℕ
h1 : IsCycle (f ^ n)
h2 : support f ⊆ support (f ^ n)
⊢ support (f ^ n) = support f
[PROOFSTEP]
exact (support_pow_le _ n).antisymm h2
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x y : α
inst✝¹ : DecidableEq α
inst✝ : Fintype α
n : ℕ
h1 : IsCycle (f ^ n)
h2 : support f ⊆ support (f ^ n)
key : ∀ (x : α), ↑(f ^ n) x ≠ x ↔ ↑f x ≠ x
⊢ IsCycle f
[PROOFSTEP]
obtain ⟨x, hx1, hx2⟩ := h1
[GOAL]
case intro.intro
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x✝ y : α
inst✝¹ : DecidableEq α
inst✝ : Fintype α
n : ℕ
h2 : support f ⊆ support (f ^ n)
key : ∀ (x : α), ↑(f ^ n) x ≠ x ↔ ↑f x ≠ x
x : α
hx1 : ↑(f ^ n) x ≠ x
hx2 : ∀ ⦃y : α⦄, ↑(f ^ n) y ≠ y → SameCycle (f ^ n) x y
⊢ IsCycle f
[PROOFSTEP]
refine' ⟨x, (key x).mp hx1, fun y hy => _⟩
[GOAL]
case intro.intro
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x✝ y✝ : α
inst✝¹ : DecidableEq α
inst✝ : Fintype α
n : ℕ
h2 : support f ⊆ support (f ^ n)
key : ∀ (x : α), ↑(f ^ n) x ≠ x ↔ ↑f x ≠ x
x : α
hx1 : ↑(f ^ n) x ≠ x
hx2 : ∀ ⦃y : α⦄, ↑(f ^ n) y ≠ y → SameCycle (f ^ n) x y
y : α
hy : ↑f y ≠ y
⊢ SameCycle f x y
[PROOFSTEP]
cases' hx2 ((key y).mpr hy) with i _
[GOAL]
case intro.intro.intro
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x✝ y✝ : α
inst✝¹ : DecidableEq α
inst✝ : Fintype α
n : ℕ
h2 : support f ⊆ support (f ^ n)
key : ∀ (x : α), ↑(f ^ n) x ≠ x ↔ ↑f x ≠ x
x : α
hx1 : ↑(f ^ n) x ≠ x
hx2 : ∀ ⦃y : α⦄, ↑(f ^ n) y ≠ y → SameCycle (f ^ n) x y
y : α
hy : ↑f y ≠ y
i : ℤ
h✝ : ↑((f ^ n) ^ i) x = y
⊢ SameCycle f x y
[PROOFSTEP]
exact ⟨n * i, by rwa [zpow_mul]⟩
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x✝ y✝ : α
inst✝¹ : DecidableEq α
inst✝ : Fintype α
n : ℕ
h2 : support f ⊆ support (f ^ n)
key : ∀ (x : α), ↑(f ^ n) x ≠ x ↔ ↑f x ≠ x
x : α
hx1 : ↑(f ^ n) x ≠ x
hx2 : ∀ ⦃y : α⦄, ↑(f ^ n) y ≠ y → SameCycle (f ^ n) x y
y : α
hy : ↑f y ≠ y
i : ℤ
h✝ : ↑((f ^ n) ^ i) x = y
⊢ ↑(f ^ (↑n * i)) x = y
[PROOFSTEP]
rwa [zpow_mul]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x y : α
inst✝¹ : DecidableEq α
inst✝ : Fintype α
n : ℤ
h1 : IsCycle (f ^ n)
h2 : support f ⊆ support (f ^ n)
⊢ IsCycle f
[PROOFSTEP]
cases n
[GOAL]
case ofNat
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x y : α
inst✝¹ : DecidableEq α
inst✝ : Fintype α
a✝ : ℕ
h1 : IsCycle (f ^ Int.ofNat a✝)
h2 : support f ⊆ support (f ^ Int.ofNat a✝)
⊢ IsCycle f
[PROOFSTEP]
exact h1.of_pow h2
[GOAL]
case negSucc
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x y : α
inst✝¹ : DecidableEq α
inst✝ : Fintype α
a✝ : ℕ
h1 : IsCycle (f ^ Int.negSucc a✝)
h2 : support f ⊆ support (f ^ Int.negSucc a✝)
⊢ IsCycle f
[PROOFSTEP]
simp only [le_eq_subset, zpow_negSucc, Perm.support_inv] at h1 h2 
[GOAL]
case negSucc
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x y : α
inst✝¹ : DecidableEq α
inst✝ : Fintype α
a✝ : ℕ
h1 : IsCycle (f ^ (a✝ + 1))⁻¹
h2 : support f ⊆ support (f ^ (a✝ + 1))
⊢ IsCycle f
[PROOFSTEP]
exact (inv_inv (f ^ _) ▸ h1.inv).of_pow h2
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x y : α
inst✝¹ : DecidableEq α
inst✝ : Fintype α
hf : IsCycle f
hg : IsCycle g
h : support f ⊆ support g
h' : ∀ (x : α), x ∈ support f → ↑f x = ↑g x
⊢ f = g
[PROOFSTEP]
have : f.support = g.support := by
  refine' le_antisymm h _
  intro z hz
  obtain ⟨x, hx, _⟩ := id hf
  have hx' : g x ≠ x := by rwa [← h' x (mem_support.mpr hx)]
  obtain ⟨m, hm⟩ := hg.exists_pow_eq hx' (mem_support.mp hz)
  have h'' : ∀ x ∈ f.support ∩ g.support, f x = g x := by
    intro x hx
    exact h' x (mem_of_mem_inter_left hx)
  rwa [← hm, ← pow_eq_on_of_mem_support h'' _ x (mem_inter_of_mem (mem_support.mpr hx) (mem_support.mpr hx')),
    pow_apply_mem_support, mem_support]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x y : α
inst✝¹ : DecidableEq α
inst✝ : Fintype α
hf : IsCycle f
hg : IsCycle g
h : support f ⊆ support g
h' : ∀ (x : α), x ∈ support f → ↑f x = ↑g x
⊢ support f = support g
[PROOFSTEP]
refine' le_antisymm h _
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x y : α
inst✝¹ : DecidableEq α
inst✝ : Fintype α
hf : IsCycle f
hg : IsCycle g
h : support f ⊆ support g
h' : ∀ (x : α), x ∈ support f → ↑f x = ↑g x
⊢ support g ≤ support f
[PROOFSTEP]
intro z hz
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x y : α
inst✝¹ : DecidableEq α
inst✝ : Fintype α
hf : IsCycle f
hg : IsCycle g
h : support f ⊆ support g
h' : ∀ (x : α), x ∈ support f → ↑f x = ↑g x
z : α
hz : z ∈ support g
⊢ z ∈ support f
[PROOFSTEP]
obtain ⟨x, hx, _⟩ := id hf
[GOAL]
case intro.intro
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x✝ y : α
inst✝¹ : DecidableEq α
inst✝ : Fintype α
hf : IsCycle f
hg : IsCycle g
h : support f ⊆ support g
h' : ∀ (x : α), x ∈ support f → ↑f x = ↑g x
z : α
hz : z ∈ support g
x : α
hx : ↑f x ≠ x
right✝ : ∀ ⦃y : α⦄, ↑f y ≠ y → SameCycle f x y
⊢ z ∈ support f
[PROOFSTEP]
have hx' : g x ≠ x := by rwa [← h' x (mem_support.mpr hx)]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x✝ y : α
inst✝¹ : DecidableEq α
inst✝ : Fintype α
hf : IsCycle f
hg : IsCycle g
h : support f ⊆ support g
h' : ∀ (x : α), x ∈ support f → ↑f x = ↑g x
z : α
hz : z ∈ support g
x : α
hx : ↑f x ≠ x
right✝ : ∀ ⦃y : α⦄, ↑f y ≠ y → SameCycle f x y
⊢ ↑g x ≠ x
[PROOFSTEP]
rwa [← h' x (mem_support.mpr hx)]
[GOAL]
case intro.intro
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x✝ y : α
inst✝¹ : DecidableEq α
inst✝ : Fintype α
hf : IsCycle f
hg : IsCycle g
h : support f ⊆ support g
h' : ∀ (x : α), x ∈ support f → ↑f x = ↑g x
z : α
hz : z ∈ support g
x : α
hx : ↑f x ≠ x
right✝ : ∀ ⦃y : α⦄, ↑f y ≠ y → SameCycle f x y
hx' : ↑g x ≠ x
⊢ z ∈ support f
[PROOFSTEP]
obtain ⟨m, hm⟩ := hg.exists_pow_eq hx' (mem_support.mp hz)
[GOAL]
case intro.intro.intro
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x✝ y : α
inst✝¹ : DecidableEq α
inst✝ : Fintype α
hf : IsCycle f
hg : IsCycle g
h : support f ⊆ support g
h' : ∀ (x : α), x ∈ support f → ↑f x = ↑g x
z : α
hz : z ∈ support g
x : α
hx : ↑f x ≠ x
right✝ : ∀ ⦃y : α⦄, ↑f y ≠ y → SameCycle f x y
hx' : ↑g x ≠ x
m : ℕ
hm : ↑(g ^ m) x = z
⊢ z ∈ support f
[PROOFSTEP]
have h'' : ∀ x ∈ f.support ∩ g.support, f x = g x := by
  intro x hx
  exact h' x (mem_of_mem_inter_left hx)
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x✝ y : α
inst✝¹ : DecidableEq α
inst✝ : Fintype α
hf : IsCycle f
hg : IsCycle g
h : support f ⊆ support g
h' : ∀ (x : α), x ∈ support f → ↑f x = ↑g x
z : α
hz : z ∈ support g
x : α
hx : ↑f x ≠ x
right✝ : ∀ ⦃y : α⦄, ↑f y ≠ y → SameCycle f x y
hx' : ↑g x ≠ x
m : ℕ
hm : ↑(g ^ m) x = z
⊢ ∀ (x : α), x ∈ support f ∩ support g → ↑f x = ↑g x
[PROOFSTEP]
intro x hx
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x✝¹ y : α
inst✝¹ : DecidableEq α
inst✝ : Fintype α
hf : IsCycle f
hg : IsCycle g
h : support f ⊆ support g
h' : ∀ (x : α), x ∈ support f → ↑f x = ↑g x
z : α
hz : z ∈ support g
x✝ : α
hx✝ : ↑f x✝ ≠ x✝
right✝ : ∀ ⦃y : α⦄, ↑f y ≠ y → SameCycle f x✝ y
hx' : ↑g x✝ ≠ x✝
m : ℕ
hm : ↑(g ^ m) x✝ = z
x : α
hx : x ∈ support f ∩ support g
⊢ ↑f x = ↑g x
[PROOFSTEP]
exact h' x (mem_of_mem_inter_left hx)
[GOAL]
case intro.intro.intro
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x✝ y : α
inst✝¹ : DecidableEq α
inst✝ : Fintype α
hf : IsCycle f
hg : IsCycle g
h : support f ⊆ support g
h' : ∀ (x : α), x ∈ support f → ↑f x = ↑g x
z : α
hz : z ∈ support g
x : α
hx : ↑f x ≠ x
right✝ : ∀ ⦃y : α⦄, ↑f y ≠ y → SameCycle f x y
hx' : ↑g x ≠ x
m : ℕ
hm : ↑(g ^ m) x = z
h'' : ∀ (x : α), x ∈ support f ∩ support g → ↑f x = ↑g x
⊢ z ∈ support f
[PROOFSTEP]
rwa [← hm, ← pow_eq_on_of_mem_support h'' _ x (mem_inter_of_mem (mem_support.mpr hx) (mem_support.mpr hx')),
  pow_apply_mem_support, mem_support]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x y : α
inst✝¹ : DecidableEq α
inst✝ : Fintype α
hf : IsCycle f
hg : IsCycle g
h : support f ⊆ support g
h' : ∀ (x : α), x ∈ support f → ↑f x = ↑g x
this : support f = support g
⊢ f = g
[PROOFSTEP]
refine' Equiv.Perm.support_congr h _
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x y : α
inst✝¹ : DecidableEq α
inst✝ : Fintype α
hf : IsCycle f
hg : IsCycle g
h : support f ⊆ support g
h' : ∀ (x : α), x ∈ support f → ↑f x = ↑g x
this : support f = support g
⊢ ∀ (x : α), x ∈ support g → ↑f x = ↑g x
[PROOFSTEP]
simpa [← this] using h'
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x y : α
inst✝¹ : DecidableEq α
inst✝ : Fintype α
hf : IsCycle f
hg : IsCycle g
h : ∀ (x : α), x ∈ support f ∩ support g → ↑f x = ↑g x
hx : ↑f x = ↑g x
hx' : x ∈ support f
⊢ f = g
[PROOFSTEP]
have hx'' : x ∈ g.support := by rwa [mem_support, ← hx, ← mem_support]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x y : α
inst✝¹ : DecidableEq α
inst✝ : Fintype α
hf : IsCycle f
hg : IsCycle g
h : ∀ (x : α), x ∈ support f ∩ support g → ↑f x = ↑g x
hx : ↑f x = ↑g x
hx' : x ∈ support f
⊢ x ∈ support g
[PROOFSTEP]
rwa [mem_support, ← hx, ← mem_support]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x y : α
inst✝¹ : DecidableEq α
inst✝ : Fintype α
hf : IsCycle f
hg : IsCycle g
h : ∀ (x : α), x ∈ support f ∩ support g → ↑f x = ↑g x
hx : ↑f x = ↑g x
hx' : x ∈ support f
hx'' : x ∈ support g
⊢ f = g
[PROOFSTEP]
have : f.support ⊆ g.support := by
  intro y hy
  obtain ⟨k, rfl⟩ := hf.exists_pow_eq (mem_support.mp hx') (mem_support.mp hy)
  rwa [pow_eq_on_of_mem_support h _ _ (mem_inter_of_mem hx' hx''), pow_apply_mem_support]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x y : α
inst✝¹ : DecidableEq α
inst✝ : Fintype α
hf : IsCycle f
hg : IsCycle g
h : ∀ (x : α), x ∈ support f ∩ support g → ↑f x = ↑g x
hx : ↑f x = ↑g x
hx' : x ∈ support f
hx'' : x ∈ support g
⊢ support f ⊆ support g
[PROOFSTEP]
intro y hy
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x y✝ : α
inst✝¹ : DecidableEq α
inst✝ : Fintype α
hf : IsCycle f
hg : IsCycle g
h : ∀ (x : α), x ∈ support f ∩ support g → ↑f x = ↑g x
hx : ↑f x = ↑g x
hx' : x ∈ support f
hx'' : x ∈ support g
y : α
hy : y ∈ support f
⊢ y ∈ support g
[PROOFSTEP]
obtain ⟨k, rfl⟩ := hf.exists_pow_eq (mem_support.mp hx') (mem_support.mp hy)
[GOAL]
case intro
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x y : α
inst✝¹ : DecidableEq α
inst✝ : Fintype α
hf : IsCycle f
hg : IsCycle g
h : ∀ (x : α), x ∈ support f ∩ support g → ↑f x = ↑g x
hx : ↑f x = ↑g x
hx' : x ∈ support f
hx'' : x ∈ support g
k : ℕ
hy : ↑(f ^ k) x ∈ support f
⊢ ↑(f ^ k) x ∈ support g
[PROOFSTEP]
rwa [pow_eq_on_of_mem_support h _ _ (mem_inter_of_mem hx' hx''), pow_apply_mem_support]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x y : α
inst✝¹ : DecidableEq α
inst✝ : Fintype α
hf : IsCycle f
hg : IsCycle g
h : ∀ (x : α), x ∈ support f ∩ support g → ↑f x = ↑g x
hx : ↑f x = ↑g x
hx' : x ∈ support f
hx'' : x ∈ support g
this : support f ⊆ support g
⊢ f = g
[PROOFSTEP]
rw [(inter_eq_left_iff_subset _ _).mpr this] at h 
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x y : α
inst✝¹ : DecidableEq α
inst✝ : Fintype α
hf : IsCycle f
hg : IsCycle g
h : ∀ (x : α), x ∈ support f → ↑f x = ↑g x
hx : ↑f x = ↑g x
hx' : x ∈ support f
hx'' : x ∈ support g
this : support f ⊆ support g
⊢ f = g
[PROOFSTEP]
exact hf.support_congr hg this h
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x y : α
inst✝¹ : DecidableEq α
inst✝ : Fintype α
hf : IsCycle f
n : ℕ
⊢ support (f ^ n) = support f ↔ ¬orderOf f ∣ n
[PROOFSTEP]
rw [orderOf_dvd_iff_pow_eq_one]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x y : α
inst✝¹ : DecidableEq α
inst✝ : Fintype α
hf : IsCycle f
n : ℕ
⊢ support (f ^ n) = support f ↔ ¬f ^ n = 1
[PROOFSTEP]
constructor
[GOAL]
case mp
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x y : α
inst✝¹ : DecidableEq α
inst✝ : Fintype α
hf : IsCycle f
n : ℕ
⊢ support (f ^ n) = support f → ¬f ^ n = 1
[PROOFSTEP]
intro h H
[GOAL]
case mp
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x y : α
inst✝¹ : DecidableEq α
inst✝ : Fintype α
hf : IsCycle f
n : ℕ
h : support (f ^ n) = support f
H : f ^ n = 1
⊢ False
[PROOFSTEP]
refine' hf.ne_one _
[GOAL]
case mp
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x y : α
inst✝¹ : DecidableEq α
inst✝ : Fintype α
hf : IsCycle f
n : ℕ
h : support (f ^ n) = support f
H : f ^ n = 1
⊢ f = 1
[PROOFSTEP]
rw [← support_eq_empty_iff, ← h, H, support_one]
[GOAL]
case mpr
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x y : α
inst✝¹ : DecidableEq α
inst✝ : Fintype α
hf : IsCycle f
n : ℕ
⊢ ¬f ^ n = 1 → support (f ^ n) = support f
[PROOFSTEP]
intro H
[GOAL]
case mpr
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x y : α
inst✝¹ : DecidableEq α
inst✝ : Fintype α
hf : IsCycle f
n : ℕ
H : ¬f ^ n = 1
⊢ support (f ^ n) = support f
[PROOFSTEP]
apply le_antisymm (support_pow_le _ n) _
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x y : α
inst✝¹ : DecidableEq α
inst✝ : Fintype α
hf : IsCycle f
n : ℕ
H : ¬f ^ n = 1
⊢ support f ≤ support (f ^ n)
[PROOFSTEP]
intro x hx
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x✝ y : α
inst✝¹ : DecidableEq α
inst✝ : Fintype α
hf : IsCycle f
n : ℕ
H : ¬f ^ n = 1
x : α
hx : x ∈ support f
⊢ x ∈ support (f ^ n)
[PROOFSTEP]
contrapose! H
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x✝ y : α
inst✝¹ : DecidableEq α
inst✝ : Fintype α
hf : IsCycle f
n : ℕ
x : α
hx : x ∈ support f
H : ¬x ∈ support (f ^ n)
⊢ f ^ n = 1
[PROOFSTEP]
ext z
[GOAL]
case H
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x✝ y : α
inst✝¹ : DecidableEq α
inst✝ : Fintype α
hf : IsCycle f
n : ℕ
x : α
hx : x ∈ support f
H : ¬x ∈ support (f ^ n)
z : α
⊢ ↑(f ^ n) z = ↑1 z
[PROOFSTEP]
by_cases hz : f z = z
[GOAL]
case pos
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x✝ y : α
inst✝¹ : DecidableEq α
inst✝ : Fintype α
hf : IsCycle f
n : ℕ
x : α
hx : x ∈ support f
H : ¬x ∈ support (f ^ n)
z : α
hz : ↑f z = z
⊢ ↑(f ^ n) z = ↑1 z
[PROOFSTEP]
rw [pow_apply_eq_self_of_apply_eq_self hz, one_apply]
[GOAL]
case neg
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x✝ y : α
inst✝¹ : DecidableEq α
inst✝ : Fintype α
hf : IsCycle f
n : ℕ
x : α
hx : x ∈ support f
H : ¬x ∈ support (f ^ n)
z : α
hz : ¬↑f z = z
⊢ ↑(f ^ n) z = ↑1 z
[PROOFSTEP]
obtain ⟨k, rfl⟩ := hf.exists_pow_eq hz (mem_support.mp hx)
[GOAL]
case neg.intro
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x y : α
inst✝¹ : DecidableEq α
inst✝ : Fintype α
hf : IsCycle f
n : ℕ
z : α
hz : ¬↑f z = z
k : ℕ
hx : ↑(f ^ k) z ∈ support f
H : ¬↑(f ^ k) z ∈ support (f ^ n)
⊢ ↑(f ^ n) z = ↑1 z
[PROOFSTEP]
apply (f ^ k).injective
[GOAL]
case neg.intro.a
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x y : α
inst✝¹ : DecidableEq α
inst✝ : Fintype α
hf : IsCycle f
n : ℕ
z : α
hz : ¬↑f z = z
k : ℕ
hx : ↑(f ^ k) z ∈ support f
H : ¬↑(f ^ k) z ∈ support (f ^ n)
⊢ ↑(f ^ k) (↑(f ^ n) z) = ↑(f ^ k) (↑1 z)
[PROOFSTEP]
rw [← mul_apply, (Commute.pow_pow_self _ _ _).eq, mul_apply]
[GOAL]
case neg.intro.a
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
x y : α
inst✝¹ : DecidableEq α
inst✝ : Fintype α
hf : IsCycle f
n : ℕ
z : α
hz : ¬↑f z = z
k : ℕ
hx : ↑(f ^ k) z ∈ support f
H : ¬↑(f ^ k) z ∈ support (f ^ n)
⊢ ↑(f ^ n) (↑(f ^ k) z) = ↑(f ^ k) (↑1 z)
[PROOFSTEP]
simpa using H
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x y : α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : Finite β
f : Perm β
hf : IsCycle f
n : ℕ
⊢ IsCycle (f ^ n) ↔ Nat.coprime n (orderOf f)
[PROOFSTEP]
classical
cases nonempty_fintype β
constructor
· intro h
  have hr : support (f ^ n) = support f := by
    rw [hf.support_pow_eq_iff]
    rintro ⟨k, rfl⟩
    refine' h.ne_one _
    simp [pow_mul, pow_orderOf_eq_one]
  have : orderOf (f ^ n) = orderOf f := by rw [h.orderOf, hr, hf.orderOf]
  rw [orderOf_pow, Nat.div_eq_self] at this 
  cases' this with h
  · exact absurd h (orderOf_pos _).ne'
  · rwa [Nat.coprime_iff_gcd_eq_one, Nat.gcd_comm]
· intro h
  obtain ⟨m, hm⟩ := exists_pow_eq_self_of_coprime h
  have hf' : IsCycle ((f ^ n) ^ m) := by rwa [hm]
  refine' hf'.of_pow fun x hx => _
  rw [hm]
  exact support_pow_le _ n hx
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x y : α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : Finite β
f : Perm β
hf : IsCycle f
n : ℕ
⊢ IsCycle (f ^ n) ↔ Nat.coprime n (orderOf f)
[PROOFSTEP]
cases nonempty_fintype β
[GOAL]
case intro
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x y : α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : Finite β
f : Perm β
hf : IsCycle f
n : ℕ
val✝ : Fintype β
⊢ IsCycle (f ^ n) ↔ Nat.coprime n (orderOf f)
[PROOFSTEP]
constructor
[GOAL]
case intro.mp
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x y : α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : Finite β
f : Perm β
hf : IsCycle f
n : ℕ
val✝ : Fintype β
⊢ IsCycle (f ^ n) → Nat.coprime n (orderOf f)
[PROOFSTEP]
intro h
[GOAL]
case intro.mp
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x y : α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : Finite β
f : Perm β
hf : IsCycle f
n : ℕ
val✝ : Fintype β
h : IsCycle (f ^ n)
⊢ Nat.coprime n (orderOf f)
[PROOFSTEP]
have hr : support (f ^ n) = support f := by
  rw [hf.support_pow_eq_iff]
  rintro ⟨k, rfl⟩
  refine' h.ne_one _
  simp [pow_mul, pow_orderOf_eq_one]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x y : α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : Finite β
f : Perm β
hf : IsCycle f
n : ℕ
val✝ : Fintype β
h : IsCycle (f ^ n)
⊢ support (f ^ n) = support f
[PROOFSTEP]
rw [hf.support_pow_eq_iff]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x y : α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : Finite β
f : Perm β
hf : IsCycle f
n : ℕ
val✝ : Fintype β
h : IsCycle (f ^ n)
⊢ ¬orderOf f ∣ n
[PROOFSTEP]
rintro ⟨k, rfl⟩
[GOAL]
case intro
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x y : α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : Finite β
f : Perm β
hf : IsCycle f
val✝ : Fintype β
k : ℕ
h : IsCycle (f ^ (orderOf f * k))
⊢ False
[PROOFSTEP]
refine' h.ne_one _
[GOAL]
case intro
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x y : α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : Finite β
f : Perm β
hf : IsCycle f
val✝ : Fintype β
k : ℕ
h : IsCycle (f ^ (orderOf f * k))
⊢ f ^ (orderOf f * k) = 1
[PROOFSTEP]
simp [pow_mul, pow_orderOf_eq_one]
[GOAL]
case intro.mp
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x y : α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : Finite β
f : Perm β
hf : IsCycle f
n : ℕ
val✝ : Fintype β
h : IsCycle (f ^ n)
hr : support (f ^ n) = support f
⊢ Nat.coprime n (orderOf f)
[PROOFSTEP]
have : orderOf (f ^ n) = orderOf f := by rw [h.orderOf, hr, hf.orderOf]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x y : α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : Finite β
f : Perm β
hf : IsCycle f
n : ℕ
val✝ : Fintype β
h : IsCycle (f ^ n)
hr : support (f ^ n) = support f
⊢ orderOf (f ^ n) = orderOf f
[PROOFSTEP]
rw [h.orderOf, hr, hf.orderOf]
[GOAL]
case intro.mp
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x y : α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : Finite β
f : Perm β
hf : IsCycle f
n : ℕ
val✝ : Fintype β
h : IsCycle (f ^ n)
hr : support (f ^ n) = support f
this : orderOf (f ^ n) = orderOf f
⊢ Nat.coprime n (orderOf f)
[PROOFSTEP]
rw [orderOf_pow, Nat.div_eq_self] at this 
[GOAL]
case intro.mp
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x y : α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : Finite β
f : Perm β
hf : IsCycle f
n : ℕ
val✝ : Fintype β
h : IsCycle (f ^ n)
hr : support (f ^ n) = support f
this : orderOf f = 0 ∨ Nat.gcd (orderOf f) n = 1
⊢ Nat.coprime n (orderOf f)
[PROOFSTEP]
cases' this with h
[GOAL]
case intro.mp.inl
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x y : α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : Finite β
f : Perm β
hf : IsCycle f
n : ℕ
val✝ : Fintype β
h✝ : IsCycle (f ^ n)
hr : support (f ^ n) = support f
h : orderOf f = 0
⊢ Nat.coprime n (orderOf f)
[PROOFSTEP]
exact absurd h (orderOf_pos _).ne'
[GOAL]
case intro.mp.inr
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x y : α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : Finite β
f : Perm β
hf : IsCycle f
n : ℕ
val✝ : Fintype β
h : IsCycle (f ^ n)
hr : support (f ^ n) = support f
h✝ : Nat.gcd (orderOf f) n = 1
⊢ Nat.coprime n (orderOf f)
[PROOFSTEP]
rwa [Nat.coprime_iff_gcd_eq_one, Nat.gcd_comm]
[GOAL]
case intro.mpr
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x y : α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : Finite β
f : Perm β
hf : IsCycle f
n : ℕ
val✝ : Fintype β
⊢ Nat.coprime n (orderOf f) → IsCycle (f ^ n)
[PROOFSTEP]
intro h
[GOAL]
case intro.mpr
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x y : α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : Finite β
f : Perm β
hf : IsCycle f
n : ℕ
val✝ : Fintype β
h : Nat.coprime n (orderOf f)
⊢ IsCycle (f ^ n)
[PROOFSTEP]
obtain ⟨m, hm⟩ := exists_pow_eq_self_of_coprime h
[GOAL]
case intro.mpr.intro
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x y : α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : Finite β
f : Perm β
hf : IsCycle f
n : ℕ
val✝ : Fintype β
h : Nat.coprime n (orderOf f)
m : ℕ
hm : (f ^ n) ^ m = f
⊢ IsCycle (f ^ n)
[PROOFSTEP]
have hf' : IsCycle ((f ^ n) ^ m) := by rwa [hm]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x y : α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : Finite β
f : Perm β
hf : IsCycle f
n : ℕ
val✝ : Fintype β
h : Nat.coprime n (orderOf f)
m : ℕ
hm : (f ^ n) ^ m = f
⊢ IsCycle ((f ^ n) ^ m)
[PROOFSTEP]
rwa [hm]
[GOAL]
case intro.mpr.intro
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x y : α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : Finite β
f : Perm β
hf : IsCycle f
n : ℕ
val✝ : Fintype β
h : Nat.coprime n (orderOf f)
m : ℕ
hm : (f ^ n) ^ m = f
hf' : IsCycle ((f ^ n) ^ m)
⊢ IsCycle (f ^ n)
[PROOFSTEP]
refine' hf'.of_pow fun x hx => _
[GOAL]
case intro.mpr.intro
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x✝ y : α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : Finite β
f : Perm β
hf : IsCycle f
n : ℕ
val✝ : Fintype β
h : Nat.coprime n (orderOf f)
m : ℕ
hm : (f ^ n) ^ m = f
hf' : IsCycle ((f ^ n) ^ m)
x : β
hx : x ∈ support (f ^ n)
⊢ x ∈ support ((f ^ n) ^ m)
[PROOFSTEP]
rw [hm]
[GOAL]
case intro.mpr.intro
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x✝ y : α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : Finite β
f : Perm β
hf : IsCycle f
n : ℕ
val✝ : Fintype β
h : Nat.coprime n (orderOf f)
m : ℕ
hm : (f ^ n) ^ m = f
hf' : IsCycle ((f ^ n) ^ m)
x : β
hx : x ∈ support (f ^ n)
⊢ x ∈ support f
[PROOFSTEP]
exact support_pow_le _ n hx
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x y : α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : Finite β
f : Perm β
hf : IsCycle f
n : ℕ
⊢ f ^ n = 1 ↔ ∃ x, ↑f x ≠ x ∧ ↑(f ^ n) x = x
[PROOFSTEP]
classical
cases nonempty_fintype β
constructor
· intro h
  obtain ⟨x, hx, -⟩ := id hf
  exact ⟨x, hx, by simp [h]⟩
· rintro ⟨x, hx, hx'⟩
  by_cases h : support (f ^ n) = support f
  · rw [← mem_support, ← h, mem_support] at hx 
    contradiction
  · rw [hf.support_pow_eq_iff, Classical.not_not] at h 
    obtain ⟨k, rfl⟩ := h
    rw [pow_mul, pow_orderOf_eq_one, one_pow]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x y : α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : Finite β
f : Perm β
hf : IsCycle f
n : ℕ
⊢ f ^ n = 1 ↔ ∃ x, ↑f x ≠ x ∧ ↑(f ^ n) x = x
[PROOFSTEP]
cases nonempty_fintype β
[GOAL]
case intro
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x y : α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : Finite β
f : Perm β
hf : IsCycle f
n : ℕ
val✝ : Fintype β
⊢ f ^ n = 1 ↔ ∃ x, ↑f x ≠ x ∧ ↑(f ^ n) x = x
[PROOFSTEP]
constructor
[GOAL]
case intro.mp
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x y : α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : Finite β
f : Perm β
hf : IsCycle f
n : ℕ
val✝ : Fintype β
⊢ f ^ n = 1 → ∃ x, ↑f x ≠ x ∧ ↑(f ^ n) x = x
[PROOFSTEP]
intro h
[GOAL]
case intro.mp
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x y : α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : Finite β
f : Perm β
hf : IsCycle f
n : ℕ
val✝ : Fintype β
h : f ^ n = 1
⊢ ∃ x, ↑f x ≠ x ∧ ↑(f ^ n) x = x
[PROOFSTEP]
obtain ⟨x, hx, -⟩ := id hf
[GOAL]
case intro.mp.intro.intro
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x✝ y : α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : Finite β
f : Perm β
hf : IsCycle f
n : ℕ
val✝ : Fintype β
h : f ^ n = 1
x : β
hx : ↑f x ≠ x
⊢ ∃ x, ↑f x ≠ x ∧ ↑(f ^ n) x = x
[PROOFSTEP]
exact ⟨x, hx, by simp [h]⟩
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x✝ y : α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : Finite β
f : Perm β
hf : IsCycle f
n : ℕ
val✝ : Fintype β
h : f ^ n = 1
x : β
hx : ↑f x ≠ x
⊢ ↑(f ^ n) x = x
[PROOFSTEP]
simp [h]
[GOAL]
case intro.mpr
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x y : α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : Finite β
f : Perm β
hf : IsCycle f
n : ℕ
val✝ : Fintype β
⊢ (∃ x, ↑f x ≠ x ∧ ↑(f ^ n) x = x) → f ^ n = 1
[PROOFSTEP]
rintro ⟨x, hx, hx'⟩
[GOAL]
case intro.mpr.intro.intro
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x✝ y : α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : Finite β
f : Perm β
hf : IsCycle f
n : ℕ
val✝ : Fintype β
x : β
hx : ↑f x ≠ x
hx' : ↑(f ^ n) x = x
⊢ f ^ n = 1
[PROOFSTEP]
by_cases h : support (f ^ n) = support f
[GOAL]
case pos
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x✝ y : α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : Finite β
f : Perm β
hf : IsCycle f
n : ℕ
val✝ : Fintype β
x : β
hx : ↑f x ≠ x
hx' : ↑(f ^ n) x = x
h : support (f ^ n) = support f
⊢ f ^ n = 1
[PROOFSTEP]
rw [← mem_support, ← h, mem_support] at hx 
[GOAL]
case pos
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x✝ y : α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : Finite β
f : Perm β
hf : IsCycle f
n : ℕ
val✝ : Fintype β
x : β
hx✝ : ↑f x ≠ x
hx : ↑(f ^ n) x ≠ x
hx' : ↑(f ^ n) x = x
h : support (f ^ n) = support f
⊢ f ^ n = 1
[PROOFSTEP]
contradiction
[GOAL]
case neg
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x✝ y : α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : Finite β
f : Perm β
hf : IsCycle f
n : ℕ
val✝ : Fintype β
x : β
hx : ↑f x ≠ x
hx' : ↑(f ^ n) x = x
h : ¬support (f ^ n) = support f
⊢ f ^ n = 1
[PROOFSTEP]
rw [hf.support_pow_eq_iff, Classical.not_not] at h 
[GOAL]
case neg
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x✝ y : α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : Finite β
f : Perm β
hf : IsCycle f
n : ℕ
val✝ : Fintype β
x : β
hx : ↑f x ≠ x
hx' : ↑(f ^ n) x = x
h : orderOf f ∣ n
⊢ f ^ n = 1
[PROOFSTEP]
obtain ⟨k, rfl⟩ := h
[GOAL]
case neg.intro
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x✝ y : α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : Finite β
f : Perm β
hf : IsCycle f
val✝ : Fintype β
x : β
hx : ↑f x ≠ x
k : ℕ
hx' : ↑(f ^ (orderOf f * k)) x = x
⊢ f ^ (orderOf f * k) = 1
[PROOFSTEP]
rw [pow_mul, pow_orderOf_eq_one, one_pow]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x y : α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : Finite β
f : Perm β
hf : IsCycle f
a b : ℕ
⊢ f ^ a = f ^ b ↔ ∃ x, ↑f x ≠ x ∧ ↑(f ^ a) x = ↑(f ^ b) x
[PROOFSTEP]
classical
cases nonempty_fintype β
constructor
· intro h
  obtain ⟨x, hx, -⟩ := id hf
  exact ⟨x, hx, by simp [h]⟩
· rintro ⟨x, hx, hx'⟩
  wlog hab : a ≤ b generalizing a b
  · exact (this hx'.symm (le_of_not_le hab)).symm
  suffices f ^ (b - a) = 1 by
    rw [pow_sub _ hab, mul_inv_eq_one] at this 
    rw [this]
  rw [hf.pow_eq_one_iff]
  by_cases hfa : (f ^ a) x ∈ f.support
  · refine' ⟨(f ^ a) x, mem_support.mp hfa, _⟩
    simp only [pow_sub _ hab, Equiv.Perm.coe_mul, Function.comp_apply, inv_apply_self, ← hx']
  · have h := @Equiv.Perm.zpow_apply_comm _ f 1 a x
    simp only [zpow_one, zpow_ofNat] at h 
    rw [not_mem_support, h, Function.Injective.eq_iff (f ^ a).injective] at hfa 
    contradiction
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x y : α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : Finite β
f : Perm β
hf : IsCycle f
a b : ℕ
⊢ f ^ a = f ^ b ↔ ∃ x, ↑f x ≠ x ∧ ↑(f ^ a) x = ↑(f ^ b) x
[PROOFSTEP]
cases nonempty_fintype β
[GOAL]
case intro
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x y : α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : Finite β
f : Perm β
hf : IsCycle f
a b : ℕ
val✝ : Fintype β
⊢ f ^ a = f ^ b ↔ ∃ x, ↑f x ≠ x ∧ ↑(f ^ a) x = ↑(f ^ b) x
[PROOFSTEP]
constructor
[GOAL]
case intro.mp
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x y : α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : Finite β
f : Perm β
hf : IsCycle f
a b : ℕ
val✝ : Fintype β
⊢ f ^ a = f ^ b → ∃ x, ↑f x ≠ x ∧ ↑(f ^ a) x = ↑(f ^ b) x
[PROOFSTEP]
intro h
[GOAL]
case intro.mp
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x y : α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : Finite β
f : Perm β
hf : IsCycle f
a b : ℕ
val✝ : Fintype β
h : f ^ a = f ^ b
⊢ ∃ x, ↑f x ≠ x ∧ ↑(f ^ a) x = ↑(f ^ b) x
[PROOFSTEP]
obtain ⟨x, hx, -⟩ := id hf
[GOAL]
case intro.mp.intro.intro
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x✝ y : α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : Finite β
f : Perm β
hf : IsCycle f
a b : ℕ
val✝ : Fintype β
h : f ^ a = f ^ b
x : β
hx : ↑f x ≠ x
⊢ ∃ x, ↑f x ≠ x ∧ ↑(f ^ a) x = ↑(f ^ b) x
[PROOFSTEP]
exact ⟨x, hx, by simp [h]⟩
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x✝ y : α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : Finite β
f : Perm β
hf : IsCycle f
a b : ℕ
val✝ : Fintype β
h : f ^ a = f ^ b
x : β
hx : ↑f x ≠ x
⊢ ↑(f ^ a) x = ↑(f ^ b) x
[PROOFSTEP]
simp [h]
[GOAL]
case intro.mpr
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x y : α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : Finite β
f : Perm β
hf : IsCycle f
a b : ℕ
val✝ : Fintype β
⊢ (∃ x, ↑f x ≠ x ∧ ↑(f ^ a) x = ↑(f ^ b) x) → f ^ a = f ^ b
[PROOFSTEP]
rintro ⟨x, hx, hx'⟩
[GOAL]
case intro.mpr.intro.intro
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x✝ y : α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : Finite β
f : Perm β
hf : IsCycle f
a b : ℕ
val✝ : Fintype β
x : β
hx : ↑f x ≠ x
hx' : ↑(f ^ a) x = ↑(f ^ b) x
⊢ f ^ a = f ^ b
[PROOFSTEP]
wlog hab : a ≤ b generalizing a b
[GOAL]
case intro.mpr.intro.intro.inr
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x✝ y : α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : Finite β
f : Perm β
hf : IsCycle f
a b : ℕ
val✝ : Fintype β
x : β
hx : ↑f x ≠ x
hx' : ↑(f ^ a) x = ↑(f ^ b) x
this : ∀ {a b : ℕ}, ↑(f ^ a) x = ↑(f ^ b) x → a ≤ b → f ^ a = f ^ b
hab : ¬a ≤ b
⊢ f ^ a = f ^ b
[PROOFSTEP]
exact (this hx'.symm (le_of_not_le hab)).symm
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x✝ y : α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : Finite β
f : Perm β
hf : IsCycle f
val✝ : Fintype β
x : β
hx : ↑f x ≠ x
a b : ℕ
hx' : ↑(f ^ a) x = ↑(f ^ b) x
hab : a ≤ b
⊢ f ^ a = f ^ b
[PROOFSTEP]
suffices f ^ (b - a) = 1 by
  rw [pow_sub _ hab, mul_inv_eq_one] at this 
  rw [this]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x✝ y : α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : Finite β
f : Perm β
hf : IsCycle f
val✝ : Fintype β
x : β
hx : ↑f x ≠ x
a b : ℕ
hx' : ↑(f ^ a) x = ↑(f ^ b) x
hab : a ≤ b
this : f ^ (b - a) = 1
⊢ f ^ a = f ^ b
[PROOFSTEP]
rw [pow_sub _ hab, mul_inv_eq_one] at this 
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x✝ y : α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : Finite β
f : Perm β
hf : IsCycle f
val✝ : Fintype β
x : β
hx : ↑f x ≠ x
a b : ℕ
hx' : ↑(f ^ a) x = ↑(f ^ b) x
hab : a ≤ b
this : f ^ b = f ^ a
⊢ f ^ a = f ^ b
[PROOFSTEP]
rw [this]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x✝ y : α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : Finite β
f : Perm β
hf : IsCycle f
val✝ : Fintype β
x : β
hx : ↑f x ≠ x
a b : ℕ
hx' : ↑(f ^ a) x = ↑(f ^ b) x
hab : a ≤ b
⊢ f ^ (b - a) = 1
[PROOFSTEP]
rw [hf.pow_eq_one_iff]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x✝ y : α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : Finite β
f : Perm β
hf : IsCycle f
val✝ : Fintype β
x : β
hx : ↑f x ≠ x
a b : ℕ
hx' : ↑(f ^ a) x = ↑(f ^ b) x
hab : a ≤ b
⊢ ∃ x, ↑f x ≠ x ∧ ↑(f ^ (b - a)) x = x
[PROOFSTEP]
by_cases hfa : (f ^ a) x ∈ f.support
[GOAL]
case pos
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x✝ y : α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : Finite β
f : Perm β
hf : IsCycle f
val✝ : Fintype β
x : β
hx : ↑f x ≠ x
a b : ℕ
hx' : ↑(f ^ a) x = ↑(f ^ b) x
hab : a ≤ b
hfa : ↑(f ^ a) x ∈ support f
⊢ ∃ x, ↑f x ≠ x ∧ ↑(f ^ (b - a)) x = x
[PROOFSTEP]
refine' ⟨(f ^ a) x, mem_support.mp hfa, _⟩
[GOAL]
case pos
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x✝ y : α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : Finite β
f : Perm β
hf : IsCycle f
val✝ : Fintype β
x : β
hx : ↑f x ≠ x
a b : ℕ
hx' : ↑(f ^ a) x = ↑(f ^ b) x
hab : a ≤ b
hfa : ↑(f ^ a) x ∈ support f
⊢ ↑(f ^ (b - a)) (↑(f ^ a) x) = ↑(f ^ a) x
[PROOFSTEP]
simp only [pow_sub _ hab, Equiv.Perm.coe_mul, Function.comp_apply, inv_apply_self, ← hx']
[GOAL]
case neg
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x✝ y : α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : Finite β
f : Perm β
hf : IsCycle f
val✝ : Fintype β
x : β
hx : ↑f x ≠ x
a b : ℕ
hx' : ↑(f ^ a) x = ↑(f ^ b) x
hab : a ≤ b
hfa : ¬↑(f ^ a) x ∈ support f
⊢ ∃ x, ↑f x ≠ x ∧ ↑(f ^ (b - a)) x = x
[PROOFSTEP]
have h := @Equiv.Perm.zpow_apply_comm _ f 1 a x
[GOAL]
case neg
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x✝ y : α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : Finite β
f : Perm β
hf : IsCycle f
val✝ : Fintype β
x : β
hx : ↑f x ≠ x
a b : ℕ
hx' : ↑(f ^ a) x = ↑(f ^ b) x
hab : a ≤ b
hfa : ¬↑(f ^ a) x ∈ support f
h : ↑(f ^ 1) (↑(f ^ ↑a) x) = ↑(f ^ ↑a) (↑(f ^ 1) x)
⊢ ∃ x, ↑f x ≠ x ∧ ↑(f ^ (b - a)) x = x
[PROOFSTEP]
simp only [zpow_one, zpow_ofNat] at h 
[GOAL]
case neg
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x✝ y : α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : Finite β
f : Perm β
hf : IsCycle f
val✝ : Fintype β
x : β
hx : ↑f x ≠ x
a b : ℕ
hx' : ↑(f ^ a) x = ↑(f ^ b) x
hab : a ≤ b
hfa : ¬↑(f ^ a) x ∈ support f
h : ↑f (↑(f ^ a) x) = ↑(f ^ a) (↑f x)
⊢ ∃ x, ↑f x ≠ x ∧ ↑(f ^ (b - a)) x = x
[PROOFSTEP]
rw [not_mem_support, h, Function.Injective.eq_iff (f ^ a).injective] at hfa 
[GOAL]
case neg
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x✝ y : α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : Finite β
f : Perm β
hf : IsCycle f
val✝ : Fintype β
x : β
hx : ↑f x ≠ x
a b : ℕ
hx' : ↑(f ^ a) x = ↑(f ^ b) x
hab : a ≤ b
hfa : ↑f x = x
h : ↑f (↑(f ^ a) x) = ↑(f ^ a) (↑f x)
⊢ ∃ x, ↑f x ≠ x ∧ ↑(f ^ (b - a)) x = x
[PROOFSTEP]
contradiction
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x y : α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : Finite β
f : Perm β
hf : IsCycle f
hf' : Nat.Prime (orderOf f)
n : ℕ
hn : 0 < n
hn' : n < orderOf f
⊢ IsCycle (f ^ n)
[PROOFSTEP]
classical
cases nonempty_fintype β
have : n.coprime (orderOf f) := by
  refine' Nat.coprime.symm _
  rw [Nat.Prime.coprime_iff_not_dvd hf']
  exact Nat.not_dvd_of_pos_of_lt hn hn'
obtain ⟨m, hm⟩ := exists_pow_eq_self_of_coprime this
have hf'' := hf
rw [← hm] at hf'' 
refine' hf''.of_pow _
rw [hm]
exact support_pow_le f n
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x y : α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : Finite β
f : Perm β
hf : IsCycle f
hf' : Nat.Prime (orderOf f)
n : ℕ
hn : 0 < n
hn' : n < orderOf f
⊢ IsCycle (f ^ n)
[PROOFSTEP]
cases nonempty_fintype β
[GOAL]
case intro
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x y : α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : Finite β
f : Perm β
hf : IsCycle f
hf' : Nat.Prime (orderOf f)
n : ℕ
hn : 0 < n
hn' : n < orderOf f
val✝ : Fintype β
⊢ IsCycle (f ^ n)
[PROOFSTEP]
have : n.coprime (orderOf f) := by
  refine' Nat.coprime.symm _
  rw [Nat.Prime.coprime_iff_not_dvd hf']
  exact Nat.not_dvd_of_pos_of_lt hn hn'
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x y : α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : Finite β
f : Perm β
hf : IsCycle f
hf' : Nat.Prime (orderOf f)
n : ℕ
hn : 0 < n
hn' : n < orderOf f
val✝ : Fintype β
⊢ Nat.coprime n (orderOf f)
[PROOFSTEP]
refine' Nat.coprime.symm _
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x y : α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : Finite β
f : Perm β
hf : IsCycle f
hf' : Nat.Prime (orderOf f)
n : ℕ
hn : 0 < n
hn' : n < orderOf f
val✝ : Fintype β
⊢ Nat.coprime (orderOf f) n
[PROOFSTEP]
rw [Nat.Prime.coprime_iff_not_dvd hf']
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x y : α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : Finite β
f : Perm β
hf : IsCycle f
hf' : Nat.Prime (orderOf f)
n : ℕ
hn : 0 < n
hn' : n < orderOf f
val✝ : Fintype β
⊢ ¬orderOf f ∣ n
[PROOFSTEP]
exact Nat.not_dvd_of_pos_of_lt hn hn'
[GOAL]
case intro
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x y : α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : Finite β
f : Perm β
hf : IsCycle f
hf' : Nat.Prime (orderOf f)
n : ℕ
hn : 0 < n
hn' : n < orderOf f
val✝ : Fintype β
this : Nat.coprime n (orderOf f)
⊢ IsCycle (f ^ n)
[PROOFSTEP]
obtain ⟨m, hm⟩ := exists_pow_eq_self_of_coprime this
[GOAL]
case intro.intro
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x y : α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : Finite β
f : Perm β
hf : IsCycle f
hf' : Nat.Prime (orderOf f)
n : ℕ
hn : 0 < n
hn' : n < orderOf f
val✝ : Fintype β
this : Nat.coprime n (orderOf f)
m : ℕ
hm : (f ^ n) ^ m = f
⊢ IsCycle (f ^ n)
[PROOFSTEP]
have hf'' := hf
[GOAL]
case intro.intro
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x y : α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : Finite β
f : Perm β
hf : IsCycle f
hf' : Nat.Prime (orderOf f)
n : ℕ
hn : 0 < n
hn' : n < orderOf f
val✝ : Fintype β
this : Nat.coprime n (orderOf f)
m : ℕ
hm : (f ^ n) ^ m = f
hf'' : IsCycle f
⊢ IsCycle (f ^ n)
[PROOFSTEP]
rw [← hm] at hf'' 
[GOAL]
case intro.intro
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x y : α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : Finite β
f : Perm β
hf : IsCycle f
hf' : Nat.Prime (orderOf f)
n : ℕ
hn : 0 < n
hn' : n < orderOf f
val✝ : Fintype β
this : Nat.coprime n (orderOf f)
m : ℕ
hm : (f ^ n) ^ m = f
hf'' : IsCycle ((f ^ n) ^ m)
⊢ IsCycle (f ^ n)
[PROOFSTEP]
refine' hf''.of_pow _
[GOAL]
case intro.intro
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x y : α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : Finite β
f : Perm β
hf : IsCycle f
hf' : Nat.Prime (orderOf f)
n : ℕ
hn : 0 < n
hn' : n < orderOf f
val✝ : Fintype β
this : Nat.coprime n (orderOf f)
m : ℕ
hm : (f ^ n) ^ m = f
hf'' : IsCycle ((f ^ n) ^ m)
⊢ support (f ^ n) ⊆ support ((f ^ n) ^ m)
[PROOFSTEP]
rw [hm]
[GOAL]
case intro.intro
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
x y : α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : Finite β
f : Perm β
hf : IsCycle f
hf' : Nat.Prime (orderOf f)
n : ℕ
hn : 0 < n
hn' : n < orderOf f
val✝ : Fintype β
this : Nat.coprime n (orderOf f)
m : ℕ
hm : (f ^ n) ^ m = f
hf'' : IsCycle ((f ^ n) ^ m)
⊢ support (f ^ n) ⊆ support f
[PROOFSTEP]
exact support_pow_le f n
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
s t : Set α
a b x y : α
⊢ IsCycleOn f ∅
[PROOFSTEP]
simp [IsCycleOn, Set.bijOn_empty]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
s t : Set α
a b x y : α
⊢ IsCycleOn 1 s ↔ Set.Subsingleton s
[PROOFSTEP]
simp [IsCycleOn, Set.bijOn_id, Set.Subsingleton]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
s t : Set α
a b x y : α
⊢ IsCycleOn f {a} ↔ ↑f a = a
[PROOFSTEP]
simp [IsCycleOn, SameCycle.rfl]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
s t : Set α
a b x y : α
⊢ IsCycleOn f⁻¹ s ↔ IsCycleOn f s
[PROOFSTEP]
simp only [IsCycleOn, sameCycle_inv, and_congr_left_iff]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
s t : Set α
a b x y : α
⊢ (∀ ⦃x : α⦄, x ∈ s → ∀ ⦃y : α⦄, y ∈ s → SameCycle f x y) → (Set.BijOn (↑f⁻¹) s s ↔ Set.BijOn (↑f) s s)
[PROOFSTEP]
exact fun _ ↦ ⟨fun h ↦ Set.BijOn.perm_inv h, fun h ↦ Set.BijOn.perm_inv h⟩
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
s t : Set α
a b x✝ y✝ : α
h : IsCycleOn f s
x : α
hx : x ∈ ↑g '' s
y : α
hy : y ∈ ↑g '' s
⊢ SameCycle (g * f * g⁻¹) x y
[PROOFSTEP]
rw [← preimage_inv] at hx hy 
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
s t : Set α
a b x✝ y✝ : α
h : IsCycleOn f s
x : α
hx : x ∈ ↑g⁻¹ ⁻¹' s
y : α
hy : y ∈ ↑g⁻¹ ⁻¹' s
⊢ SameCycle (g * f * g⁻¹) x y
[PROOFSTEP]
convert Equiv.Perm.SameCycle.conj (h.2 hx hy) (g := g)
[GOAL]
case h.e'_3
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
s t : Set α
a b x✝ y✝ : α
h : IsCycleOn f s
x : α
hx : x ∈ ↑g⁻¹ ⁻¹' s
y : α
hy : y ∈ ↑g⁻¹ ⁻¹' s
⊢ x = ↑g (↑g⁻¹ x)
[PROOFSTEP]
rw [apply_inv_self]
[GOAL]
case h.e'_4
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
s t : Set α
a b x✝ y✝ : α
h : IsCycleOn f s
x : α
hx : x ∈ ↑g⁻¹ ⁻¹' s
y : α
hy : y ∈ ↑g⁻¹ ⁻¹' s
⊢ y = ↑g (↑g⁻¹ y)
[PROOFSTEP]
rw [apply_inv_self]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
s t : Set α
a b x y : α
inst✝ : DecidableEq α
hab : a ≠ b
⊢ a ∈ {a, b}
[PROOFSTEP]
simp
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
s t : Set α
a b x y : α
inst✝ : DecidableEq α
hab : a ≠ b
⊢ b ∈ {a, b}
[PROOFSTEP]
simp
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
s t : Set α
a b x✝ y✝ : α
inst✝ : DecidableEq α
hab : a ≠ b
x : α
hx : x ∈ {a, b}
y : α
hy : y ∈ {a, b}
⊢ SameCycle (swap a b) x y
[PROOFSTEP]
rw [Set.mem_insert_iff, Set.mem_singleton_iff] at hx hy 
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
s t : Set α
a b x✝ y✝ : α
inst✝ : DecidableEq α
hab : a ≠ b
x : α
hx : x = a ∨ x = b
y : α
hy : y = a ∨ y = b
⊢ SameCycle (swap a b) x y
[PROOFSTEP]
obtain rfl | rfl := hx
[GOAL]
case inl
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
s t : Set α
b x✝ y✝ : α
inst✝ : DecidableEq α
x y : α
hab : x ≠ b
hy : y = x ∨ y = b
⊢ SameCycle (swap x b) x y
[PROOFSTEP]
obtain rfl | rfl := hy
[GOAL]
case inr
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
s t : Set α
a x✝ y✝ : α
inst✝ : DecidableEq α
x y : α
hab : a ≠ x
hy : y = a ∨ y = x
⊢ SameCycle (swap a x) x y
[PROOFSTEP]
obtain rfl | rfl := hy
[GOAL]
case inl.inl
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
s t : Set α
b x y✝ : α
inst✝ : DecidableEq α
y : α
hab : y ≠ b
⊢ SameCycle (swap y b) y y
[PROOFSTEP]
exact ⟨0, by rw [zpow_zero, coe_one, id.def]⟩
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
s t : Set α
b x y✝ : α
inst✝ : DecidableEq α
y : α
hab : y ≠ b
⊢ ↑(swap y b ^ 0) y = y
[PROOFSTEP]
rw [zpow_zero, coe_one, id.def]
[GOAL]
case inl.inr
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
s t : Set α
x✝ y✝ : α
inst✝ : DecidableEq α
x y : α
hab : x ≠ y
⊢ SameCycle (swap x y) x y
[PROOFSTEP]
exact ⟨1, by rw [zpow_one, swap_apply_left]⟩
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
s t : Set α
x✝ y✝ : α
inst✝ : DecidableEq α
x y : α
hab : x ≠ y
⊢ ↑(swap x y ^ 1) x = y
[PROOFSTEP]
rw [zpow_one, swap_apply_left]
[GOAL]
case inr.inl
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
s t : Set α
x✝ y✝ : α
inst✝ : DecidableEq α
x y : α
hab : y ≠ x
⊢ SameCycle (swap y x) x y
[PROOFSTEP]
exact ⟨1, by rw [zpow_one, swap_apply_right]⟩
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
s t : Set α
x✝ y✝ : α
inst✝ : DecidableEq α
x y : α
hab : y ≠ x
⊢ ↑(swap y x ^ 1) x = y
[PROOFSTEP]
rw [zpow_one, swap_apply_right]
[GOAL]
case inr.inr
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
s t : Set α
a x y✝ : α
inst✝ : DecidableEq α
y : α
hab : a ≠ y
⊢ SameCycle (swap a y) y y
[PROOFSTEP]
exact ⟨0, by rw [zpow_zero, coe_one, id.def]⟩
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
s t : Set α
a x y✝ : α
inst✝ : DecidableEq α
y : α
hab : a ≠ y
⊢ ↑(swap a y ^ 0) y = y
[PROOFSTEP]
rw [zpow_zero, coe_one, id.def]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
s t : Set α
a b x y : α
hf : IsCycleOn f s
hs : Set.Nontrivial s
ha : a ∈ s
⊢ ↑f a ≠ a
[PROOFSTEP]
obtain ⟨b, hb, hba⟩ := hs.exists_ne a
[GOAL]
case intro.intro
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
s t : Set α
a b✝ x y : α
hf : IsCycleOn f s
hs : Set.Nontrivial s
ha : a ∈ s
b : α
hb : b ∈ s
hba : b ≠ a
⊢ ↑f a ≠ a
[PROOFSTEP]
obtain ⟨n, rfl⟩ := hf.2 ha hb
[GOAL]
case intro.intro.intro
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
s t : Set α
a b x y : α
hf : IsCycleOn f s
hs : Set.Nontrivial s
ha : a ∈ s
n : ℤ
hb : ↑(f ^ n) a ∈ s
hba : ↑(f ^ n) a ≠ a
⊢ ↑f a ≠ a
[PROOFSTEP]
exact fun h => hba (IsFixedPt.perm_zpow h n)
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
s t : Set α
a b x y : α
⊢ IsCycle f ↔ ∃ s, Set.Nontrivial s ∧ IsCycleOn f s ∧ ∀ ⦃x : α⦄, ¬IsFixedPt (↑f) x → x ∈ s
[PROOFSTEP]
refine' ⟨fun hf => ⟨{x | f x ≠ x}, _, hf.isCycleOn, fun _ => id⟩, _⟩
[GOAL]
case refine'_1
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
s t : Set α
a b x y : α
hf : IsCycle f
⊢ Set.Nontrivial {x | ↑f x ≠ x}
[PROOFSTEP]
obtain ⟨a, ha⟩ := hf
[GOAL]
case refine'_1.intro
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
s t : Set α
a✝ b x y a : α
ha : ↑f a ≠ a ∧ ∀ ⦃y : α⦄, ↑f y ≠ y → SameCycle f a y
⊢ Set.Nontrivial {x | ↑f x ≠ x}
[PROOFSTEP]
exact ⟨f a, f.injective.ne ha.1, a, ha.1, ha.1⟩
[GOAL]
case refine'_2
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
s t : Set α
a b x y : α
⊢ (∃ s, Set.Nontrivial s ∧ IsCycleOn f s ∧ ∀ ⦃x : α⦄, ¬IsFixedPt (↑f) x → x ∈ s) → IsCycle f
[PROOFSTEP]
rintro ⟨s, hs, hf, hsf⟩
[GOAL]
case refine'_2.intro.intro.intro
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
s✝ t : Set α
a b x y : α
s : Set α
hs : Set.Nontrivial s
hf : IsCycleOn f s
hsf : ∀ ⦃x : α⦄, ¬IsFixedPt (↑f) x → x ∈ s
⊢ IsCycle f
[PROOFSTEP]
obtain ⟨a, ha⟩ := hs.nonempty
[GOAL]
case refine'_2.intro.intro.intro.intro
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
s✝ t : Set α
a✝ b x y : α
s : Set α
hs : Set.Nontrivial s
hf : IsCycleOn f s
hsf : ∀ ⦃x : α⦄, ¬IsFixedPt (↑f) x → x ∈ s
a : α
ha : a ∈ s
⊢ IsCycle f
[PROOFSTEP]
exact ⟨a, hf.apply_ne hs ha, fun b hb => hf.2 ha <| hsf hb⟩
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
s t : Set α
a b x y : α
hf : IsCycleOn f s
hx : ↑f x ∈ s
⊢ x ∈ s
[PROOFSTEP]
convert hf.1.perm_inv.1 hx
[GOAL]
case h.e'_4
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
s t : Set α
a b x y : α
hf : IsCycleOn f s
hx : ↑f x ∈ s
⊢ x = ↑f⁻¹ (↑f x)
[PROOFSTEP]
rw [inv_apply_self]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
s t : Set α
a b x y : α
hf : IsCycleOn f s
hs : Set.Nontrivial s
⊢ IsCycle (subtypePerm f (_ : ∀ (x : α), x ∈ s ↔ ↑f x ∈ s))
[PROOFSTEP]
obtain ⟨a, ha⟩ := hs.nonempty
[GOAL]
case intro
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
s t : Set α
a✝ b x y : α
hf : IsCycleOn f s
hs : Set.Nontrivial s
a : α
ha : a ∈ s
⊢ IsCycle (subtypePerm f (_ : ∀ (x : α), x ∈ s ↔ ↑f x ∈ s))
[PROOFSTEP]
exact ⟨⟨a, ha⟩, ne_of_apply_ne ((↑) : s → α) (hf.apply_ne hs ha), fun b _ => (hf.2 (⟨a, ha⟩ : s).2 b.2).subtypePerm⟩
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
s t : Set α
a b x y : α
hf : IsCycleOn f s
⊢ IsCycleOn (subtypePerm f (_ : ∀ (x : α), x ∈ s ↔ ↑f x ∈ s)) _root_.Set.univ
[PROOFSTEP]
obtain hs | hs := s.subsingleton_or_nontrivial
[GOAL]
case inl
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
s t : Set α
a b x y : α
hf : IsCycleOn f s
hs : Set.Subsingleton s
⊢ IsCycleOn (subtypePerm f (_ : ∀ (x : α), x ∈ s ↔ ↑f x ∈ s)) _root_.Set.univ
[PROOFSTEP]
haveI := hs.coe_sort
[GOAL]
case inl
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
s t : Set α
a b x y : α
hf : IsCycleOn f s
hs : Set.Subsingleton s
this : Subsingleton ↑s
⊢ IsCycleOn (subtypePerm f (_ : ∀ (x : α), x ∈ s ↔ ↑f x ∈ s)) _root_.Set.univ
[PROOFSTEP]
exact isCycleOn_of_subsingleton _ _
[GOAL]
case inr
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
s t : Set α
a b x y : α
hf : IsCycleOn f s
hs : Set.Nontrivial s
⊢ IsCycleOn (subtypePerm f (_ : ∀ (x : α), x ∈ s ↔ ↑f x ∈ s)) _root_.Set.univ
[PROOFSTEP]
convert (hf.isCycle_subtypePerm hs).isCycleOn
[GOAL]
case h.e'_3
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
s t : Set α
a b x y : α
hf : IsCycleOn f s
hs : Set.Nontrivial s
⊢ _root_.Set.univ = {x | ↑(subtypePerm f (_ : ∀ (x : α), x ∈ s ↔ ↑f x ∈ s)) x ≠ x}
[PROOFSTEP]
rw [eq_comm, Set.eq_univ_iff_forall]
[GOAL]
case h.e'_3
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
s t : Set α
a b x y : α
hf : IsCycleOn f s
hs : Set.Nontrivial s
⊢ ∀ (x : { x // x ∈ s }), x ∈ {x | ↑(subtypePerm f (_ : ∀ (x : α), x ∈ s ↔ ↑f x ∈ s)) x ≠ x}
[PROOFSTEP]
exact fun x => ne_of_apply_ne ((↑) : s → α) (hf.apply_ne hs x.2)
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
s✝ t : Set α
a b x y : α
s : Finset α
hf : IsCycleOn f ↑s
ha : a ∈ s
n : ℕ
⊢ ↑(f ^ n) a = a ↔ card s ∣ n
[PROOFSTEP]
obtain rfl | hs := Finset.eq_singleton_or_nontrivial ha
[GOAL]
case inl
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
s t : Set α
a b x y : α
n : ℕ
hf : IsCycleOn f ↑{a}
ha : a ∈ {a}
⊢ ↑(f ^ n) a = a ↔ card {a} ∣ n
[PROOFSTEP]
rw [coe_singleton, isCycleOn_singleton] at hf 
[GOAL]
case inl
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
s t : Set α
a b x y : α
n : ℕ
hf : ↑f a = a
ha : a ∈ {a}
⊢ ↑(f ^ n) a = a ↔ card {a} ∣ n
[PROOFSTEP]
simpa using IsFixedPt.iterate hf n
[GOAL]
case inr
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
s✝ t : Set α
a b x y : α
s : Finset α
hf : IsCycleOn f ↑s
ha : a ∈ s
n : ℕ
hs : Set.Nontrivial ↑s
⊢ ↑(f ^ n) a = a ↔ card s ∣ n
[PROOFSTEP]
classical
have h : ∀ x ∈ s.attach, ¬f ↑x = ↑x := fun x _ => hf.apply_ne hs x.2
have := (hf.isCycle_subtypePerm hs).orderOf
simp only [coe_sort_coe, support_subtype_perm, ne_eq, decide_not, Bool.not_eq_true', decide_eq_false_iff_not,
  mem_attach, forall_true_left, Subtype.forall, filter_true_of_mem h, card_attach] at this 
rw [← this, orderOf_dvd_iff_pow_eq_one,
  (hf.isCycle_subtypePerm hs).pow_eq_one_iff' (ne_of_apply_ne ((↑) : s → α) <| hf.apply_ne hs (⟨a, ha⟩ : s).2)]
simp
[GOAL]
case inr
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
s✝ t : Set α
a b x y : α
s : Finset α
hf : IsCycleOn f ↑s
ha : a ∈ s
n : ℕ
hs : Set.Nontrivial ↑s
⊢ ↑(f ^ n) a = a ↔ card s ∣ n
[PROOFSTEP]
have h : ∀ x ∈ s.attach, ¬f ↑x = ↑x := fun x _ => hf.apply_ne hs x.2
[GOAL]
case inr
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
s✝ t : Set α
a b x y : α
s : Finset α
hf : IsCycleOn f ↑s
ha : a ∈ s
n : ℕ
hs : Set.Nontrivial ↑s
h : ∀ (x : { x // x ∈ s }), x ∈ attach s → ¬↑f ↑x = ↑x
⊢ ↑(f ^ n) a = a ↔ card s ∣ n
[PROOFSTEP]
have := (hf.isCycle_subtypePerm hs).orderOf
[GOAL]
case inr
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
s✝ t : Set α
a b x y : α
s : Finset α
hf : IsCycleOn f ↑s
ha : a ∈ s
n : ℕ
hs : Set.Nontrivial ↑s
h : ∀ (x : { x // x ∈ s }), x ∈ attach s → ¬↑f ↑x = ↑x
this :
  orderOf (subtypePerm f (_ : ∀ (x : α), x ∈ ↑s ↔ ↑f x ∈ ↑s)) =
    card (support (subtypePerm f (_ : ∀ (x : α), x ∈ ↑s ↔ ↑f x ∈ ↑s)))
⊢ ↑(f ^ n) a = a ↔ card s ∣ n
[PROOFSTEP]
simp only [coe_sort_coe, support_subtype_perm, ne_eq, decide_not, Bool.not_eq_true', decide_eq_false_iff_not,
  mem_attach, forall_true_left, Subtype.forall, filter_true_of_mem h, card_attach] at this 
[GOAL]
case inr
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
s✝ t : Set α
a b x y : α
s : Finset α
hf : IsCycleOn f ↑s
ha : a ∈ s
n : ℕ
hs : Set.Nontrivial ↑s
h : ∀ (x : { x // x ∈ s }), x ∈ attach s → ¬↑f ↑x = ↑x
this : orderOf (subtypePerm f (_ : ∀ (x : α), x ∈ ↑s ↔ ↑f x ∈ ↑s)) = card s
⊢ ↑(f ^ n) a = a ↔ card s ∣ n
[PROOFSTEP]
rw [← this, orderOf_dvd_iff_pow_eq_one,
  (hf.isCycle_subtypePerm hs).pow_eq_one_iff' (ne_of_apply_ne ((↑) : s → α) <| hf.apply_ne hs (⟨a, ha⟩ : s).2)]
[GOAL]
case inr
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
s✝ t : Set α
a b x y : α
s : Finset α
hf : IsCycleOn f ↑s
ha : a ∈ s
n : ℕ
hs : Set.Nontrivial ↑s
h : ∀ (x : { x // x ∈ s }), x ∈ attach s → ¬↑f ↑x = ↑x
this : orderOf (subtypePerm f (_ : ∀ (x : α), x ∈ ↑s ↔ ↑f x ∈ ↑s)) = card s
⊢ ↑(f ^ n) a = a ↔
    ↑(subtypePerm f (_ : ∀ (x : α), x ∈ ↑s ↔ ↑f x ∈ ↑s) ^ n) { val := a, property := ha } = { val := a, property := ha }
[PROOFSTEP]
simp
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
s✝ t : Set α
a b x y : α
s : Finset α
hf : IsCycleOn f ↑s
ha : a ∈ s
n : ℕ
⊢ ↑(f ^ Int.negSucc n) a = a ↔ ↑(card s) ∣ Int.negSucc n
[PROOFSTEP]
rw [zpow_negSucc, ← inv_pow]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
s✝ t : Set α
a b x y : α
s : Finset α
hf : IsCycleOn f ↑s
ha : a ∈ s
n : ℕ
⊢ ↑(f⁻¹ ^ (n + 1)) a = a ↔ ↑(card s) ∣ Int.negSucc n
[PROOFSTEP]
exact (hf.inv.pow_apply_eq ha).trans (dvd_neg.trans Int.coe_nat_dvd).symm
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
s✝ t : Set α
a b x y : α
s : Finset α
hf : IsCycleOn f ↑s
ha : a ∈ s
m n : ℕ
⊢ ↑(f ^ m) a = ↑(f ^ n) a ↔ m ≡ n [MOD card s]
[PROOFSTEP]
rw [Nat.modEq_iff_dvd, ← hf.zpow_apply_eq ha]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
s✝ t : Set α
a b x y : α
s : Finset α
hf : IsCycleOn f ↑s
ha : a ∈ s
m n : ℕ
⊢ ↑(f ^ m) a = ↑(f ^ n) a ↔ ↑(f ^ (↑n - ↑m)) a = a
[PROOFSTEP]
simp [sub_eq_neg_add, zpow_add, eq_inv_iff_eq, eq_comm]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
s✝ t : Set α
a b x y : α
s : Finset α
hf : IsCycleOn f ↑s
ha : a ∈ s
m n : ℤ
⊢ ↑(f ^ m) a = ↑(f ^ n) a ↔ m ≡ n [ZMOD ↑(card s)]
[PROOFSTEP]
rw [Int.modEq_iff_dvd, ← hf.zpow_apply_eq ha]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
s✝ t : Set α
a b x y : α
s : Finset α
hf : IsCycleOn f ↑s
ha : a ∈ s
m n : ℤ
⊢ ↑(f ^ m) a = ↑(f ^ n) a ↔ ↑(f ^ (n - m)) a = a
[PROOFSTEP]
simp [sub_eq_neg_add, zpow_add, eq_inv_iff_eq, eq_comm]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
s✝ t : Set α
a b x y : α
s : Finset α
hf : IsCycleOn f ↑s
ha : a ∈ s
hb : b ∈ s
⊢ ∃ n, n < card s ∧ ↑(f ^ n) a = b
[PROOFSTEP]
classical
obtain ⟨n, rfl⟩ := hf.2 ha hb
obtain ⟨k, hk⟩ := (Int.mod_modEq n s.card).symm.dvd
refine' ⟨n.natMod s.card, Int.natMod_lt (Nonempty.card_pos ⟨a, ha⟩).ne', _⟩
rw [← zpow_ofNat, Int.natMod,
  Int.toNat_of_nonneg (Int.emod_nonneg _ <| Nat.cast_ne_zero.2 (Nonempty.card_pos ⟨a, ha⟩).ne'),
  sub_eq_iff_eq_add'.1 hk, zpow_add, zpow_mul]
simp only [zpow_coe_nat, coe_mul, comp_apply, EmbeddingLike.apply_eq_iff_eq]
exact IsFixedPt.perm_zpow (hf.pow_card_apply ha) _
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
s✝ t : Set α
a b x y : α
s : Finset α
hf : IsCycleOn f ↑s
ha : a ∈ s
hb : b ∈ s
⊢ ∃ n, n < card s ∧ ↑(f ^ n) a = b
[PROOFSTEP]
obtain ⟨n, rfl⟩ := hf.2 ha hb
[GOAL]
case intro
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
s✝ t : Set α
a x y : α
s : Finset α
hf : IsCycleOn f ↑s
ha : a ∈ s
n : ℤ
hb : ↑(f ^ n) a ∈ s
⊢ ∃ n_1, n_1 < card s ∧ ↑(f ^ n_1) a = ↑(f ^ n) a
[PROOFSTEP]
obtain ⟨k, hk⟩ := (Int.mod_modEq n s.card).symm.dvd
[GOAL]
case intro.intro
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
s✝ t : Set α
a x y : α
s : Finset α
hf : IsCycleOn f ↑s
ha : a ∈ s
n : ℤ
hb : ↑(f ^ n) a ∈ s
k : ℤ
hk : n % ↑(card s) - n = ↑(card s) * k
⊢ ∃ n_1, n_1 < card s ∧ ↑(f ^ n_1) a = ↑(f ^ n) a
[PROOFSTEP]
refine' ⟨n.natMod s.card, Int.natMod_lt (Nonempty.card_pos ⟨a, ha⟩).ne', _⟩
[GOAL]
case intro.intro
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
s✝ t : Set α
a x y : α
s : Finset α
hf : IsCycleOn f ↑s
ha : a ∈ s
n : ℤ
hb : ↑(f ^ n) a ∈ s
k : ℤ
hk : n % ↑(card s) - n = ↑(card s) * k
⊢ ↑(f ^ Int.natMod n ↑(card s)) a = ↑(f ^ n) a
[PROOFSTEP]
rw [← zpow_ofNat, Int.natMod,
  Int.toNat_of_nonneg (Int.emod_nonneg _ <| Nat.cast_ne_zero.2 (Nonempty.card_pos ⟨a, ha⟩).ne'),
  sub_eq_iff_eq_add'.1 hk, zpow_add, zpow_mul]
[GOAL]
case intro.intro
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
s✝ t : Set α
a x y : α
s : Finset α
hf : IsCycleOn f ↑s
ha : a ∈ s
n : ℤ
hb : ↑(f ^ n) a ∈ s
k : ℤ
hk : n % ↑(card s) - n = ↑(card s) * k
⊢ ↑(f ^ n * (f ^ ↑(card s)) ^ k) a = ↑(f ^ n) a
[PROOFSTEP]
simp only [zpow_coe_nat, coe_mul, comp_apply, EmbeddingLike.apply_eq_iff_eq]
[GOAL]
case intro.intro
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
s✝ t : Set α
a x y : α
s : Finset α
hf : IsCycleOn f ↑s
ha : a ∈ s
n : ℤ
hb : ↑(f ^ n) a ∈ s
k : ℤ
hk : n % ↑(card s) - n = ↑(card s) * k
⊢ ↑((f ^ card s) ^ k) a = a
[PROOFSTEP]
exact IsFixedPt.perm_zpow (hf.pow_card_apply ha) _
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
s t : Set α
a b x y : α
hs : Set.Finite s
hf : IsCycleOn f s
ha : a ∈ s
hb : b ∈ s
⊢ ∃ n, ↑(f ^ n) a = b
[PROOFSTEP]
lift s to Finset α using id hs
[GOAL]
case intro
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
t : Set α
a b x y : α
s : Finset α
hs : Set.Finite ↑s
hf : IsCycleOn f ↑s
ha : a ∈ ↑s
hb : b ∈ ↑s
⊢ ∃ n, ↑(f ^ n) a = b
[PROOFSTEP]
obtain ⟨n, -, hn⟩ := hf.exists_pow_eq ha hb
[GOAL]
case intro.intro.intro
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
t : Set α
a b x y : α
s : Finset α
hs : Set.Finite ↑s
hf : IsCycleOn f ↑s
ha : a ∈ ↑s
hb : b ∈ ↑s
n : ℕ
hn : ↑(f ^ n) a = b
⊢ ∃ n, ↑(f ^ n) a = b
[PROOFSTEP]
exact ⟨n, hn⟩
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
s t : Set α
a b x y : α
p : β → Prop
inst✝ : DecidablePred p
f : α ≃ Subtype p
h : IsCycleOn g s
⊢ ∀ ⦃x : β⦄, x ∈ Subtype.val ∘ ↑f '' s → ∀ ⦃y : β⦄, y ∈ Subtype.val ∘ ↑f '' s → SameCycle (Perm.extendDomain g f) x y
[PROOFSTEP]
rintro _ ⟨a, ha, rfl⟩ _ ⟨b, hb, rfl⟩
[GOAL]
case intro.intro.intro.intro
ι : Type u_1
α : Type u_2
β : Type u_3
f✝ g : Perm α
s t : Set α
a✝ b✝ x y : α
p : β → Prop
inst✝ : DecidablePred p
f : α ≃ Subtype p
h : IsCycleOn g s
a : α
ha : a ∈ s
b : α
hb : b ∈ s
⊢ SameCycle (Perm.extendDomain g f) ((Subtype.val ∘ ↑f) a) ((Subtype.val ∘ ↑f) b)
[PROOFSTEP]
exact (h.2 ha hb).extendDomain
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
s t : Set α
a b x y : α
hs : IsCycleOn f s
⊢ Set.Countable s
[PROOFSTEP]
obtain rfl | ⟨a, ha⟩ := s.eq_empty_or_nonempty
[GOAL]
case inl
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
t : Set α
a b x y : α
hs : IsCycleOn f ∅
⊢ Set.Countable ∅
[PROOFSTEP]
exact Set.countable_empty
[GOAL]
case inr.intro
ι : Type u_1
α : Type u_2
β : Type u_3
f g : Perm α
s t : Set α
a✝ b x y : α
hs : IsCycleOn f s
a : α
ha : a ∈ s
⊢ Set.Countable s
[PROOFSTEP]
exact (Set.countable_range fun n : ℤ => (⇑(f ^ n) : α → α) a).mono (hs.2 ha)
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ g : Perm α
x✝ y✝ : α
f : Perm α
x y : α
⊢ ↑(cycleOf f x) y = if SameCycle f x y then ↑f y else y
[PROOFSTEP]
dsimp only [cycleOf]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ g : Perm α
x✝ y✝ : α
f : Perm α
x y : α
⊢ ↑(↑ofSubtype (subtypePerm f (_ : ∀ (x_1 : α), SameCycle f x x_1 ↔ SameCycle f x (↑f x_1)))) y =
    if SameCycle f x y then ↑f y else y
[PROOFSTEP]
split_ifs with h
[GOAL]
case pos
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ g : Perm α
x✝ y✝ : α
f : Perm α
x y : α
h : SameCycle f x y
⊢ ↑(↑ofSubtype (subtypePerm f (_ : ∀ (x_1 : α), SameCycle f x x_1 ↔ SameCycle f x (↑f x_1)))) y = ↑f y
[PROOFSTEP]
apply ofSubtype_apply_of_mem
[GOAL]
case pos.ha
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ g : Perm α
x✝ y✝ : α
f : Perm α
x y : α
h : SameCycle f x y
⊢ SameCycle f x y
[PROOFSTEP]
exact h
[GOAL]
case neg
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ g : Perm α
x✝ y✝ : α
f : Perm α
x y : α
h : ¬SameCycle f x y
⊢ ↑(↑ofSubtype (subtypePerm f (_ : ∀ (x_1 : α), SameCycle f x x_1 ↔ SameCycle f x (↑f x_1)))) y = y
[PROOFSTEP]
apply ofSubtype_apply_of_not_mem
[GOAL]
case neg.ha
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ g : Perm α
x✝ y✝ : α
f : Perm α
x y : α
h : ¬SameCycle f x y
⊢ ¬SameCycle f x y
[PROOFSTEP]
exact h
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ g : Perm α
x✝ y✝ : α
f : Perm α
x y : α
⊢ ↑(cycleOf f x)⁻¹ y = ↑(cycleOf f⁻¹ x) y
[PROOFSTEP]
rw [inv_eq_iff_eq, cycleOf_apply, cycleOf_apply]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ g : Perm α
x✝ y✝ : α
f : Perm α
x y : α
⊢ y =
    if SameCycle f x (if SameCycle f⁻¹ x y then ↑f⁻¹ y else y) then ↑f (if SameCycle f⁻¹ x y then ↑f⁻¹ y else y)
    else if SameCycle f⁻¹ x y then ↑f⁻¹ y else y
[PROOFSTEP]
split_ifs
[GOAL]
case pos
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ g : Perm α
x✝ y✝ : α
f : Perm α
x y : α
h✝¹ : SameCycle f⁻¹ x y
h✝ : SameCycle f x (↑f⁻¹ y)
⊢ y = ↑f (if SameCycle f⁻¹ x y then ↑f⁻¹ y else y)
[PROOFSTEP]
simp_all [sameCycle_inv, sameCycle_inv_apply_right]
[GOAL]
case neg
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ g : Perm α
x✝ y✝ : α
f : Perm α
x y : α
h✝¹ : SameCycle f⁻¹ x y
h✝ : ¬SameCycle f x (↑f⁻¹ y)
⊢ y = ↑f⁻¹ y
[PROOFSTEP]
simp_all [sameCycle_inv, sameCycle_inv_apply_right]
[GOAL]
case pos
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ g : Perm α
x✝ y✝ : α
f : Perm α
x y : α
h✝¹ : ¬SameCycle f⁻¹ x y
h✝ : SameCycle f x y
⊢ y = ↑f (if SameCycle f⁻¹ x y then ↑f⁻¹ y else y)
[PROOFSTEP]
simp_all [sameCycle_inv, sameCycle_inv_apply_right]
[GOAL]
case neg
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ g : Perm α
x✝ y✝ : α
f : Perm α
x y : α
h✝¹ : ¬SameCycle f⁻¹ x y
h✝ : ¬SameCycle f x y
⊢ y = y
[PROOFSTEP]
simp_all [sameCycle_inv, sameCycle_inv_apply_right]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ g : Perm α
x✝ y : α
f : Perm α
x : α
⊢ ∀ (n : ℕ), ↑(cycleOf f x ^ n) x = ↑(f ^ n) x
[PROOFSTEP]
intro n
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ g : Perm α
x✝ y : α
f : Perm α
x : α
n : ℕ
⊢ ↑(cycleOf f x ^ n) x = ↑(f ^ n) x
[PROOFSTEP]
induction' n with n hn
[GOAL]
case zero
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ g : Perm α
x✝ y : α
f : Perm α
x : α
⊢ ↑(cycleOf f x ^ Nat.zero) x = ↑(f ^ Nat.zero) x
[PROOFSTEP]
rfl
[GOAL]
case succ
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ g : Perm α
x✝ y : α
f : Perm α
x : α
n : ℕ
hn : ↑(cycleOf f x ^ n) x = ↑(f ^ n) x
⊢ ↑(cycleOf f x ^ Nat.succ n) x = ↑(f ^ Nat.succ n) x
[PROOFSTEP]
rw [pow_succ, mul_apply, cycleOf_apply, hn, if_pos, pow_succ, mul_apply]
[GOAL]
case succ.hc
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ g : Perm α
x✝ y : α
f : Perm α
x : α
n : ℕ
hn : ↑(cycleOf f x ^ n) x = ↑(f ^ n) x
⊢ SameCycle f x (↑(f ^ n) x)
[PROOFSTEP]
simpa [SameCycle] using ⟨n, rfl⟩
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ g : Perm α
x✝ y : α
f : Perm α
x : α
⊢ ∀ (n : ℤ), ↑(cycleOf f x ^ n) x = ↑(f ^ n) x
[PROOFSTEP]
intro z
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ g : Perm α
x✝ y : α
f : Perm α
x : α
z : ℤ
⊢ ↑(cycleOf f x ^ z) x = ↑(f ^ z) x
[PROOFSTEP]
induction' z with z hz
[GOAL]
case ofNat
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ g : Perm α
x✝ y : α
f : Perm α
x : α
z : ℕ
⊢ ↑(cycleOf f x ^ Int.ofNat z) x = ↑(f ^ Int.ofNat z) x
[PROOFSTEP]
exact cycleOf_pow_apply_self f x z
[GOAL]
case negSucc
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ g : Perm α
x✝ y : α
f : Perm α
x : α
hz : ℕ
⊢ ↑(cycleOf f x ^ Int.negSucc hz) x = ↑(f ^ Int.negSucc hz) x
[PROOFSTEP]
rw [zpow_negSucc, ← inv_pow, cycleOf_inv, zpow_negSucc, ← inv_pow, cycleOf_pow_apply_self]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f g : Perm α
x y : α
h : SameCycle f x y
⊢ cycleOf f x = cycleOf f y
[PROOFSTEP]
ext z
[GOAL]
case H
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f g : Perm α
x y : α
h : SameCycle f x y
z : α
⊢ ↑(cycleOf f x) z = ↑(cycleOf f y) z
[PROOFSTEP]
rw [Equiv.Perm.cycleOf_apply]
[GOAL]
case H
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f g : Perm α
x y : α
h : SameCycle f x y
z : α
⊢ (if SameCycle f x z then ↑f z else z) = ↑(cycleOf f y) z
[PROOFSTEP]
split_ifs with hz
[GOAL]
case pos
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f g : Perm α
x y : α
h : SameCycle f x y
z : α
hz : SameCycle f x z
⊢ ↑f z = ↑(cycleOf f y) z
[PROOFSTEP]
exact (h.symm.trans hz).cycleOf_apply.symm
[GOAL]
case neg
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f g : Perm α
x y : α
h : SameCycle f x y
z : α
hz : ¬SameCycle f x z
⊢ z = ↑(cycleOf f y) z
[PROOFSTEP]
exact (cycleOf_apply_of_not_sameCycle (mt h.trans hz)).symm
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ g : Perm α
x✝ y : α
f : Perm α
x : α
k : ℤ
⊢ ↑(cycleOf f x) (↑(f ^ k) x) = ↑(f ^ (k + 1)) x
[PROOFSTEP]
rw [SameCycle.cycleOf_apply]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ g : Perm α
x✝ y : α
f : Perm α
x : α
k : ℤ
⊢ ↑f (↑(f ^ k) x) = ↑(f ^ (k + 1)) x
[PROOFSTEP]
rw [add_comm, zpow_add, zpow_one, mul_apply]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ g : Perm α
x✝ y : α
f : Perm α
x : α
k : ℤ
⊢ SameCycle f x (↑(f ^ k) x)
[PROOFSTEP]
exact ⟨k, rfl⟩
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ g : Perm α
x✝ y : α
f : Perm α
x : α
k : ℕ
⊢ ↑(cycleOf f x) (↑(f ^ k) x) = ↑(f ^ (k + 1)) x
[PROOFSTEP]
convert cycleOf_apply_apply_zpow_self f x k using 1
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ g : Perm α
x✝ y : α
f : Perm α
x : α
⊢ ↑(cycleOf f x) (↑f x) = ↑f (↑f x)
[PROOFSTEP]
convert cycleOf_apply_apply_pow_self f x 1 using 1
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f g : Perm α
x y✝ : α
hf : IsCycle f
hx : ↑f x ≠ x
y : α
h : SameCycle f x y
⊢ ↑(cycleOf f x) y = ↑f y
[PROOFSTEP]
rw [h.cycleOf_apply]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f g : Perm α
x y✝ : α
hf : IsCycle f
hx : ↑f x ≠ x
y : α
h : ¬SameCycle f x y
⊢ ↑(cycleOf f x) y = ↑f y
[PROOFSTEP]
rw [cycleOf_apply_of_not_sameCycle h, Classical.not_not.1 (mt ((isCycle_iff_sameCycle hx).1 hf).2 h)]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ g : Perm α
x y : α
f : Perm α
⊢ cycleOf f x = 1 ↔ ↑f x = x
[PROOFSTEP]
simp_rw [ext_iff, cycleOf_apply, one_apply]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ g : Perm α
x y : α
f : Perm α
⊢ (∀ (x_1 : α), (if SameCycle f x x_1 then ↑f x_1 else x_1) = x_1) ↔ ↑f x = x
[PROOFSTEP]
refine' ⟨fun h => (if_pos (SameCycle.refl f x)).symm.trans (h x), fun h y => _⟩
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ g : Perm α
x y✝ : α
f : Perm α
h : ↑f x = x
y : α
⊢ (if SameCycle f x y then ↑f y else y) = y
[PROOFSTEP]
by_cases hy : f y = y
[GOAL]
case pos
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ g : Perm α
x y✝ : α
f : Perm α
h : ↑f x = x
y : α
hy : ↑f y = y
⊢ (if SameCycle f x y then ↑f y else y) = y
[PROOFSTEP]
rw [hy, ite_self]
[GOAL]
case neg
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ g : Perm α
x y✝ : α
f : Perm α
h : ↑f x = x
y : α
hy : ¬↑f y = y
⊢ (if SameCycle f x y then ↑f y else y) = y
[PROOFSTEP]
exact if_neg (mt SameCycle.apply_eq_self_iff (by tauto))
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ g : Perm α
x y✝ : α
f : Perm α
h : ↑f x = x
y : α
hy : ¬↑f y = y
⊢ ¬(↑f x = x ↔ ↑f y = y)
[PROOFSTEP]
tauto
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f g : Perm α
x y : α
hf : IsCycle f
⊢ cycleOf f x = if ↑f x = x then 1 else f
[PROOFSTEP]
by_cases hx : f x = x
[GOAL]
case pos
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f g : Perm α
x y : α
hf : IsCycle f
hx : ↑f x = x
⊢ cycleOf f x = if ↑f x = x then 1 else f
[PROOFSTEP]
rwa [if_pos hx, cycleOf_eq_one_iff]
[GOAL]
case neg
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f g : Perm α
x y : α
hf : IsCycle f
hx : ¬↑f x = x
⊢ cycleOf f x = if ↑f x = x then 1 else f
[PROOFSTEP]
rwa [if_neg hx, hf.cycleOf_eq]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ g : Perm α
x y : α
f : Perm α
hx : ↑f x ≠ x
⊢ ↑(cycleOf f x) x ≠ x
[PROOFSTEP]
rwa [SameCycle.rfl.cycleOf_apply]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ g : Perm α
x y✝ : α
f : Perm α
hx : ↑f x ≠ x
this : ↑(cycleOf f x) x ≠ x
y : α
h : ↑(cycleOf f x) y ≠ y
hxy : SameCycle f x y
i : ℤ
hi : ↑(f ^ i) x = y
⊢ ↑(cycleOf f x ^ i) x = y
[PROOFSTEP]
rw [cycleOf_zpow_apply_self, hi]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ g : Perm α
x y✝ : α
f : Perm α
hx : ↑f x ≠ x
this : ↑(cycleOf f x) x ≠ x
y : α
h : ↑(cycleOf f x) y ≠ y
hxy : ¬SameCycle f x y
⊢ SameCycle (cycleOf f x) x y
[PROOFSTEP]
rw [cycleOf_apply_of_not_sameCycle hxy] at h 
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ g : Perm α
x y✝ : α
f : Perm α
hx : ↑f x ≠ x
this : ↑(cycleOf f x) x ≠ x
y : α
h : y ≠ y
hxy : ¬SameCycle f x y
⊢ SameCycle (cycleOf f x) x y
[PROOFSTEP]
exact (h rfl).elim
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f g : Perm α
x y : α
⊢ 2 ≤ card (support (cycleOf f x)) ↔ ↑f x ≠ x
[PROOFSTEP]
refine' ⟨fun h => _, fun h => by simpa using (isCycle_cycleOf _ h).two_le_card_support⟩
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f g : Perm α
x y : α
h : ↑f x ≠ x
⊢ 2 ≤ card (support (cycleOf f x))
[PROOFSTEP]
simpa using (isCycle_cycleOf _ h).two_le_card_support
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f g : Perm α
x y : α
h : 2 ≤ card (support (cycleOf f x))
⊢ ↑f x ≠ x
[PROOFSTEP]
contrapose! h
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f g : Perm α
x y : α
h : ↑f x = x
⊢ card (support (cycleOf f x)) < 2
[PROOFSTEP]
rw [← cycleOf_eq_one_iff] at h 
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f g : Perm α
x y : α
h✝ : ↑f x = x
h : cycleOf f x = 1
⊢ card (support (cycleOf f x)) < 2
[PROOFSTEP]
simp [h]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f g : Perm α
x y : α
⊢ 0 < card (support (cycleOf f x)) ↔ ↑f x ≠ x
[PROOFSTEP]
rw [← two_le_card_support_cycleOf_iff, ← Nat.succ_le_iff]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f g : Perm α
x y : α
⊢ Nat.succ 0 ≤ card (support (cycleOf f x)) ↔ 2 ≤ card (support (cycleOf f x))
[PROOFSTEP]
exact ⟨fun h => Or.resolve_left h.eq_or_lt (card_support_ne_one _).symm, zero_lt_two.trans_le⟩
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ g : Perm α
x✝ y : α
f : Perm α
n : ℕ
x : α
⊢ ↑(f ^ n) x = ↑(f ^ (n % orderOf (cycleOf f x))) x
[PROOFSTEP]
rw [← cycleOf_pow_apply_self f, ← cycleOf_pow_apply_self f, pow_eq_mod_orderOf]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f g : Perm α
x✝ y : α
h : Commute f g
x : α
hx : ↑g x = x
⊢ cycleOf (f * g) x = cycleOf f x
[PROOFSTEP]
ext y
[GOAL]
case H
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f g : Perm α
x✝ y✝ : α
h : Commute f g
x : α
hx : ↑g x = x
y : α
⊢ ↑(cycleOf (f * g) x) y = ↑(cycleOf f x) y
[PROOFSTEP]
by_cases hxy : (f * g).SameCycle x y
[GOAL]
case pos
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f g : Perm α
x✝ y✝ : α
h : Commute f g
x : α
hx : ↑g x = x
y : α
hxy : SameCycle (f * g) x y
⊢ ↑(cycleOf (f * g) x) y = ↑(cycleOf f x) y
[PROOFSTEP]
obtain ⟨z, rfl⟩ := hxy
[GOAL]
case pos.intro
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f g : Perm α
x✝ y : α
h : Commute f g
x : α
hx : ↑g x = x
z : ℤ
⊢ ↑(cycleOf (f * g) x) (↑((f * g) ^ z) x) = ↑(cycleOf f x) (↑((f * g) ^ z) x)
[PROOFSTEP]
rw [cycleOf_apply_apply_zpow_self]
[GOAL]
case pos.intro
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f g : Perm α
x✝ y : α
h : Commute f g
x : α
hx : ↑g x = x
z : ℤ
⊢ ↑((f * g) ^ (z + 1)) x = ↑(cycleOf f x) (↑((f * g) ^ z) x)
[PROOFSTEP]
simp [h.mul_zpow, zpow_apply_eq_self_of_apply_eq_self hx]
[GOAL]
case neg
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f g : Perm α
x✝ y✝ : α
h : Commute f g
x : α
hx : ↑g x = x
y : α
hxy : ¬SameCycle (f * g) x y
⊢ ↑(cycleOf (f * g) x) y = ↑(cycleOf f x) y
[PROOFSTEP]
rw [cycleOf_apply_of_not_sameCycle hxy, cycleOf_apply_of_not_sameCycle]
[GOAL]
case neg
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f g : Perm α
x✝ y✝ : α
h : Commute f g
x : α
hx : ↑g x = x
y : α
hxy : ¬SameCycle (f * g) x y
⊢ ¬SameCycle f x y
[PROOFSTEP]
contrapose! hxy
[GOAL]
case neg
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f g : Perm α
x✝ y✝ : α
h : Commute f g
x : α
hx : ↑g x = x
y : α
hxy : SameCycle f x y
⊢ SameCycle (f * g) x y
[PROOFSTEP]
obtain ⟨z, rfl⟩ := hxy
[GOAL]
case neg.intro
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f g : Perm α
x✝ y : α
h : Commute f g
x : α
hx : ↑g x = x
z : ℤ
⊢ SameCycle (f * g) x (↑(f ^ z) x)
[PROOFSTEP]
refine' ⟨z, _⟩
[GOAL]
case neg.intro
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f g : Perm α
x✝ y : α
h : Commute f g
x : α
hx : ↑g x = x
z : ℤ
⊢ ↑((f * g) ^ z) x = ↑(f ^ z) x
[PROOFSTEP]
simp [h.mul_zpow, zpow_apply_eq_self_of_apply_eq_self hx]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f g : Perm α
x✝ y : α
h : Disjoint f g
x : α
⊢ cycleOf (f * g) x = cycleOf f x * cycleOf g x
[PROOFSTEP]
cases' (disjoint_iff_eq_or_eq.mp h) x with hfx hgx
[GOAL]
case inl
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f g : Perm α
x✝ y : α
h : Disjoint f g
x : α
hfx : ↑f x = x
⊢ cycleOf (f * g) x = cycleOf f x * cycleOf g x
[PROOFSTEP]
simp [h.commute.eq, cycleOf_mul_of_apply_right_eq_self h.symm.commute, hfx]
[GOAL]
case inr
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f g : Perm α
x✝ y : α
h : Disjoint f g
x : α
hgx : ↑g x = x
⊢ cycleOf (f * g) x = cycleOf f x * cycleOf g x
[PROOFSTEP]
simp [cycleOf_mul_of_apply_right_eq_self h.commute, hgx]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f g : Perm α
x y : α
⊢ support (cycleOf f x) = ∅ ↔ ¬x ∈ support f
[PROOFSTEP]
simp
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ g : Perm α
x✝ y : α
f : Perm α
x : α
⊢ support (cycleOf f x) ≤ support f
[PROOFSTEP]
intro y hy
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ g : Perm α
x✝ y✝ : α
f : Perm α
x y : α
hy : y ∈ support (cycleOf f x)
⊢ y ∈ support f
[PROOFSTEP]
rw [mem_support, cycleOf_apply] at hy 
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ g : Perm α
x✝ y✝ : α
f : Perm α
x y : α
hy : (if SameCycle f x y then ↑f y else y) ≠ y
⊢ y ∈ support f
[PROOFSTEP]
split_ifs at hy 
[GOAL]
case pos
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ g : Perm α
x✝ y✝ : α
f : Perm α
x y : α
h✝ : SameCycle f x y
hy : ↑f y ≠ y
⊢ y ∈ support f
[PROOFSTEP]
exact mem_support.mpr hy
[GOAL]
case neg
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ g : Perm α
x✝ y✝ : α
f : Perm α
x y : α
h✝ : ¬SameCycle f x y
hy : y ≠ y
⊢ y ∈ support f
[PROOFSTEP]
exact absurd rfl hy
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f g : Perm α
x y : α
⊢ y ∈ support (cycleOf f x) ↔ SameCycle f x y ∧ x ∈ support f
[PROOFSTEP]
by_cases hx : f x = x
[GOAL]
case pos
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f g : Perm α
x y : α
hx : ↑f x = x
⊢ y ∈ support (cycleOf f x) ↔ SameCycle f x y ∧ x ∈ support f
[PROOFSTEP]
rw [(cycleOf_eq_one_iff _).mpr hx]
[GOAL]
case pos
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f g : Perm α
x y : α
hx : ↑f x = x
⊢ y ∈ support 1 ↔ SameCycle f x y ∧ x ∈ support f
[PROOFSTEP]
simp [hx]
[GOAL]
case neg
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f g : Perm α
x y : α
hx : ¬↑f x = x
⊢ y ∈ support (cycleOf f x) ↔ SameCycle f x y ∧ x ∈ support f
[PROOFSTEP]
rw [mem_support, cycleOf_apply]
[GOAL]
case neg
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f g : Perm α
x y : α
hx : ¬↑f x = x
⊢ (if SameCycle f x y then ↑f y else y) ≠ y ↔ SameCycle f x y ∧ x ∈ support f
[PROOFSTEP]
split_ifs with hy
[GOAL]
case pos
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f g : Perm α
x y : α
hx : ¬↑f x = x
hy : SameCycle f x y
⊢ ↑f y ≠ y ↔ SameCycle f x y ∧ x ∈ support f
[PROOFSTEP]
simp only [hx, hy, iff_true_iff, Ne.def, not_false_iff, and_self_iff, mem_support]
[GOAL]
case pos
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f g : Perm α
x y : α
hx : ¬↑f x = x
hy : SameCycle f x y
⊢ ¬↑f y = y
[PROOFSTEP]
rcases hy with ⟨k, rfl⟩
[GOAL]
case pos.intro
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f g : Perm α
x : α
hx : ¬↑f x = x
k : ℤ
⊢ ¬↑f (↑(f ^ k) x) = ↑(f ^ k) x
[PROOFSTEP]
rw [← not_mem_support]
[GOAL]
case pos.intro
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f g : Perm α
x : α
hx : ¬↑f x = x
k : ℤ
⊢ ¬¬↑(f ^ k) x ∈ support f
[PROOFSTEP]
simpa using hx
[GOAL]
case neg
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f g : Perm α
x y : α
hx : ¬↑f x = x
hy : ¬SameCycle f x y
⊢ y ≠ y ↔ SameCycle f x y ∧ x ∈ support f
[PROOFSTEP]
simpa [hx] using hy
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f g : Perm α
x y : α
hx : ↑f x ≠ x
⊢ y ∈ support (cycleOf f x) ↔ SameCycle f x y
[PROOFSTEP]
rw [mem_support_cycleOf_iff, and_iff_left (mem_support.2 hx)]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ g : Perm α
x✝ y : α
f : Perm α
n : ℕ
x : α
⊢ ↑(f ^ (n % card (support (cycleOf f x)))) x = ↑(f ^ n) x
[PROOFSTEP]
by_cases hx : f x = x
[GOAL]
case pos
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ g : Perm α
x✝ y : α
f : Perm α
n : ℕ
x : α
hx : ↑f x = x
⊢ ↑(f ^ (n % card (support (cycleOf f x)))) x = ↑(f ^ n) x
[PROOFSTEP]
rw [pow_apply_eq_self_of_apply_eq_self hx, pow_apply_eq_self_of_apply_eq_self hx]
[GOAL]
case neg
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ g : Perm α
x✝ y : α
f : Perm α
n : ℕ
x : α
hx : ¬↑f x = x
⊢ ↑(f ^ (n % card (support (cycleOf f x)))) x = ↑(f ^ n) x
[PROOFSTEP]
rw [← cycleOf_pow_apply_self, ← cycleOf_pow_apply_self f, ← (isCycle_cycleOf f hx).orderOf, ← pow_eq_mod_orderOf]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ g : Perm α
x y : α
f : Perm α
⊢ IsCycle (cycleOf f x) ↔ ↑f x ≠ x
[PROOFSTEP]
refine' ⟨fun hx => _, f.isCycle_cycleOf⟩
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ g : Perm α
x y : α
f : Perm α
hx : IsCycle (cycleOf f x)
⊢ ↑f x ≠ x
[PROOFSTEP]
rw [Ne.def, ← cycleOf_eq_one_iff f]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ g : Perm α
x y : α
f : Perm α
hx : IsCycle (cycleOf f x)
⊢ ¬cycleOf f x = 1
[PROOFSTEP]
exact hx.ne_one
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ g : Perm α
x✝ y : α
f : Perm α
x : α
⊢ ∀ (a : α), ↑f a ∈ ↑(support (cycleOf f x)) ↔ a ∈ ↑(support (cycleOf f x))
[PROOFSTEP]
refine fun _ ↦ ⟨fun h ↦ mem_support_cycleOf_iff.2 ?_, fun h ↦ mem_support_cycleOf_iff.2 ?_⟩
[GOAL]
case refine_1
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ g : Perm α
x✝¹ y : α
f : Perm α
x x✝ : α
h : ↑f x✝ ∈ ↑(support (cycleOf f x))
⊢ SameCycle f x x✝ ∧ x ∈ support f
[PROOFSTEP]
exact ⟨sameCycle_apply_right.1 (mem_support_cycleOf_iff.1 h).1, (mem_support_cycleOf_iff.1 h).2⟩
[GOAL]
case refine_2
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ g : Perm α
x✝¹ y : α
f : Perm α
x x✝ : α
h : x✝ ∈ ↑(support (cycleOf f x))
⊢ SameCycle f x (↑f x✝) ∧ x ∈ support f
[PROOFSTEP]
exact ⟨sameCycle_apply_right.2 (mem_support_cycleOf_iff.1 h).1, (mem_support_cycleOf_iff.1 h).2⟩
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ g : Perm α
x✝ y : α
f : Perm α
x a : α
ha : a ∈ ↑(support (cycleOf f x))
b : α
hb : b ∈ ↑(support (cycleOf f x))
⊢ SameCycle f a b
[PROOFSTEP]
rw [mem_coe, mem_support_cycleOf_iff] at ha hb 
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ g : Perm α
x✝ y : α
f : Perm α
x a : α
ha : SameCycle f x a ∧ x ∈ support f
b : α
hb : SameCycle f x b ∧ x ∈ support f
⊢ SameCycle f a b
[PROOFSTEP]
exact ha.1.symm.trans hb.1
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f g : Perm α
x y : α
h : SameCycle f x y
hx : x ∈ support f
⊢ ∃ i x_1, ↑(f ^ i) x = y
[PROOFSTEP]
rw [mem_support] at hx 
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f g : Perm α
x y : α
h : SameCycle f x y
hx : ↑f x ≠ x
⊢ ∃ i x_1, ↑(f ^ i) x = y
[PROOFSTEP]
have :=
  Equiv.Perm.IsCycleOn.exists_pow_eq (b := y) (f.isCycleOn_support_cycleOf x) (by rw [mem_support_cycleOf_iff' hx])
    (by rwa [mem_support_cycleOf_iff' hx])
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f g : Perm α
x y : α
h : SameCycle f x y
hx : ↑f x ≠ x
⊢ ?m.2768163 ∈ support (cycleOf f x)
[PROOFSTEP]
rw [mem_support_cycleOf_iff' hx]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f g : Perm α
x y : α
h : SameCycle f x y
hx : ↑f x ≠ x
⊢ y ∈ support (cycleOf f x)
[PROOFSTEP]
rwa [mem_support_cycleOf_iff' hx]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f g : Perm α
x y : α
h : SameCycle f x y
hx : ↑f x ≠ x
this : ∃ n, n < card (support (cycleOf f x)) ∧ ↑(f ^ n) x = y
⊢ ∃ i x_1, ↑(f ^ i) x = y
[PROOFSTEP]
simp_rw [← exists_prop] at this 
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f g : Perm α
x y : α
h : SameCycle f x y
hx : ↑f x ≠ x
this : ∃ n _h, ↑(f ^ n) x = y
⊢ ∃ i x_1, ↑(f ^ i) x = y
[PROOFSTEP]
exact this
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ g : Perm α
x y : α
f : Perm α
h : SameCycle f x y
⊢ ∃ i x_1 x_2, ↑(f ^ i) x = y
[PROOFSTEP]
by_cases hx : x ∈ f.support
[GOAL]
case pos
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ g : Perm α
x y : α
f : Perm α
h : SameCycle f x y
hx : x ∈ support f
⊢ ∃ i x_1 x_2, ↑(f ^ i) x = y
[PROOFSTEP]
obtain ⟨k, hk, hk'⟩ := h.exists_pow_eq_of_mem_support hx
[GOAL]
case pos.intro.intro
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ g : Perm α
x y : α
f : Perm α
h : SameCycle f x y
hx : x ∈ support f
k : ℕ
hk : k < card (support (cycleOf f x))
hk' : ↑(f ^ k) x = y
⊢ ∃ i x_1 x_2, ↑(f ^ i) x = y
[PROOFSTEP]
cases' k with k
[GOAL]
case pos.intro.intro.zero
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ g : Perm α
x y : α
f : Perm α
h : SameCycle f x y
hx : x ∈ support f
hk : Nat.zero < card (support (cycleOf f x))
hk' : ↑(f ^ Nat.zero) x = y
⊢ ∃ i x_1 x_2, ↑(f ^ i) x = y
[PROOFSTEP]
refine' ⟨(f.cycleOf x).support.card, _, self_le_add_right _ _, _⟩
[GOAL]
case pos.intro.intro.zero.refine'_1
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ g : Perm α
x y : α
f : Perm α
h : SameCycle f x y
hx : x ∈ support f
hk : Nat.zero < card (support (cycleOf f x))
hk' : ↑(f ^ Nat.zero) x = y
⊢ 0 < card (support (cycleOf f x))
[PROOFSTEP]
refine' zero_lt_one.trans (one_lt_card_support_of_ne_one _)
[GOAL]
case pos.intro.intro.zero.refine'_1
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ g : Perm α
x y : α
f : Perm α
h : SameCycle f x y
hx : x ∈ support f
hk : Nat.zero < card (support (cycleOf f x))
hk' : ↑(f ^ Nat.zero) x = y
⊢ cycleOf f x ≠ 1
[PROOFSTEP]
simpa using hx
[GOAL]
case pos.intro.intro.zero.refine'_2
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ g : Perm α
x y : α
f : Perm α
h : SameCycle f x y
hx : x ∈ support f
hk : Nat.zero < card (support (cycleOf f x))
hk' : ↑(f ^ Nat.zero) x = y
⊢ ↑(f ^ card (support (cycleOf f x))) x = y
[PROOFSTEP]
simp only [Nat.zero_eq, pow_zero, coe_one, id_eq] at hk' 
[GOAL]
case pos.intro.intro.zero.refine'_2
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ g : Perm α
x y : α
f : Perm α
h : SameCycle f x y
hx : x ∈ support f
hk : Nat.zero < card (support (cycleOf f x))
hk' : x = y
⊢ ↑(f ^ card (support (cycleOf f x))) x = y
[PROOFSTEP]
subst hk'
[GOAL]
case pos.intro.intro.zero.refine'_2
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ g : Perm α
x : α
f : Perm α
hx : x ∈ support f
hk : Nat.zero < card (support (cycleOf f x))
h : SameCycle f x x
⊢ ↑(f ^ card (support (cycleOf f x))) x = x
[PROOFSTEP]
rw [← (isCycle_cycleOf _ <| mem_support.1 hx).orderOf, ← cycleOf_pow_apply_self, pow_orderOf_eq_one, one_apply]
[GOAL]
case pos.intro.intro.succ
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ g : Perm α
x y : α
f : Perm α
h : SameCycle f x y
hx : x ∈ support f
k : ℕ
hk : Nat.succ k < card (support (cycleOf f x))
hk' : ↑(f ^ Nat.succ k) x = y
⊢ ∃ i x_1 x_2, ↑(f ^ i) x = y
[PROOFSTEP]
exact ⟨k + 1, by simp, Nat.le_succ_of_le hk.le, hk'⟩
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ g : Perm α
x y : α
f : Perm α
h : SameCycle f x y
hx : x ∈ support f
k : ℕ
hk : Nat.succ k < card (support (cycleOf f x))
hk' : ↑(f ^ Nat.succ k) x = y
⊢ 0 < k + 1
[PROOFSTEP]
simp
[GOAL]
case neg
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ g : Perm α
x y : α
f : Perm α
h : SameCycle f x y
hx : ¬x ∈ support f
⊢ ∃ i x_1 x_2, ↑(f ^ i) x = y
[PROOFSTEP]
refine' ⟨1, zero_lt_one, by simp, _⟩
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ g : Perm α
x y : α
f : Perm α
h : SameCycle f x y
hx : ¬x ∈ support f
⊢ 1 ≤ card (support (cycleOf f x)) + 1
[PROOFSTEP]
simp
[GOAL]
case neg
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ g : Perm α
x y : α
f : Perm α
h : SameCycle f x y
hx : ¬x ∈ support f
⊢ ↑(f ^ 1) x = y
[PROOFSTEP]
obtain ⟨k, rfl⟩ := h
[GOAL]
case neg.intro
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ g : Perm α
x : α
f : Perm α
hx : ¬x ∈ support f
k : ℤ
⊢ ↑(f ^ 1) x = ↑(f ^ k) x
[PROOFSTEP]
rw [not_mem_support] at hx 
[GOAL]
case neg.intro
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ g : Perm α
x : α
f : Perm α
hx : ↑f x = x
k : ℤ
⊢ ↑(f ^ 1) x = ↑(f ^ k) x
[PROOFSTEP]
rw [pow_apply_eq_self_of_apply_eq_self hx, zpow_apply_eq_self_of_apply_eq_self hx]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
⊢ (l : List α) →
    (f : Perm α) →
      (∀ {x : α}, ↑f x ≠ x → x ∈ l) →
        { l // List.prod l = f ∧ (∀ (g : Perm α), g ∈ l → IsCycle g) ∧ List.Pairwise Disjoint l }
[PROOFSTEP]
intro l f h
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
l : List α
f : Perm α
h : ∀ {x : α}, ↑f x ≠ x → x ∈ l
⊢ { l // List.prod l = f ∧ (∀ (g : Perm α), g ∈ l → IsCycle g) ∧ List.Pairwise Disjoint l }
[PROOFSTEP]
exact
  match l with
  | [] =>
    ⟨[], by
      {
      simp only [imp_false, List.Pairwise.nil, List.not_mem_nil, forall_const, and_true_iff, forall_prop_of_false,
        Classical.not_not, not_false_iff, List.prod_nil] at *
      ext
      simp [*]
    }⟩
  | x :: l =>
    if hx : f x = x then
      cycleFactorsAux l f (by intro y hy; exact List.mem_of_ne_of_mem (fun h => hy (by rwa [h])) (h hy))
    else
      let ⟨m, hm₁, hm₂, hm₃⟩ :=
        cycleFactorsAux l ((cycleOf f x)⁻¹ * f)
          (by
            intro y hy
            exact
              List.mem_of_ne_of_mem
                (fun h : y = x => by
                  rw [h, mul_apply, Ne.def, inv_eq_iff_eq, cycleOf_apply_self] at hy 
                  exact hy rfl)
                (h fun h : f y = y =>
                  by
                  rw [mul_apply, h, Ne.def, inv_eq_iff_eq, cycleOf_apply] at hy 
                  split_ifs at hy  <;> tauto))
      ⟨cycleOf f x :: m, by
        rw [List.prod_cons, hm₁]
        simp, fun g hg ↦ ((List.mem_cons).1 hg).elim (fun hg => hg.symm ▸ isCycle_cycleOf _ hx) (hm₂ g),
        List.pairwise_cons.2
          ⟨fun g hg y =>
            or_iff_not_imp_left.2 fun hfy =>
              have hxy : SameCycle f x y := Classical.not_not.1 (mt cycleOf_apply_of_not_sameCycle hfy)
              have hgm : (g :: m.erase g) ~ m := List.cons_perm_iff_perm_erase.2 ⟨hg, List.Perm.refl _⟩
              have : ∀ h ∈ m.erase g, Disjoint g h :=
                (List.pairwise_cons.1 ((hgm.pairwise_iff fun a b (h : Disjoint a b) => h.symm).2 hm₃)).1
              by_cases id fun hgy : g y ≠ y =>
                (disjoint_prod_right _ this y).resolve_right <|
                  by
                  have hsc : SameCycle f⁻¹ x (f y) := by rwa [sameCycle_inv, sameCycle_apply_right]
                  rw [disjoint_prod_perm hm₃ hgm.symm, List.prod_cons, ← eq_inv_mul_iff_mul_eq] at hm₁ 
                  rwa [hm₁, mul_apply, mul_apply, cycleOf_inv, hsc.cycleOf_apply, inv_apply_self, inv_eq_iff_eq,
                    eq_comm],
            hm₃⟩⟩
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
l : List α
f : Perm α
h : ∀ {x : α}, ↑f x ≠ x → x ∈ []
⊢ List.prod [] = f ∧ (∀ (g : Perm α), g ∈ [] → IsCycle g) ∧ List.Pairwise Disjoint []
[PROOFSTEP]
{ simp only [imp_false, List.Pairwise.nil, List.not_mem_nil, forall_const, and_true_iff, forall_prop_of_false,
    Classical.not_not, not_false_iff, List.prod_nil] at *
  ext
  simp [*]
}
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
l : List α
f : Perm α
h : ∀ {x : α}, ↑f x ≠ x → x ∈ []
⊢ List.prod [] = f ∧ (∀ (g : Perm α), g ∈ [] → IsCycle g) ∧ List.Pairwise Disjoint []
[PROOFSTEP]
simp only [imp_false, List.Pairwise.nil, List.not_mem_nil, forall_const, and_true_iff, forall_prop_of_false,
  Classical.not_not, not_false_iff, List.prod_nil] at *
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
l : List α
f : Perm α
h : ∀ {x : α}, ↑f x = x
⊢ 1 = f
[PROOFSTEP]
ext
[GOAL]
case H
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
l : List α
f : Perm α
h : ∀ {x : α}, ↑f x = x
x✝ : α
⊢ ↑1 x✝ = ↑f x✝
[PROOFSTEP]
simp [*]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
l✝ : List α
f : Perm α
x : α
l : List α
h : ∀ {x_1 : α}, ↑f x_1 ≠ x_1 → x_1 ∈ x :: l
hx : ↑f x = x
⊢ ∀ {x : α}, ↑f x ≠ x → x ∈ l
[PROOFSTEP]
intro y hy
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
l✝ : List α
f : Perm α
x : α
l : List α
h : ∀ {x_1 : α}, ↑f x_1 ≠ x_1 → x_1 ∈ x :: l
hx : ↑f x = x
y : α
hy : ↑f y ≠ y
⊢ y ∈ l
[PROOFSTEP]
exact List.mem_of_ne_of_mem (fun h => hy (by rwa [h])) (h hy)
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
l✝ : List α
f : Perm α
x : α
l : List α
h✝ : ∀ {x_1 : α}, ↑f x_1 ≠ x_1 → x_1 ∈ x :: l
hx : ↑f x = x
y : α
hy : ↑f y ≠ y
h : y = x
⊢ ↑f y = y
[PROOFSTEP]
rwa [h]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
l✝ : List α
f : Perm α
x : α
l : List α
h : ∀ {x_1 : α}, ↑f x_1 ≠ x_1 → x_1 ∈ x :: l
hx : ¬↑f x = x
⊢ ∀ {x_1 : α}, ↑((cycleOf f x)⁻¹ * f) x_1 ≠ x_1 → x_1 ∈ l
[PROOFSTEP]
intro y hy
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
l✝ : List α
f : Perm α
x : α
l : List α
h : ∀ {x_1 : α}, ↑f x_1 ≠ x_1 → x_1 ∈ x :: l
hx : ¬↑f x = x
y : α
hy : ↑((cycleOf f x)⁻¹ * f) y ≠ y
⊢ y ∈ l
[PROOFSTEP]
exact
  List.mem_of_ne_of_mem
    (fun h : y = x => by
      rw [h, mul_apply, Ne.def, inv_eq_iff_eq, cycleOf_apply_self] at hy 
      exact hy rfl)
    (h fun h : f y = y => by
      rw [mul_apply, h, Ne.def, inv_eq_iff_eq, cycleOf_apply] at hy 
      split_ifs at hy  <;> tauto)
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
l✝ : List α
f : Perm α
x : α
l : List α
h✝ : ∀ {x_1 : α}, ↑f x_1 ≠ x_1 → x_1 ∈ x :: l
hx : ¬↑f x = x
y : α
hy : ↑((cycleOf f x)⁻¹ * f) y ≠ y
h : y = x
⊢ False
[PROOFSTEP]
rw [h, mul_apply, Ne.def, inv_eq_iff_eq, cycleOf_apply_self] at hy 
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
l✝ : List α
f : Perm α
x : α
l : List α
h✝ : ∀ {x_1 : α}, ↑f x_1 ≠ x_1 → x_1 ∈ x :: l
hx : ¬↑f x = x
y : α
hy : ¬↑f x = ↑f x
h : y = x
⊢ False
[PROOFSTEP]
exact hy rfl
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
l✝ : List α
f : Perm α
x : α
l : List α
h✝ : ∀ {x_1 : α}, ↑f x_1 ≠ x_1 → x_1 ∈ x :: l
hx : ¬↑f x = x
y : α
hy : ↑((cycleOf f x)⁻¹ * f) y ≠ y
h : ↑f y = y
⊢ False
[PROOFSTEP]
rw [mul_apply, h, Ne.def, inv_eq_iff_eq, cycleOf_apply] at hy 
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
l✝ : List α
f : Perm α
x : α
l : List α
h✝ : ∀ {x_1 : α}, ↑f x_1 ≠ x_1 → x_1 ∈ x :: l
hx : ¬↑f x = x
y : α
hy : ¬y = if SameCycle f x y then ↑f y else y
h : ↑f y = y
⊢ False
[PROOFSTEP]
split_ifs at hy 
[GOAL]
case pos
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
l✝ : List α
f : Perm α
x : α
l : List α
h✝¹ : ∀ {x_1 : α}, ↑f x_1 ≠ x_1 → x_1 ∈ x :: l
hx : ¬↑f x = x
y : α
h : ↑f y = y
h✝ : SameCycle f x y
hy : ¬y = ↑f y
⊢ False
[PROOFSTEP]
tauto
[GOAL]
case neg
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
l✝ : List α
f : Perm α
x : α
l : List α
h✝¹ : ∀ {x_1 : α}, ↑f x_1 ≠ x_1 → x_1 ∈ x :: l
hx : ¬↑f x = x
y : α
h : ↑f y = y
h✝ : ¬SameCycle f x y
hy : ¬y = y
⊢ False
[PROOFSTEP]
tauto
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
l✝ : List α
f : Perm α
x : α
l : List α
h : ∀ {x_1 : α}, ↑f x_1 ≠ x_1 → x_1 ∈ x :: l
hx : ¬↑f x = x
m : List (Perm α)
hm₁ : List.prod m = (cycleOf f x)⁻¹ * f
hm₂ : ∀ (g : Perm α), g ∈ m → IsCycle g
hm₃ : List.Pairwise Disjoint m
⊢ List.prod (cycleOf f x :: m) = f
[PROOFSTEP]
rw [List.prod_cons, hm₁]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
l✝ : List α
f : Perm α
x : α
l : List α
h : ∀ {x_1 : α}, ↑f x_1 ≠ x_1 → x_1 ∈ x :: l
hx : ¬↑f x = x
m : List (Perm α)
hm₁ : List.prod m = (cycleOf f x)⁻¹ * f
hm₂ : ∀ (g : Perm α), g ∈ m → IsCycle g
hm₃ : List.Pairwise Disjoint m
⊢ cycleOf f x * ((cycleOf f x)⁻¹ * f) = f
[PROOFSTEP]
simp
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
l✝ : List α
f : Perm α
x : α
l : List α
h : ∀ {x_1 : α}, ↑f x_1 ≠ x_1 → x_1 ∈ x :: l
hx : ¬↑f x = x
m : List (Perm α)
hm₁ : List.prod m = (cycleOf f x)⁻¹ * f
hm₂ : ∀ (g : Perm α), g ∈ m → IsCycle g
hm₃ : List.Pairwise Disjoint m
g : Perm α
hg : g ∈ m
y : α
hfy : ¬↑(cycleOf f x) y = y
hxy : SameCycle f x y
hgm : g :: List.erase m g ~ m
this : ∀ (h : Perm α), h ∈ List.erase m g → Disjoint g h
hgy : ↑g y ≠ y
⊢ ¬↑(List.prod (List.erase m g)) y = y
[PROOFSTEP]
have hsc : SameCycle f⁻¹ x (f y) := by rwa [sameCycle_inv, sameCycle_apply_right]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
l✝ : List α
f : Perm α
x : α
l : List α
h : ∀ {x_1 : α}, ↑f x_1 ≠ x_1 → x_1 ∈ x :: l
hx : ¬↑f x = x
m : List (Perm α)
hm₁ : List.prod m = (cycleOf f x)⁻¹ * f
hm₂ : ∀ (g : Perm α), g ∈ m → IsCycle g
hm₃ : List.Pairwise Disjoint m
g : Perm α
hg : g ∈ m
y : α
hfy : ¬↑(cycleOf f x) y = y
hxy : SameCycle f x y
hgm : g :: List.erase m g ~ m
this : ∀ (h : Perm α), h ∈ List.erase m g → Disjoint g h
hgy : ↑g y ≠ y
⊢ SameCycle f⁻¹ x (↑f y)
[PROOFSTEP]
rwa [sameCycle_inv, sameCycle_apply_right]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
l✝ : List α
f : Perm α
x : α
l : List α
h : ∀ {x_1 : α}, ↑f x_1 ≠ x_1 → x_1 ∈ x :: l
hx : ¬↑f x = x
m : List (Perm α)
hm₁ : List.prod m = (cycleOf f x)⁻¹ * f
hm₂ : ∀ (g : Perm α), g ∈ m → IsCycle g
hm₃ : List.Pairwise Disjoint m
g : Perm α
hg : g ∈ m
y : α
hfy : ¬↑(cycleOf f x) y = y
hxy : SameCycle f x y
hgm : g :: List.erase m g ~ m
this : ∀ (h : Perm α), h ∈ List.erase m g → Disjoint g h
hgy : ↑g y ≠ y
hsc : SameCycle f⁻¹ x (↑f y)
⊢ ¬↑(List.prod (List.erase m g)) y = y
[PROOFSTEP]
rw [disjoint_prod_perm hm₃ hgm.symm, List.prod_cons, ← eq_inv_mul_iff_mul_eq] at hm₁ 
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
l✝ : List α
f : Perm α
x : α
l : List α
h : ∀ {x_1 : α}, ↑f x_1 ≠ x_1 → x_1 ∈ x :: l
hx : ¬↑f x = x
m : List (Perm α)
hm₂ : ∀ (g : Perm α), g ∈ m → IsCycle g
hm₃ : List.Pairwise Disjoint m
g : Perm α
hm₁ : List.prod (List.erase m g) = g⁻¹ * ((cycleOf f x)⁻¹ * f)
hg : g ∈ m
y : α
hfy : ¬↑(cycleOf f x) y = y
hxy : SameCycle f x y
hgm : g :: List.erase m g ~ m
this : ∀ (h : Perm α), h ∈ List.erase m g → Disjoint g h
hgy : ↑g y ≠ y
hsc : SameCycle f⁻¹ x (↑f y)
⊢ ¬↑(List.prod (List.erase m g)) y = y
[PROOFSTEP]
rwa [hm₁, mul_apply, mul_apply, cycleOf_inv, hsc.cycleOf_apply, inv_apply_self, inv_eq_iff_eq, eq_comm]
[GOAL]
ι : Type u_1
α✝ : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α✝
α : Type u_4
inst✝ : Finite α
l : List (Perm α)
h1 : ∀ (σ : Perm α), σ ∈ l → IsCycle σ
h2 : List.Pairwise Disjoint l
σ : Perm α
⊢ σ ∈ l ↔ IsCycle σ ∧ ∀ (a : α), ↑σ a ≠ a → ↑σ a = ↑(List.prod l) a
[PROOFSTEP]
suffices σ.IsCycle → (σ ∈ l ↔ ∀ (a : α) (_ : σ a ≠ a), σ a = l.prod a) by
  exact ⟨fun hσ => ⟨h1 σ hσ, (this (h1 σ hσ)).mp hσ⟩, fun hσ => (this hσ.1).mpr hσ.2⟩
[GOAL]
ι : Type u_1
α✝ : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α✝
α : Type u_4
inst✝ : Finite α
l : List (Perm α)
h1 : ∀ (σ : Perm α), σ ∈ l → IsCycle σ
h2 : List.Pairwise Disjoint l
σ : Perm α
this : IsCycle σ → (σ ∈ l ↔ ∀ (a : α), ↑σ a ≠ a → ↑σ a = ↑(List.prod l) a)
⊢ σ ∈ l ↔ IsCycle σ ∧ ∀ (a : α), ↑σ a ≠ a → ↑σ a = ↑(List.prod l) a
[PROOFSTEP]
exact ⟨fun hσ => ⟨h1 σ hσ, (this (h1 σ hσ)).mp hσ⟩, fun hσ => (this hσ.1).mpr hσ.2⟩
[GOAL]
ι : Type u_1
α✝ : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α✝
α : Type u_4
inst✝ : Finite α
l : List (Perm α)
h1 : ∀ (σ : Perm α), σ ∈ l → IsCycle σ
h2 : List.Pairwise Disjoint l
σ : Perm α
⊢ IsCycle σ → (σ ∈ l ↔ ∀ (a : α), ↑σ a ≠ a → ↑σ a = ↑(List.prod l) a)
[PROOFSTEP]
intro h3
[GOAL]
ι : Type u_1
α✝ : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α✝
α : Type u_4
inst✝ : Finite α
l : List (Perm α)
h1 : ∀ (σ : Perm α), σ ∈ l → IsCycle σ
h2 : List.Pairwise Disjoint l
σ : Perm α
h3 : IsCycle σ
⊢ σ ∈ l ↔ ∀ (a : α), ↑σ a ≠ a → ↑σ a = ↑(List.prod l) a
[PROOFSTEP]
classical
cases nonempty_fintype α
constructor
· intro h a ha
  exact eq_on_support_mem_disjoint h h2 _ (mem_support.mpr ha)
· intro h
  have hσl : σ.support ⊆ l.prod.support := by
    intro x hx
    rw [mem_support] at hx 
    rwa [mem_support, ← h _ hx]
  obtain ⟨a, ha, -⟩ := id h3
  rw [← mem_support] at ha 
  obtain ⟨τ, hτ, hτa⟩ := exists_mem_support_of_mem_support_prod (hσl ha)
  have hτl : ∀ x ∈ τ.support, τ x = l.prod x := eq_on_support_mem_disjoint hτ h2
  have key : ∀ x ∈ σ.support ∩ τ.support, σ x = τ x := by
    intro x hx
    rw [h x (mem_support.mp (mem_of_mem_inter_left hx)), hτl x (mem_of_mem_inter_right hx)]
  convert hτ
  refine' h3.eq_on_support_inter_nonempty_congr (h1 _ hτ) key _ ha
  exact key a (mem_inter_of_mem ha hτa)
[GOAL]
ι : Type u_1
α✝ : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α✝
α : Type u_4
inst✝ : Finite α
l : List (Perm α)
h1 : ∀ (σ : Perm α), σ ∈ l → IsCycle σ
h2 : List.Pairwise Disjoint l
σ : Perm α
h3 : IsCycle σ
⊢ σ ∈ l ↔ ∀ (a : α), ↑σ a ≠ a → ↑σ a = ↑(List.prod l) a
[PROOFSTEP]
cases nonempty_fintype α
[GOAL]
case intro
ι : Type u_1
α✝ : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α✝
α : Type u_4
inst✝ : Finite α
l : List (Perm α)
h1 : ∀ (σ : Perm α), σ ∈ l → IsCycle σ
h2 : List.Pairwise Disjoint l
σ : Perm α
h3 : IsCycle σ
val✝ : Fintype α
⊢ σ ∈ l ↔ ∀ (a : α), ↑σ a ≠ a → ↑σ a = ↑(List.prod l) a
[PROOFSTEP]
constructor
[GOAL]
case intro.mp
ι : Type u_1
α✝ : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α✝
α : Type u_4
inst✝ : Finite α
l : List (Perm α)
h1 : ∀ (σ : Perm α), σ ∈ l → IsCycle σ
h2 : List.Pairwise Disjoint l
σ : Perm α
h3 : IsCycle σ
val✝ : Fintype α
⊢ σ ∈ l → ∀ (a : α), ↑σ a ≠ a → ↑σ a = ↑(List.prod l) a
[PROOFSTEP]
intro h a ha
[GOAL]
case intro.mp
ι : Type u_1
α✝ : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α✝
α : Type u_4
inst✝ : Finite α
l : List (Perm α)
h1 : ∀ (σ : Perm α), σ ∈ l → IsCycle σ
h2 : List.Pairwise Disjoint l
σ : Perm α
h3 : IsCycle σ
val✝ : Fintype α
h : σ ∈ l
a : α
ha : ↑σ a ≠ a
⊢ ↑σ a = ↑(List.prod l) a
[PROOFSTEP]
exact eq_on_support_mem_disjoint h h2 _ (mem_support.mpr ha)
[GOAL]
case intro.mpr
ι : Type u_1
α✝ : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α✝
α : Type u_4
inst✝ : Finite α
l : List (Perm α)
h1 : ∀ (σ : Perm α), σ ∈ l → IsCycle σ
h2 : List.Pairwise Disjoint l
σ : Perm α
h3 : IsCycle σ
val✝ : Fintype α
⊢ (∀ (a : α), ↑σ a ≠ a → ↑σ a = ↑(List.prod l) a) → σ ∈ l
[PROOFSTEP]
intro h
[GOAL]
case intro.mpr
ι : Type u_1
α✝ : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α✝
α : Type u_4
inst✝ : Finite α
l : List (Perm α)
h1 : ∀ (σ : Perm α), σ ∈ l → IsCycle σ
h2 : List.Pairwise Disjoint l
σ : Perm α
h3 : IsCycle σ
val✝ : Fintype α
h : ∀ (a : α), ↑σ a ≠ a → ↑σ a = ↑(List.prod l) a
⊢ σ ∈ l
[PROOFSTEP]
have hσl : σ.support ⊆ l.prod.support := by
  intro x hx
  rw [mem_support] at hx 
  rwa [mem_support, ← h _ hx]
[GOAL]
ι : Type u_1
α✝ : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α✝
α : Type u_4
inst✝ : Finite α
l : List (Perm α)
h1 : ∀ (σ : Perm α), σ ∈ l → IsCycle σ
h2 : List.Pairwise Disjoint l
σ : Perm α
h3 : IsCycle σ
val✝ : Fintype α
h : ∀ (a : α), ↑σ a ≠ a → ↑σ a = ↑(List.prod l) a
⊢ support σ ⊆ support (List.prod l)
[PROOFSTEP]
intro x hx
[GOAL]
ι : Type u_1
α✝ : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α✝
α : Type u_4
inst✝ : Finite α
l : List (Perm α)
h1 : ∀ (σ : Perm α), σ ∈ l → IsCycle σ
h2 : List.Pairwise Disjoint l
σ : Perm α
h3 : IsCycle σ
val✝ : Fintype α
h : ∀ (a : α), ↑σ a ≠ a → ↑σ a = ↑(List.prod l) a
x : α
hx : x ∈ support σ
⊢ x ∈ support (List.prod l)
[PROOFSTEP]
rw [mem_support] at hx 
[GOAL]
ι : Type u_1
α✝ : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α✝
α : Type u_4
inst✝ : Finite α
l : List (Perm α)
h1 : ∀ (σ : Perm α), σ ∈ l → IsCycle σ
h2 : List.Pairwise Disjoint l
σ : Perm α
h3 : IsCycle σ
val✝ : Fintype α
h : ∀ (a : α), ↑σ a ≠ a → ↑σ a = ↑(List.prod l) a
x : α
hx : ↑σ x ≠ x
⊢ x ∈ support (List.prod l)
[PROOFSTEP]
rwa [mem_support, ← h _ hx]
[GOAL]
case intro.mpr
ι : Type u_1
α✝ : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α✝
α : Type u_4
inst✝ : Finite α
l : List (Perm α)
h1 : ∀ (σ : Perm α), σ ∈ l → IsCycle σ
h2 : List.Pairwise Disjoint l
σ : Perm α
h3 : IsCycle σ
val✝ : Fintype α
h : ∀ (a : α), ↑σ a ≠ a → ↑σ a = ↑(List.prod l) a
hσl : support σ ⊆ support (List.prod l)
⊢ σ ∈ l
[PROOFSTEP]
obtain ⟨a, ha, -⟩ := id h3
[GOAL]
case intro.mpr.intro.intro
ι : Type u_1
α✝ : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α✝
α : Type u_4
inst✝ : Finite α
l : List (Perm α)
h1 : ∀ (σ : Perm α), σ ∈ l → IsCycle σ
h2 : List.Pairwise Disjoint l
σ : Perm α
h3 : IsCycle σ
val✝ : Fintype α
h : ∀ (a : α), ↑σ a ≠ a → ↑σ a = ↑(List.prod l) a
hσl : support σ ⊆ support (List.prod l)
a : α
ha : ↑σ a ≠ a
⊢ σ ∈ l
[PROOFSTEP]
rw [← mem_support] at ha 
[GOAL]
case intro.mpr.intro.intro
ι : Type u_1
α✝ : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α✝
α : Type u_4
inst✝ : Finite α
l : List (Perm α)
h1 : ∀ (σ : Perm α), σ ∈ l → IsCycle σ
h2 : List.Pairwise Disjoint l
σ : Perm α
h3 : IsCycle σ
val✝ : Fintype α
h : ∀ (a : α), ↑σ a ≠ a → ↑σ a = ↑(List.prod l) a
hσl : support σ ⊆ support (List.prod l)
a : α
ha✝ : ↑σ a ≠ a
ha : a ∈ support σ
⊢ σ ∈ l
[PROOFSTEP]
obtain ⟨τ, hτ, hτa⟩ := exists_mem_support_of_mem_support_prod (hσl ha)
[GOAL]
case intro.mpr.intro.intro.intro.intro
ι : Type u_1
α✝ : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α✝
α : Type u_4
inst✝ : Finite α
l : List (Perm α)
h1 : ∀ (σ : Perm α), σ ∈ l → IsCycle σ
h2 : List.Pairwise Disjoint l
σ : Perm α
h3 : IsCycle σ
val✝ : Fintype α
h : ∀ (a : α), ↑σ a ≠ a → ↑σ a = ↑(List.prod l) a
hσl : support σ ⊆ support (List.prod l)
a : α
ha✝ : ↑σ a ≠ a
ha : a ∈ support σ
τ : Perm α
hτ : τ ∈ l
hτa : a ∈ support τ
⊢ σ ∈ l
[PROOFSTEP]
have hτl : ∀ x ∈ τ.support, τ x = l.prod x := eq_on_support_mem_disjoint hτ h2
[GOAL]
case intro.mpr.intro.intro.intro.intro
ι : Type u_1
α✝ : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α✝
α : Type u_4
inst✝ : Finite α
l : List (Perm α)
h1 : ∀ (σ : Perm α), σ ∈ l → IsCycle σ
h2 : List.Pairwise Disjoint l
σ : Perm α
h3 : IsCycle σ
val✝ : Fintype α
h : ∀ (a : α), ↑σ a ≠ a → ↑σ a = ↑(List.prod l) a
hσl : support σ ⊆ support (List.prod l)
a : α
ha✝ : ↑σ a ≠ a
ha : a ∈ support σ
τ : Perm α
hτ : τ ∈ l
hτa : a ∈ support τ
hτl : ∀ (x : α), x ∈ support τ → ↑τ x = ↑(List.prod l) x
⊢ σ ∈ l
[PROOFSTEP]
have key : ∀ x ∈ σ.support ∩ τ.support, σ x = τ x := by
  intro x hx
  rw [h x (mem_support.mp (mem_of_mem_inter_left hx)), hτl x (mem_of_mem_inter_right hx)]
[GOAL]
ι : Type u_1
α✝ : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α✝
α : Type u_4
inst✝ : Finite α
l : List (Perm α)
h1 : ∀ (σ : Perm α), σ ∈ l → IsCycle σ
h2 : List.Pairwise Disjoint l
σ : Perm α
h3 : IsCycle σ
val✝ : Fintype α
h : ∀ (a : α), ↑σ a ≠ a → ↑σ a = ↑(List.prod l) a
hσl : support σ ⊆ support (List.prod l)
a : α
ha✝ : ↑σ a ≠ a
ha : a ∈ support σ
τ : Perm α
hτ : τ ∈ l
hτa : a ∈ support τ
hτl : ∀ (x : α), x ∈ support τ → ↑τ x = ↑(List.prod l) x
⊢ ∀ (x : α), x ∈ support σ ∩ support τ → ↑σ x = ↑τ x
[PROOFSTEP]
intro x hx
[GOAL]
ι : Type u_1
α✝ : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α✝
α : Type u_4
inst✝ : Finite α
l : List (Perm α)
h1 : ∀ (σ : Perm α), σ ∈ l → IsCycle σ
h2 : List.Pairwise Disjoint l
σ : Perm α
h3 : IsCycle σ
val✝ : Fintype α
h : ∀ (a : α), ↑σ a ≠ a → ↑σ a = ↑(List.prod l) a
hσl : support σ ⊆ support (List.prod l)
a : α
ha✝ : ↑σ a ≠ a
ha : a ∈ support σ
τ : Perm α
hτ : τ ∈ l
hτa : a ∈ support τ
hτl : ∀ (x : α), x ∈ support τ → ↑τ x = ↑(List.prod l) x
x : α
hx : x ∈ support σ ∩ support τ
⊢ ↑σ x = ↑τ x
[PROOFSTEP]
rw [h x (mem_support.mp (mem_of_mem_inter_left hx)), hτl x (mem_of_mem_inter_right hx)]
[GOAL]
case intro.mpr.intro.intro.intro.intro
ι : Type u_1
α✝ : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α✝
α : Type u_4
inst✝ : Finite α
l : List (Perm α)
h1 : ∀ (σ : Perm α), σ ∈ l → IsCycle σ
h2 : List.Pairwise Disjoint l
σ : Perm α
h3 : IsCycle σ
val✝ : Fintype α
h : ∀ (a : α), ↑σ a ≠ a → ↑σ a = ↑(List.prod l) a
hσl : support σ ⊆ support (List.prod l)
a : α
ha✝ : ↑σ a ≠ a
ha : a ∈ support σ
τ : Perm α
hτ : τ ∈ l
hτa : a ∈ support τ
hτl : ∀ (x : α), x ∈ support τ → ↑τ x = ↑(List.prod l) x
key : ∀ (x : α), x ∈ support σ ∩ support τ → ↑σ x = ↑τ x
⊢ σ ∈ l
[PROOFSTEP]
convert hτ
[GOAL]
case h.e'_4
ι : Type u_1
α✝ : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α✝
α : Type u_4
inst✝ : Finite α
l : List (Perm α)
h1 : ∀ (σ : Perm α), σ ∈ l → IsCycle σ
h2 : List.Pairwise Disjoint l
σ : Perm α
h3 : IsCycle σ
val✝ : Fintype α
h : ∀ (a : α), ↑σ a ≠ a → ↑σ a = ↑(List.prod l) a
hσl : support σ ⊆ support (List.prod l)
a : α
ha✝ : ↑σ a ≠ a
ha : a ∈ support σ
τ : Perm α
hτ : τ ∈ l
hτa : a ∈ support τ
hτl : ∀ (x : α), x ∈ support τ → ↑τ x = ↑(List.prod l) x
key : ∀ (x : α), x ∈ support σ ∩ support τ → ↑σ x = ↑τ x
⊢ σ = τ
[PROOFSTEP]
refine' h3.eq_on_support_inter_nonempty_congr (h1 _ hτ) key _ ha
[GOAL]
case h.e'_4
ι : Type u_1
α✝ : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α✝
α : Type u_4
inst✝ : Finite α
l : List (Perm α)
h1 : ∀ (σ : Perm α), σ ∈ l → IsCycle σ
h2 : List.Pairwise Disjoint l
σ : Perm α
h3 : IsCycle σ
val✝ : Fintype α
h : ∀ (a : α), ↑σ a ≠ a → ↑σ a = ↑(List.prod l) a
hσl : support σ ⊆ support (List.prod l)
a : α
ha✝ : ↑σ a ≠ a
ha : a ∈ support σ
τ : Perm α
hτ : τ ∈ l
hτa : a ∈ support τ
hτl : ∀ (x : α), x ∈ support τ → ↑τ x = ↑(List.prod l) x
key : ∀ (x : α), x ∈ support σ ∩ support τ → ↑σ x = ↑τ x
⊢ ↑σ a = ↑τ a
[PROOFSTEP]
exact key a (mem_inter_of_mem ha hτa)
[GOAL]
ι : Type u_1
α✝ : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α✝
α : Type u_4
inst✝ : Finite α
l₁ l₂ : List (Perm α)
h₀ : List.prod l₁ = List.prod l₂
h₁l₁ : ∀ (σ : Perm α), σ ∈ l₁ → IsCycle σ
h₁l₂ : ∀ (σ : Perm α), σ ∈ l₂ → IsCycle σ
h₂l₁ : List.Pairwise Disjoint l₁
h₂l₂ : List.Pairwise Disjoint l₂
⊢ l₁ ~ l₂
[PROOFSTEP]
classical
refine'
  (List.perm_ext (nodup_of_pairwise_disjoint_cycles h₁l₁ h₂l₁) (nodup_of_pairwise_disjoint_cycles h₁l₂ h₂l₂)).mpr
    fun σ => _
by_cases hσ : σ.IsCycle
· obtain _ := not_forall.mp (mt ext hσ.ne_one)
  rw [mem_list_cycles_iff h₁l₁ h₂l₁, mem_list_cycles_iff h₁l₂ h₂l₂, h₀]
· exact iff_of_false (mt (h₁l₁ σ) hσ) (mt (h₁l₂ σ) hσ)
[GOAL]
ι : Type u_1
α✝ : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α✝
α : Type u_4
inst✝ : Finite α
l₁ l₂ : List (Perm α)
h₀ : List.prod l₁ = List.prod l₂
h₁l₁ : ∀ (σ : Perm α), σ ∈ l₁ → IsCycle σ
h₁l₂ : ∀ (σ : Perm α), σ ∈ l₂ → IsCycle σ
h₂l₁ : List.Pairwise Disjoint l₁
h₂l₂ : List.Pairwise Disjoint l₂
⊢ l₁ ~ l₂
[PROOFSTEP]
refine'
  (List.perm_ext (nodup_of_pairwise_disjoint_cycles h₁l₁ h₂l₁) (nodup_of_pairwise_disjoint_cycles h₁l₂ h₂l₂)).mpr
    fun σ => _
[GOAL]
ι : Type u_1
α✝ : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α✝
α : Type u_4
inst✝ : Finite α
l₁ l₂ : List (Perm α)
h₀ : List.prod l₁ = List.prod l₂
h₁l₁ : ∀ (σ : Perm α), σ ∈ l₁ → IsCycle σ
h₁l₂ : ∀ (σ : Perm α), σ ∈ l₂ → IsCycle σ
h₂l₁ : List.Pairwise Disjoint l₁
h₂l₂ : List.Pairwise Disjoint l₂
σ : Perm α
⊢ σ ∈ l₁ ↔ σ ∈ l₂
[PROOFSTEP]
by_cases hσ : σ.IsCycle
[GOAL]
case pos
ι : Type u_1
α✝ : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α✝
α : Type u_4
inst✝ : Finite α
l₁ l₂ : List (Perm α)
h₀ : List.prod l₁ = List.prod l₂
h₁l₁ : ∀ (σ : Perm α), σ ∈ l₁ → IsCycle σ
h₁l₂ : ∀ (σ : Perm α), σ ∈ l₂ → IsCycle σ
h₂l₁ : List.Pairwise Disjoint l₁
h₂l₂ : List.Pairwise Disjoint l₂
σ : Perm α
hσ : IsCycle σ
⊢ σ ∈ l₁ ↔ σ ∈ l₂
[PROOFSTEP]
obtain _ := not_forall.mp (mt ext hσ.ne_one)
[GOAL]
case pos
ι : Type u_1
α✝ : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α✝
α : Type u_4
inst✝ : Finite α
l₁ l₂ : List (Perm α)
h₀ : List.prod l₁ = List.prod l₂
h₁l₁ : ∀ (σ : Perm α), σ ∈ l₁ → IsCycle σ
h₁l₂ : ∀ (σ : Perm α), σ ∈ l₂ → IsCycle σ
h₂l₁ : List.Pairwise Disjoint l₁
h₂l₂ : List.Pairwise Disjoint l₂
σ : Perm α
hσ : IsCycle σ
x✝ : ∃ x, ¬↑σ x = ↑1 x
⊢ σ ∈ l₁ ↔ σ ∈ l₂
[PROOFSTEP]
rw [mem_list_cycles_iff h₁l₁ h₂l₁, mem_list_cycles_iff h₁l₂ h₂l₂, h₀]
[GOAL]
case neg
ι : Type u_1
α✝ : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α✝
α : Type u_4
inst✝ : Finite α
l₁ l₂ : List (Perm α)
h₀ : List.prod l₁ = List.prod l₂
h₁l₁ : ∀ (σ : Perm α), σ ∈ l₁ → IsCycle σ
h₁l₂ : ∀ (σ : Perm α), σ ∈ l₂ → IsCycle σ
h₂l₁ : List.Pairwise Disjoint l₁
h₂l₂ : List.Pairwise Disjoint l₂
σ : Perm α
hσ : ¬IsCycle σ
⊢ σ ∈ l₁ ↔ σ ∈ l₂
[PROOFSTEP]
exact iff_of_false (mt (h₁l₁ σ) hσ) (mt (h₁l₂ σ) hσ)
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f σ : Perm α
l : List (Perm α)
hn : List.Nodup l
⊢ cycleFactorsFinset σ = List.toFinset l ↔
    (∀ (f : Perm α), f ∈ l → IsCycle f) ∧ List.Pairwise Disjoint l ∧ List.prod l = σ
[PROOFSTEP]
obtain ⟨⟨l', hp', hc', hd'⟩, hl⟩ := Trunc.exists_rep σ.truncCycleFactors
[GOAL]
case intro.mk.intro.intro
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f σ : Perm α
l : List (Perm α)
hn : List.Nodup l
l' : List (Perm α)
hp' : List.prod l' = σ
hc' : ∀ (g : Perm α), g ∈ l' → IsCycle g
hd' : List.Pairwise Disjoint l'
hl :
  Trunc.mk
      { val := l',
        property := (_ : List.prod l' = σ ∧ (∀ (g : Perm α), g ∈ l' → IsCycle g) ∧ List.Pairwise Disjoint l') } =
    truncCycleFactors σ
⊢ cycleFactorsFinset σ = List.toFinset l ↔
    (∀ (f : Perm α), f ∈ l → IsCycle f) ∧ List.Pairwise Disjoint l ∧ List.prod l = σ
[PROOFSTEP]
have ht : cycleFactorsFinset σ = l'.toFinset := by rw [cycleFactorsFinset, ← hl, Trunc.lift_mk]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f σ : Perm α
l : List (Perm α)
hn : List.Nodup l
l' : List (Perm α)
hp' : List.prod l' = σ
hc' : ∀ (g : Perm α), g ∈ l' → IsCycle g
hd' : List.Pairwise Disjoint l'
hl :
  Trunc.mk
      { val := l',
        property := (_ : List.prod l' = σ ∧ (∀ (g : Perm α), g ∈ l' → IsCycle g) ∧ List.Pairwise Disjoint l') } =
    truncCycleFactors σ
⊢ cycleFactorsFinset σ = List.toFinset l'
[PROOFSTEP]
rw [cycleFactorsFinset, ← hl, Trunc.lift_mk]
[GOAL]
case intro.mk.intro.intro
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f σ : Perm α
l : List (Perm α)
hn : List.Nodup l
l' : List (Perm α)
hp' : List.prod l' = σ
hc' : ∀ (g : Perm α), g ∈ l' → IsCycle g
hd' : List.Pairwise Disjoint l'
hl :
  Trunc.mk
      { val := l',
        property := (_ : List.prod l' = σ ∧ (∀ (g : Perm α), g ∈ l' → IsCycle g) ∧ List.Pairwise Disjoint l') } =
    truncCycleFactors σ
ht : cycleFactorsFinset σ = List.toFinset l'
⊢ cycleFactorsFinset σ = List.toFinset l ↔
    (∀ (f : Perm α), f ∈ l → IsCycle f) ∧ List.Pairwise Disjoint l ∧ List.prod l = σ
[PROOFSTEP]
rw [ht]
[GOAL]
case intro.mk.intro.intro
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f σ : Perm α
l : List (Perm α)
hn : List.Nodup l
l' : List (Perm α)
hp' : List.prod l' = σ
hc' : ∀ (g : Perm α), g ∈ l' → IsCycle g
hd' : List.Pairwise Disjoint l'
hl :
  Trunc.mk
      { val := l',
        property := (_ : List.prod l' = σ ∧ (∀ (g : Perm α), g ∈ l' → IsCycle g) ∧ List.Pairwise Disjoint l') } =
    truncCycleFactors σ
ht : cycleFactorsFinset σ = List.toFinset l'
⊢ List.toFinset l' = List.toFinset l ↔ (∀ (f : Perm α), f ∈ l → IsCycle f) ∧ List.Pairwise Disjoint l ∧ List.prod l = σ
[PROOFSTEP]
constructor
[GOAL]
case intro.mk.intro.intro.mp
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f σ : Perm α
l : List (Perm α)
hn : List.Nodup l
l' : List (Perm α)
hp' : List.prod l' = σ
hc' : ∀ (g : Perm α), g ∈ l' → IsCycle g
hd' : List.Pairwise Disjoint l'
hl :
  Trunc.mk
      { val := l',
        property := (_ : List.prod l' = σ ∧ (∀ (g : Perm α), g ∈ l' → IsCycle g) ∧ List.Pairwise Disjoint l') } =
    truncCycleFactors σ
ht : cycleFactorsFinset σ = List.toFinset l'
⊢ List.toFinset l' = List.toFinset l → (∀ (f : Perm α), f ∈ l → IsCycle f) ∧ List.Pairwise Disjoint l ∧ List.prod l = σ
[PROOFSTEP]
intro h
[GOAL]
case intro.mk.intro.intro.mp
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f σ : Perm α
l : List (Perm α)
hn : List.Nodup l
l' : List (Perm α)
hp' : List.prod l' = σ
hc' : ∀ (g : Perm α), g ∈ l' → IsCycle g
hd' : List.Pairwise Disjoint l'
hl :
  Trunc.mk
      { val := l',
        property := (_ : List.prod l' = σ ∧ (∀ (g : Perm α), g ∈ l' → IsCycle g) ∧ List.Pairwise Disjoint l') } =
    truncCycleFactors σ
ht : cycleFactorsFinset σ = List.toFinset l'
h : List.toFinset l' = List.toFinset l
⊢ (∀ (f : Perm α), f ∈ l → IsCycle f) ∧ List.Pairwise Disjoint l ∧ List.prod l = σ
[PROOFSTEP]
have hn' : l'.Nodup := nodup_of_pairwise_disjoint_cycles hc' hd'
[GOAL]
case intro.mk.intro.intro.mp
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f σ : Perm α
l : List (Perm α)
hn : List.Nodup l
l' : List (Perm α)
hp' : List.prod l' = σ
hc' : ∀ (g : Perm α), g ∈ l' → IsCycle g
hd' : List.Pairwise Disjoint l'
hl :
  Trunc.mk
      { val := l',
        property := (_ : List.prod l' = σ ∧ (∀ (g : Perm α), g ∈ l' → IsCycle g) ∧ List.Pairwise Disjoint l') } =
    truncCycleFactors σ
ht : cycleFactorsFinset σ = List.toFinset l'
h : List.toFinset l' = List.toFinset l
hn' : List.Nodup l'
⊢ (∀ (f : Perm α), f ∈ l → IsCycle f) ∧ List.Pairwise Disjoint l ∧ List.prod l = σ
[PROOFSTEP]
have hperm : l ~ l' := List.perm_of_nodup_nodup_toFinset_eq hn hn' h.symm
[GOAL]
case intro.mk.intro.intro.mp
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f σ : Perm α
l : List (Perm α)
hn : List.Nodup l
l' : List (Perm α)
hp' : List.prod l' = σ
hc' : ∀ (g : Perm α), g ∈ l' → IsCycle g
hd' : List.Pairwise Disjoint l'
hl :
  Trunc.mk
      { val := l',
        property := (_ : List.prod l' = σ ∧ (∀ (g : Perm α), g ∈ l' → IsCycle g) ∧ List.Pairwise Disjoint l') } =
    truncCycleFactors σ
ht : cycleFactorsFinset σ = List.toFinset l'
h : List.toFinset l' = List.toFinset l
hn' : List.Nodup l'
hperm : l ~ l'
⊢ (∀ (f : Perm α), f ∈ l → IsCycle f) ∧ List.Pairwise Disjoint l ∧ List.prod l = σ
[PROOFSTEP]
refine' ⟨_, _, _⟩
[GOAL]
case intro.mk.intro.intro.mp.refine'_1
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f σ : Perm α
l : List (Perm α)
hn : List.Nodup l
l' : List (Perm α)
hp' : List.prod l' = σ
hc' : ∀ (g : Perm α), g ∈ l' → IsCycle g
hd' : List.Pairwise Disjoint l'
hl :
  Trunc.mk
      { val := l',
        property := (_ : List.prod l' = σ ∧ (∀ (g : Perm α), g ∈ l' → IsCycle g) ∧ List.Pairwise Disjoint l') } =
    truncCycleFactors σ
ht : cycleFactorsFinset σ = List.toFinset l'
h : List.toFinset l' = List.toFinset l
hn' : List.Nodup l'
hperm : l ~ l'
⊢ ∀ (f : Perm α), f ∈ l → IsCycle f
[PROOFSTEP]
exact fun _ h => hc' _ (hperm.subset h)
[GOAL]
case intro.mk.intro.intro.mp.refine'_2
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f σ : Perm α
l : List (Perm α)
hn : List.Nodup l
l' : List (Perm α)
hp' : List.prod l' = σ
hc' : ∀ (g : Perm α), g ∈ l' → IsCycle g
hd' : List.Pairwise Disjoint l'
hl :
  Trunc.mk
      { val := l',
        property := (_ : List.prod l' = σ ∧ (∀ (g : Perm α), g ∈ l' → IsCycle g) ∧ List.Pairwise Disjoint l') } =
    truncCycleFactors σ
ht : cycleFactorsFinset σ = List.toFinset l'
h : List.toFinset l' = List.toFinset l
hn' : List.Nodup l'
hperm : l ~ l'
⊢ List.Pairwise Disjoint l
[PROOFSTEP]
rwa [List.Perm.pairwise_iff Disjoint.symmetric hperm]
[GOAL]
case intro.mk.intro.intro.mp.refine'_3
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f σ : Perm α
l : List (Perm α)
hn : List.Nodup l
l' : List (Perm α)
hp' : List.prod l' = σ
hc' : ∀ (g : Perm α), g ∈ l' → IsCycle g
hd' : List.Pairwise Disjoint l'
hl :
  Trunc.mk
      { val := l',
        property := (_ : List.prod l' = σ ∧ (∀ (g : Perm α), g ∈ l' → IsCycle g) ∧ List.Pairwise Disjoint l') } =
    truncCycleFactors σ
ht : cycleFactorsFinset σ = List.toFinset l'
h : List.toFinset l' = List.toFinset l
hn' : List.Nodup l'
hperm : l ~ l'
⊢ List.prod l = σ
[PROOFSTEP]
rw [← hp', hperm.symm.prod_eq']
[GOAL]
case intro.mk.intro.intro.mp.refine'_3
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f σ : Perm α
l : List (Perm α)
hn : List.Nodup l
l' : List (Perm α)
hp' : List.prod l' = σ
hc' : ∀ (g : Perm α), g ∈ l' → IsCycle g
hd' : List.Pairwise Disjoint l'
hl :
  Trunc.mk
      { val := l',
        property := (_ : List.prod l' = σ ∧ (∀ (g : Perm α), g ∈ l' → IsCycle g) ∧ List.Pairwise Disjoint l') } =
    truncCycleFactors σ
ht : cycleFactorsFinset σ = List.toFinset l'
h : List.toFinset l' = List.toFinset l
hn' : List.Nodup l'
hperm : l ~ l'
⊢ List.Pairwise Commute l'
[PROOFSTEP]
refine' hd'.imp _
[GOAL]
case intro.mk.intro.intro.mp.refine'_3
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f σ : Perm α
l : List (Perm α)
hn : List.Nodup l
l' : List (Perm α)
hp' : List.prod l' = σ
hc' : ∀ (g : Perm α), g ∈ l' → IsCycle g
hd' : List.Pairwise Disjoint l'
hl :
  Trunc.mk
      { val := l',
        property := (_ : List.prod l' = σ ∧ (∀ (g : Perm α), g ∈ l' → IsCycle g) ∧ List.Pairwise Disjoint l') } =
    truncCycleFactors σ
ht : cycleFactorsFinset σ = List.toFinset l'
h : List.toFinset l' = List.toFinset l
hn' : List.Nodup l'
hperm : l ~ l'
⊢ ∀ {a b : Perm α}, Disjoint a b → Commute a b
[PROOFSTEP]
exact Disjoint.commute
[GOAL]
case intro.mk.intro.intro.mpr
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f σ : Perm α
l : List (Perm α)
hn : List.Nodup l
l' : List (Perm α)
hp' : List.prod l' = σ
hc' : ∀ (g : Perm α), g ∈ l' → IsCycle g
hd' : List.Pairwise Disjoint l'
hl :
  Trunc.mk
      { val := l',
        property := (_ : List.prod l' = σ ∧ (∀ (g : Perm α), g ∈ l' → IsCycle g) ∧ List.Pairwise Disjoint l') } =
    truncCycleFactors σ
ht : cycleFactorsFinset σ = List.toFinset l'
⊢ (∀ (f : Perm α), f ∈ l → IsCycle f) ∧ List.Pairwise Disjoint l ∧ List.prod l = σ → List.toFinset l' = List.toFinset l
[PROOFSTEP]
rintro ⟨hc, hd, hp⟩
[GOAL]
case intro.mk.intro.intro.mpr.intro.intro
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f σ : Perm α
l : List (Perm α)
hn : List.Nodup l
l' : List (Perm α)
hp' : List.prod l' = σ
hc' : ∀ (g : Perm α), g ∈ l' → IsCycle g
hd' : List.Pairwise Disjoint l'
hl :
  Trunc.mk
      { val := l',
        property := (_ : List.prod l' = σ ∧ (∀ (g : Perm α), g ∈ l' → IsCycle g) ∧ List.Pairwise Disjoint l') } =
    truncCycleFactors σ
ht : cycleFactorsFinset σ = List.toFinset l'
hc : ∀ (f : Perm α), f ∈ l → IsCycle f
hd : List.Pairwise Disjoint l
hp : List.prod l = σ
⊢ List.toFinset l' = List.toFinset l
[PROOFSTEP]
refine' List.toFinset_eq_of_perm _ _ _
[GOAL]
case intro.mk.intro.intro.mpr.intro.intro
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f σ : Perm α
l : List (Perm α)
hn : List.Nodup l
l' : List (Perm α)
hp' : List.prod l' = σ
hc' : ∀ (g : Perm α), g ∈ l' → IsCycle g
hd' : List.Pairwise Disjoint l'
hl :
  Trunc.mk
      { val := l',
        property := (_ : List.prod l' = σ ∧ (∀ (g : Perm α), g ∈ l' → IsCycle g) ∧ List.Pairwise Disjoint l') } =
    truncCycleFactors σ
ht : cycleFactorsFinset σ = List.toFinset l'
hc : ∀ (f : Perm α), f ∈ l → IsCycle f
hd : List.Pairwise Disjoint l
hp : List.prod l = σ
⊢ l' ~ l
[PROOFSTEP]
refine' list_cycles_perm_list_cycles _ hc' hc hd' hd
[GOAL]
case intro.mk.intro.intro.mpr.intro.intro
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f σ : Perm α
l : List (Perm α)
hn : List.Nodup l
l' : List (Perm α)
hp' : List.prod l' = σ
hc' : ∀ (g : Perm α), g ∈ l' → IsCycle g
hd' : List.Pairwise Disjoint l'
hl :
  Trunc.mk
      { val := l',
        property := (_ : List.prod l' = σ ∧ (∀ (g : Perm α), g ∈ l' → IsCycle g) ∧ List.Pairwise Disjoint l') } =
    truncCycleFactors σ
ht : cycleFactorsFinset σ = List.toFinset l'
hc : ∀ (f : Perm α), f ∈ l → IsCycle f
hd : List.Pairwise Disjoint l
hp : List.prod l = σ
⊢ List.prod l' = List.prod l
[PROOFSTEP]
rw [hp, hp']
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f σ : Perm α
s : Finset (Perm α)
⊢ cycleFactorsFinset σ = s ↔
    (∀ (f : Perm α), f ∈ s → IsCycle f) ∧
      ∃ h, noncommProd s id (_ : Set.Pairwise ↑s fun a b => Commute (id a) (id b)) = σ
[PROOFSTEP]
obtain ⟨l, hl, rfl⟩ := s.exists_list_nodup_eq
[GOAL]
case intro.intro
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f σ : Perm α
l : List (Perm α)
hl : List.Nodup l
⊢ cycleFactorsFinset σ = List.toFinset l ↔
    (∀ (f : Perm α), f ∈ List.toFinset l → IsCycle f) ∧
      ∃ h, noncommProd (List.toFinset l) id (_ : Set.Pairwise ↑(List.toFinset l) fun a b => Commute (id a) (id b)) = σ
[PROOFSTEP]
simp [cycleFactorsFinset_eq_list_toFinset, hl]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ f p : Perm α
⊢ p ∈ cycleFactorsFinset f ↔ IsCycle p ∧ ∀ (a : α), a ∈ support p → ↑p a = ↑f a
[PROOFSTEP]
obtain ⟨l, hl, hl'⟩ := f.cycleFactorsFinset.exists_list_nodup_eq
[GOAL]
case intro.intro
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ f p : Perm α
l : List (Perm α)
hl : List.Nodup l
hl' : List.toFinset l = cycleFactorsFinset f
⊢ p ∈ cycleFactorsFinset f ↔ IsCycle p ∧ ∀ (a : α), a ∈ support p → ↑p a = ↑f a
[PROOFSTEP]
rw [← hl']
[GOAL]
case intro.intro
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ f p : Perm α
l : List (Perm α)
hl : List.Nodup l
hl' : List.toFinset l = cycleFactorsFinset f
⊢ p ∈ List.toFinset l ↔ IsCycle p ∧ ∀ (a : α), a ∈ support p → ↑p a = ↑f a
[PROOFSTEP]
rw [eq_comm, cycleFactorsFinset_eq_list_toFinset hl] at hl' 
[GOAL]
case intro.intro
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ f p : Perm α
l : List (Perm α)
hl : List.Nodup l
hl' : (∀ (f : Perm α), f ∈ l → IsCycle f) ∧ List.Pairwise Disjoint l ∧ List.prod l = f
⊢ p ∈ List.toFinset l ↔ IsCycle p ∧ ∀ (a : α), a ∈ support p → ↑p a = ↑f a
[PROOFSTEP]
simpa [List.mem_toFinset, Ne.def, ← hl'.right.right] using mem_list_cycles_iff hl'.left hl'.right.left
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ f : Perm α
x : α
⊢ cycleOf f x ∈ cycleFactorsFinset f ↔ x ∈ support f
[PROOFSTEP]
rw [mem_cycleFactorsFinset_iff]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ f : Perm α
x : α
⊢ (IsCycle (cycleOf f x) ∧ ∀ (a : α), a ∈ support (cycleOf f x) → ↑(cycleOf f x) a = ↑f a) ↔ x ∈ support f
[PROOFSTEP]
constructor
[GOAL]
case mp
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ f : Perm α
x : α
⊢ (IsCycle (cycleOf f x) ∧ ∀ (a : α), a ∈ support (cycleOf f x) → ↑(cycleOf f x) a = ↑f a) → x ∈ support f
[PROOFSTEP]
rintro ⟨hc, _⟩
[GOAL]
case mp.intro
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ f : Perm α
x : α
hc : IsCycle (cycleOf f x)
right✝ : ∀ (a : α), a ∈ support (cycleOf f x) → ↑(cycleOf f x) a = ↑f a
⊢ x ∈ support f
[PROOFSTEP]
contrapose! hc
[GOAL]
case mp.intro
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ f : Perm α
x : α
right✝ : ∀ (a : α), a ∈ support (cycleOf f x) → ↑(cycleOf f x) a = ↑f a
hc : ¬x ∈ support f
⊢ ¬IsCycle (cycleOf f x)
[PROOFSTEP]
rw [not_mem_support, ← cycleOf_eq_one_iff] at hc 
[GOAL]
case mp.intro
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ f : Perm α
x : α
right✝ : ∀ (a : α), a ∈ support (cycleOf f x) → ↑(cycleOf f x) a = ↑f a
hc✝ : ↑f x = x
hc : cycleOf f x = 1
⊢ ¬IsCycle (cycleOf f x)
[PROOFSTEP]
simp [hc]
[GOAL]
case mpr
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ f : Perm α
x : α
⊢ x ∈ support f → IsCycle (cycleOf f x) ∧ ∀ (a : α), a ∈ support (cycleOf f x) → ↑(cycleOf f x) a = ↑f a
[PROOFSTEP]
intro hx
[GOAL]
case mpr
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ f : Perm α
x : α
hx : x ∈ support f
⊢ IsCycle (cycleOf f x) ∧ ∀ (a : α), a ∈ support (cycleOf f x) → ↑(cycleOf f x) a = ↑f a
[PROOFSTEP]
refine' ⟨isCycle_cycleOf _ (mem_support.mp hx), _⟩
[GOAL]
case mpr
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ f : Perm α
x : α
hx : x ∈ support f
⊢ ∀ (a : α), a ∈ support (cycleOf f x) → ↑(cycleOf f x) a = ↑f a
[PROOFSTEP]
intro y hy
[GOAL]
case mpr
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ f : Perm α
x : α
hx : x ∈ support f
y : α
hy : y ∈ support (cycleOf f x)
⊢ ↑(cycleOf f x) y = ↑f y
[PROOFSTEP]
rw [mem_support] at hy 
[GOAL]
case mpr
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ f : Perm α
x : α
hx : x ∈ support f
y : α
hy : ↑(cycleOf f x) y ≠ y
⊢ ↑(cycleOf f x) y = ↑f y
[PROOFSTEP]
rw [cycleOf_apply]
[GOAL]
case mpr
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ f : Perm α
x : α
hx : x ∈ support f
y : α
hy : ↑(cycleOf f x) y ≠ y
⊢ (if SameCycle f x y then ↑f y else y) = ↑f y
[PROOFSTEP]
split_ifs with H
[GOAL]
case pos
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ f : Perm α
x : α
hx : x ∈ support f
y : α
hy : ↑(cycleOf f x) y ≠ y
H : SameCycle f x y
⊢ ↑f y = ↑f y
[PROOFSTEP]
rfl
[GOAL]
case neg
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ f : Perm α
x : α
hx : x ∈ support f
y : α
hy : ↑(cycleOf f x) y ≠ y
H : ¬SameCycle f x y
⊢ y = ↑f y
[PROOFSTEP]
rw [cycleOf_apply_of_not_sameCycle H] at hy 
[GOAL]
case neg
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ f : Perm α
x : α
hx : x ∈ support f
y : α
hy : y ≠ y
H : ¬SameCycle f x y
⊢ y = ↑f y
[PROOFSTEP]
contradiction
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ p f : Perm α
h : p ∈ cycleFactorsFinset f
⊢ support p ≤ support f
[PROOFSTEP]
rw [mem_cycleFactorsFinset_iff] at h 
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ p f : Perm α
h : IsCycle p ∧ ∀ (a : α), a ∈ support p → ↑p a = ↑f a
⊢ support p ≤ support f
[PROOFSTEP]
intro x hx
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ p f : Perm α
h : IsCycle p ∧ ∀ (a : α), a ∈ support p → ↑p a = ↑f a
x : α
hx : x ∈ support p
⊢ x ∈ support f
[PROOFSTEP]
rwa [mem_support, ← h.right x hx, ← mem_support]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ f : Perm α
⊢ cycleFactorsFinset f = ∅ ↔ f = 1
[PROOFSTEP]
simpa [cycleFactorsFinset_eq_finset] using eq_comm
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f : Perm α
⊢ cycleFactorsFinset 1 = ∅
[PROOFSTEP]
simp [cycleFactorsFinset_eq_empty_iff]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ f : Perm α
⊢ cycleFactorsFinset f = {f} ↔ IsCycle f
[PROOFSTEP]
simp [cycleFactorsFinset_eq_finset]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ f g : Perm α
⊢ cycleFactorsFinset f = {g} ↔ IsCycle f ∧ f = g
[PROOFSTEP]
suffices f = g → (g.IsCycle ↔ f.IsCycle) by
  rw [cycleFactorsFinset_eq_finset]
  simpa [eq_comm]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ f g : Perm α
this : f = g → (IsCycle g ↔ IsCycle f)
⊢ cycleFactorsFinset f = {g} ↔ IsCycle f ∧ f = g
[PROOFSTEP]
rw [cycleFactorsFinset_eq_finset]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ f g : Perm α
this : f = g → (IsCycle g ↔ IsCycle f)
⊢ ((∀ (f : Perm α), f ∈ {g} → IsCycle f) ∧
      ∃ h, noncommProd {g} id (_ : Set.Pairwise ↑{g} fun a b => Commute (id a) (id b)) = f) ↔
    IsCycle f ∧ f = g
[PROOFSTEP]
simpa [eq_comm]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ f g : Perm α
⊢ f = g → (IsCycle g ↔ IsCycle f)
[PROOFSTEP]
rintro rfl
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ f : Perm α
⊢ IsCycle f ↔ IsCycle f
[PROOFSTEP]
exact Iff.rfl
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f : Perm α
⊢ Injective cycleFactorsFinset
[PROOFSTEP]
intro f g h
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ f g : Perm α
h : cycleFactorsFinset f = cycleFactorsFinset g
⊢ f = g
[PROOFSTEP]
rw [← cycleFactorsFinset_noncommProd f]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ f g : Perm α
h : cycleFactorsFinset f = cycleFactorsFinset g
⊢ noncommProd (cycleFactorsFinset f) id (_ : Set.Pairwise (↑(cycleFactorsFinset f)) Commute) = g
[PROOFSTEP]
simpa [h] using cycleFactorsFinset_noncommProd g
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ f g : Perm α
h : Disjoint f g
⊢ _root_.Disjoint (cycleFactorsFinset f) (cycleFactorsFinset g)
[PROOFSTEP]
rw [disjoint_iff_disjoint_support] at h 
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ f g : Perm α
h✝ : Disjoint f g
h : _root_.Disjoint (support f) (support g)
⊢ _root_.Disjoint (cycleFactorsFinset f) (cycleFactorsFinset g)
[PROOFSTEP]
rw [Finset.disjoint_left]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ f g : Perm α
h✝ : Disjoint f g
h : _root_.Disjoint (support f) (support g)
⊢ ∀ ⦃a : Perm α⦄, a ∈ cycleFactorsFinset f → ¬a ∈ cycleFactorsFinset g
[PROOFSTEP]
intro x hx hy
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ f g : Perm α
h✝ : Disjoint f g
h : _root_.Disjoint (support f) (support g)
x : Perm α
hx : x ∈ cycleFactorsFinset f
hy : x ∈ cycleFactorsFinset g
⊢ False
[PROOFSTEP]
simp only [mem_cycleFactorsFinset_iff, mem_support] at hx hy 
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ f g : Perm α
h✝ : Disjoint f g
h : _root_.Disjoint (support f) (support g)
x : Perm α
hx : IsCycle x ∧ ∀ (a : α), ↑x a ≠ a → ↑x a = ↑f a
hy : IsCycle x ∧ ∀ (a : α), ↑x a ≠ a → ↑x a = ↑g a
⊢ False
[PROOFSTEP]
obtain ⟨⟨⟨a, ha, -⟩, hf⟩, -, hg⟩ := hx, hy
[GOAL]
case intro.intro.intro.intro
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ f g : Perm α
h✝ : Disjoint f g
h : _root_.Disjoint (support f) (support g)
x : Perm α
hf : ∀ (a : α), ↑x a ≠ a → ↑x a = ↑f a
a : α
ha : ↑x a ≠ a
hg : ∀ (a : α), ↑x a ≠ a → ↑x a = ↑g a
⊢ False
[PROOFSTEP]
have := h.le_bot (by simp [ha, ← hf a ha, ← hg a ha] : a ∈ f.support ∩ g.support)
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ f g : Perm α
h✝ : Disjoint f g
h : _root_.Disjoint (support f) (support g)
x : Perm α
hf : ∀ (a : α), ↑x a ≠ a → ↑x a = ↑f a
a : α
ha : ↑x a ≠ a
hg : ∀ (a : α), ↑x a ≠ a → ↑x a = ↑g a
⊢ a ∈ support f ∩ support g
[PROOFSTEP]
simp [ha, ← hf a ha, ← hg a ha]
[GOAL]
case intro.intro.intro.intro
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ f g : Perm α
h✝ : Disjoint f g
h : _root_.Disjoint (support f) (support g)
x : Perm α
hf : ∀ (a : α), ↑x a ≠ a → ↑x a = ↑f a
a : α
ha : ↑x a ≠ a
hg : ∀ (a : α), ↑x a ≠ a → ↑x a = ↑g a
this : a ∈ ⊥
⊢ False
[PROOFSTEP]
tauto
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ f g : Perm α
h : Disjoint f g
⊢ cycleFactorsFinset (f * g) = cycleFactorsFinset f ∪ cycleFactorsFinset g
[PROOFSTEP]
rw [cycleFactorsFinset_eq_finset]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ f g : Perm α
h : Disjoint f g
⊢ (∀ (f_1 : Perm α), f_1 ∈ cycleFactorsFinset f ∪ cycleFactorsFinset g → IsCycle f_1) ∧
    ∃ h,
      noncommProd (cycleFactorsFinset f ∪ cycleFactorsFinset g) id
          (_ : Set.Pairwise ↑(cycleFactorsFinset f ∪ cycleFactorsFinset g) fun a b => Commute (id a) (id b)) =
        f * g
[PROOFSTEP]
refine' ⟨_, _, _⟩
[GOAL]
case refine'_1
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ f g : Perm α
h : Disjoint f g
⊢ ∀ (f_1 : Perm α), f_1 ∈ cycleFactorsFinset f ∪ cycleFactorsFinset g → IsCycle f_1
[PROOFSTEP]
simp [or_imp, mem_cycleFactorsFinset_iff, forall_swap]
[GOAL]
case refine'_2
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ f g : Perm α
h : Disjoint f g
⊢ Set.Pairwise (↑(cycleFactorsFinset f ∪ cycleFactorsFinset g)) Disjoint
[PROOFSTEP]
rw [coe_union, Set.pairwise_union_of_symmetric Disjoint.symmetric]
[GOAL]
case refine'_2
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ f g : Perm α
h : Disjoint f g
⊢ Set.Pairwise (↑(cycleFactorsFinset f)) Disjoint ∧
    Set.Pairwise (↑(cycleFactorsFinset g)) Disjoint ∧
      ∀ (a : Perm α), a ∈ ↑(cycleFactorsFinset f) → ∀ (b : Perm α), b ∈ ↑(cycleFactorsFinset g) → a ≠ b → Disjoint a b
[PROOFSTEP]
exact
  ⟨cycleFactorsFinset_pairwise_disjoint _, cycleFactorsFinset_pairwise_disjoint _, fun x hx y hy _ =>
    h.mono (mem_cycleFactorsFinset_support_le hx) (mem_cycleFactorsFinset_support_le hy)⟩
[GOAL]
case refine'_3
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ f g : Perm α
h : Disjoint f g
⊢ noncommProd (cycleFactorsFinset f ∪ cycleFactorsFinset g) id
      (_ : Set.Pairwise ↑(cycleFactorsFinset f ∪ cycleFactorsFinset g) fun a b => Commute (id a) (id b)) =
    f * g
[PROOFSTEP]
rw [noncommProd_union_of_disjoint h.disjoint_cycleFactorsFinset]
[GOAL]
case refine'_3
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ f g : Perm α
h : Disjoint f g
⊢ noncommProd (cycleFactorsFinset f) id (_ : Set.Pairwise ↑(cycleFactorsFinset f) fun a b => Commute (id a) (id b)) *
      noncommProd (cycleFactorsFinset g) id
        (_ : Set.Pairwise ↑(cycleFactorsFinset g) fun a b => Commute (id a) (id b)) =
    f * g
[PROOFSTEP]
rw [cycleFactorsFinset_noncommProd, cycleFactorsFinset_noncommProd]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ f g : Perm α
h : f ∈ cycleFactorsFinset g
⊢ Disjoint (g * f⁻¹) f
[PROOFSTEP]
rw [mem_cycleFactorsFinset_iff] at h 
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ f g : Perm α
h : IsCycle f ∧ ∀ (a : α), a ∈ support f → ↑f a = ↑g a
⊢ Disjoint (g * f⁻¹) f
[PROOFSTEP]
intro x
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ f g : Perm α
h : IsCycle f ∧ ∀ (a : α), a ∈ support f → ↑f a = ↑g a
x : α
⊢ ↑(g * f⁻¹) x = x ∨ ↑f x = x
[PROOFSTEP]
by_cases hx : f x = x
[GOAL]
case pos
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ f g : Perm α
h : IsCycle f ∧ ∀ (a : α), a ∈ support f → ↑f a = ↑g a
x : α
hx : ↑f x = x
⊢ ↑(g * f⁻¹) x = x ∨ ↑f x = x
[PROOFSTEP]
exact Or.inr hx
[GOAL]
case neg
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ f g : Perm α
h : IsCycle f ∧ ∀ (a : α), a ∈ support f → ↑f a = ↑g a
x : α
hx : ¬↑f x = x
⊢ ↑(g * f⁻¹) x = x ∨ ↑f x = x
[PROOFSTEP]
refine' Or.inl _
[GOAL]
case neg
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ f g : Perm α
h : IsCycle f ∧ ∀ (a : α), a ∈ support f → ↑f a = ↑g a
x : α
hx : ¬↑f x = x
⊢ ↑(g * f⁻¹) x = x
[PROOFSTEP]
rw [mul_apply, ← h.right, apply_inv_self]
[GOAL]
case neg.a
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ f g : Perm α
h : IsCycle f ∧ ∀ (a : α), a ∈ support f → ↑f a = ↑g a
x : α
hx : ¬↑f x = x
⊢ ↑f⁻¹ x ∈ support f
[PROOFSTEP]
rwa [← support_inv, apply_mem_support, support_inv, mem_support]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ f c : Perm α
a : α
ha : a ∈ support c
hc : c ∈ cycleFactorsFinset f
⊢ c = cycleOf f a
[PROOFSTEP]
suffices f.cycleOf a = c.cycleOf a by
  rw [this]
  apply symm
  exact Equiv.Perm.IsCycle.cycleOf_eq (Equiv.Perm.mem_cycleFactorsFinset_iff.mp hc).left (Equiv.Perm.mem_support.mp ha)
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ f c : Perm α
a : α
ha : a ∈ support c
hc : c ∈ cycleFactorsFinset f
this : cycleOf f a = cycleOf c a
⊢ c = cycleOf f a
[PROOFSTEP]
rw [this]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ f c : Perm α
a : α
ha : a ∈ support c
hc : c ∈ cycleFactorsFinset f
this : cycleOf f a = cycleOf c a
⊢ c = cycleOf c a
[PROOFSTEP]
apply symm
[GOAL]
case a
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ f c : Perm α
a : α
ha : a ∈ support c
hc : c ∈ cycleFactorsFinset f
this : cycleOf f a = cycleOf c a
⊢ cycleOf c a = c
[PROOFSTEP]
exact Equiv.Perm.IsCycle.cycleOf_eq (Equiv.Perm.mem_cycleFactorsFinset_iff.mp hc).left (Equiv.Perm.mem_support.mp ha)
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ f c : Perm α
a : α
ha : a ∈ support c
hc : c ∈ cycleFactorsFinset f
⊢ cycleOf f a = cycleOf c a
[PROOFSTEP]
let hfc := (Equiv.Perm.disjoint_mul_inv_of_mem_cycleFactorsFinset hc).symm
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ f c : Perm α
a : α
ha : a ∈ support c
hc : c ∈ cycleFactorsFinset f
hfc : Disjoint c (f * c⁻¹) := Disjoint.symm (disjoint_mul_inv_of_mem_cycleFactorsFinset hc)
⊢ cycleOf f a = cycleOf c a
[PROOFSTEP]
let hfc2 := Perm.Disjoint.commute hfc
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ f c : Perm α
a : α
ha : a ∈ support c
hc : c ∈ cycleFactorsFinset f
hfc : Disjoint c (f * c⁻¹) := Disjoint.symm (disjoint_mul_inv_of_mem_cycleFactorsFinset hc)
hfc2 : Commute c (f * c⁻¹) := Disjoint.commute hfc
⊢ cycleOf f a = cycleOf c a
[PROOFSTEP]
rw [← Equiv.Perm.cycleOf_mul_of_apply_right_eq_self hfc2]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ f c : Perm α
a : α
ha : a ∈ support c
hc : c ∈ cycleFactorsFinset f
hfc : Disjoint c (f * c⁻¹) := Disjoint.symm (disjoint_mul_inv_of_mem_cycleFactorsFinset hc)
hfc2 : Commute c (f * c⁻¹) := Disjoint.commute hfc
⊢ cycleOf f a = cycleOf (c * (f * c⁻¹)) a
case hx
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ f c : Perm α
a : α
ha : a ∈ support c
hc : c ∈ cycleFactorsFinset f
hfc : Disjoint c (f * c⁻¹) := Disjoint.symm (disjoint_mul_inv_of_mem_cycleFactorsFinset hc)
hfc2 : Commute c (f * c⁻¹) := Disjoint.commute hfc
⊢ ↑(f * c⁻¹) a = a
[PROOFSTEP]
simp only [hfc2.eq, inv_mul_cancel_right]
  -- a est dans le support de c, donc pas dans celui de g c⁻¹
[GOAL]
case hx
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f✝ f c : Perm α
a : α
ha : a ∈ support c
hc : c ∈ cycleFactorsFinset f
hfc : Disjoint c (f * c⁻¹) := Disjoint.symm (disjoint_mul_inv_of_mem_cycleFactorsFinset hc)
hfc2 : Commute c (f * c⁻¹) := Disjoint.commute hfc
⊢ ↑(f * c⁻¹) a = a
[PROOFSTEP]
exact Equiv.Perm.not_mem_support.mp (Finset.disjoint_left.mp (Equiv.Perm.Disjoint.disjoint_support hfc) ha)
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Finite β
P : Perm β → Prop
σ : Perm β
base_one : P 1
base_cycles : ∀ (σ : Perm β), IsCycle σ → P σ
induction_disjoint : ∀ (σ τ : Perm β), Disjoint σ τ → IsCycle σ → P σ → P τ → P (σ * τ)
⊢ P σ
[PROOFSTEP]
cases nonempty_fintype β
[GOAL]
case intro
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Finite β
P : Perm β → Prop
σ : Perm β
base_one : P 1
base_cycles : ∀ (σ : Perm β), IsCycle σ → P σ
induction_disjoint : ∀ (σ τ : Perm β), Disjoint σ τ → IsCycle σ → P σ → P τ → P (σ * τ)
val✝ : Fintype β
⊢ P σ
[PROOFSTEP]
suffices ∀ l : List (Perm β), (∀ τ : Perm β, τ ∈ l → τ.IsCycle) → l.Pairwise Disjoint → P l.prod by
  classical
  let x := σ.truncCycleFactors.out
  exact (congr_arg P x.2.1).mp (this x.1 x.2.2.1 x.2.2.2)
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Finite β
P : Perm β → Prop
σ : Perm β
base_one : P 1
base_cycles : ∀ (σ : Perm β), IsCycle σ → P σ
induction_disjoint : ∀ (σ τ : Perm β), Disjoint σ τ → IsCycle σ → P σ → P τ → P (σ * τ)
val✝ : Fintype β
this : ∀ (l : List (Perm β)), (∀ (τ : Perm β), τ ∈ l → IsCycle τ) → List.Pairwise Disjoint l → P (List.prod l)
⊢ P σ
[PROOFSTEP]
classical
let x := σ.truncCycleFactors.out
exact (congr_arg P x.2.1).mp (this x.1 x.2.2.1 x.2.2.2)
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Finite β
P : Perm β → Prop
σ : Perm β
base_one : P 1
base_cycles : ∀ (σ : Perm β), IsCycle σ → P σ
induction_disjoint : ∀ (σ τ : Perm β), Disjoint σ τ → IsCycle σ → P σ → P τ → P (σ * τ)
val✝ : Fintype β
this : ∀ (l : List (Perm β)), (∀ (τ : Perm β), τ ∈ l → IsCycle τ) → List.Pairwise Disjoint l → P (List.prod l)
⊢ P σ
[PROOFSTEP]
let x := σ.truncCycleFactors.out
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Finite β
P : Perm β → Prop
σ : Perm β
base_one : P 1
base_cycles : ∀ (σ : Perm β), IsCycle σ → P σ
induction_disjoint : ∀ (σ τ : Perm β), Disjoint σ τ → IsCycle σ → P σ → P τ → P (σ * τ)
val✝ : Fintype β
this : ∀ (l : List (Perm β)), (∀ (τ : Perm β), τ ∈ l → IsCycle τ) → List.Pairwise Disjoint l → P (List.prod l)
x : { l // List.prod l = σ ∧ (∀ (g : Perm β), g ∈ l → IsCycle g) ∧ List.Pairwise Disjoint l } :=
  Trunc.out (truncCycleFactors σ)
⊢ P σ
[PROOFSTEP]
exact (congr_arg P x.2.1).mp (this x.1 x.2.2.1 x.2.2.2)
[GOAL]
case intro
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Finite β
P : Perm β → Prop
σ : Perm β
base_one : P 1
base_cycles : ∀ (σ : Perm β), IsCycle σ → P σ
induction_disjoint : ∀ (σ τ : Perm β), Disjoint σ τ → IsCycle σ → P σ → P τ → P (σ * τ)
val✝ : Fintype β
⊢ ∀ (l : List (Perm β)), (∀ (τ : Perm β), τ ∈ l → IsCycle τ) → List.Pairwise Disjoint l → P (List.prod l)
[PROOFSTEP]
intro l
[GOAL]
case intro
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Finite β
P : Perm β → Prop
σ : Perm β
base_one : P 1
base_cycles : ∀ (σ : Perm β), IsCycle σ → P σ
induction_disjoint : ∀ (σ τ : Perm β), Disjoint σ τ → IsCycle σ → P σ → P τ → P (σ * τ)
val✝ : Fintype β
l : List (Perm β)
⊢ (∀ (τ : Perm β), τ ∈ l → IsCycle τ) → List.Pairwise Disjoint l → P (List.prod l)
[PROOFSTEP]
induction' l with σ l ih
[GOAL]
case intro.nil
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Finite β
P : Perm β → Prop
σ : Perm β
base_one : P 1
base_cycles : ∀ (σ : Perm β), IsCycle σ → P σ
induction_disjoint : ∀ (σ τ : Perm β), Disjoint σ τ → IsCycle σ → P σ → P τ → P (σ * τ)
val✝ : Fintype β
⊢ (∀ (τ : Perm β), τ ∈ [] → IsCycle τ) → List.Pairwise Disjoint [] → P (List.prod [])
[PROOFSTEP]
exact fun _ _ => base_one
[GOAL]
case intro.cons
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Finite β
P : Perm β → Prop
σ✝ : Perm β
base_one : P 1
base_cycles : ∀ (σ : Perm β), IsCycle σ → P σ
induction_disjoint : ∀ (σ τ : Perm β), Disjoint σ τ → IsCycle σ → P σ → P τ → P (σ * τ)
val✝ : Fintype β
σ : Perm β
l : List (Perm β)
ih : (∀ (τ : Perm β), τ ∈ l → IsCycle τ) → List.Pairwise Disjoint l → P (List.prod l)
⊢ (∀ (τ : Perm β), τ ∈ σ :: l → IsCycle τ) → List.Pairwise Disjoint (σ :: l) → P (List.prod (σ :: l))
[PROOFSTEP]
intro h1 h2
[GOAL]
case intro.cons
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Finite β
P : Perm β → Prop
σ✝ : Perm β
base_one : P 1
base_cycles : ∀ (σ : Perm β), IsCycle σ → P σ
induction_disjoint : ∀ (σ τ : Perm β), Disjoint σ τ → IsCycle σ → P σ → P τ → P (σ * τ)
val✝ : Fintype β
σ : Perm β
l : List (Perm β)
ih : (∀ (τ : Perm β), τ ∈ l → IsCycle τ) → List.Pairwise Disjoint l → P (List.prod l)
h1 : ∀ (τ : Perm β), τ ∈ σ :: l → IsCycle τ
h2 : List.Pairwise Disjoint (σ :: l)
⊢ P (List.prod (σ :: l))
[PROOFSTEP]
rw [List.prod_cons]
[GOAL]
case intro.cons
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Finite β
P : Perm β → Prop
σ✝ : Perm β
base_one : P 1
base_cycles : ∀ (σ : Perm β), IsCycle σ → P σ
induction_disjoint : ∀ (σ τ : Perm β), Disjoint σ τ → IsCycle σ → P σ → P τ → P (σ * τ)
val✝ : Fintype β
σ : Perm β
l : List (Perm β)
ih : (∀ (τ : Perm β), τ ∈ l → IsCycle τ) → List.Pairwise Disjoint l → P (List.prod l)
h1 : ∀ (τ : Perm β), τ ∈ σ :: l → IsCycle τ
h2 : List.Pairwise Disjoint (σ :: l)
⊢ P (σ * List.prod l)
[PROOFSTEP]
exact
  induction_disjoint σ l.prod (disjoint_prod_right _ (List.pairwise_cons.mp h2).1) (h1 _ (List.mem_cons_self _ _))
    (base_cycles σ (h1 σ (l.mem_cons_self σ))) (ih (fun τ hτ => h1 τ (List.mem_cons_of_mem σ hτ)) h2.of_cons)
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f g : Perm α
h : f ∈ cycleFactorsFinset g
⊢ cycleFactorsFinset (g * f⁻¹) = cycleFactorsFinset g \ {f}
[PROOFSTEP]
revert f
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
g : Perm α
⊢ ∀ {f : Perm α}, f ∈ cycleFactorsFinset g → cycleFactorsFinset (g * f⁻¹) = cycleFactorsFinset g \ {f}
[PROOFSTEP]
refine'
  cycle_induction_on (P := fun {g : Perm α} ↦
    ∀ {f}, (f ∈ cycleFactorsFinset g) → cycleFactorsFinset (g * f⁻¹) = cycleFactorsFinset g \ { f }) _ _ _ _
[GOAL]
case refine'_1
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
g f✝ : Perm α
⊢ fun {g} => ∀ {f : Perm α}, f ∈ cycleFactorsFinset g → cycleFactorsFinset (g * f⁻¹) = cycleFactorsFinset g \ {f}
[PROOFSTEP]
simp
[GOAL]
case refine'_2
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
g f✝ : Perm α
⊢ ∀ (σ : Perm α),
    IsCycle σ → fun {g} =>
      ∀ {f : Perm α}, f ∈ cycleFactorsFinset g → cycleFactorsFinset (g * f⁻¹) = cycleFactorsFinset g \ {f}
[PROOFSTEP]
intro σ hσ f hf
[GOAL]
case refine'_2
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
g f✝ σ : Perm α
hσ : IsCycle σ
f : Perm α
hf : f ∈ cycleFactorsFinset σ
⊢ cycleFactorsFinset (σ * f⁻¹) = cycleFactorsFinset σ \ {f}
[PROOFSTEP]
simp only [cycleFactorsFinset_eq_singleton_self_iff.mpr hσ, mem_singleton] at hf ⊢
[GOAL]
case refine'_2
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
g f✝ σ : Perm α
hσ : IsCycle σ
f : Perm α
hf : f = σ
⊢ cycleFactorsFinset (σ * f⁻¹) = {σ} \ {f}
[PROOFSTEP]
simp [hf]
[GOAL]
case refine'_3
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
g f✝ : Perm α
⊢ ∀ (σ τ : Perm α),
    Disjoint σ τ →
      IsCycle σ →
        (fun {g} =>
            ∀ {f : Perm α}, f ∈ cycleFactorsFinset g → cycleFactorsFinset (g * f⁻¹) = cycleFactorsFinset g \ {f}) →
          (fun {g} =>
              ∀ {f : Perm α}, f ∈ cycleFactorsFinset g → cycleFactorsFinset (g * f⁻¹) = cycleFactorsFinset g \ {f}) →
            fun {g} =>
            ∀ {f : Perm α}, f ∈ cycleFactorsFinset g → cycleFactorsFinset (g * f⁻¹) = cycleFactorsFinset g \ {f}
[PROOFSTEP]
intro σ τ hd _ hσ hτ f
[GOAL]
case refine'_3
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
g f✝ σ τ : Perm α
hd : Disjoint σ τ
a✝ : IsCycle σ
hσ : ∀ {f : Perm α}, f ∈ cycleFactorsFinset σ → cycleFactorsFinset (σ * f⁻¹) = cycleFactorsFinset σ \ {f}
hτ : ∀ {f : Perm α}, f ∈ cycleFactorsFinset τ → cycleFactorsFinset (τ * f⁻¹) = cycleFactorsFinset τ \ {f}
f : Perm α
⊢ f ∈ cycleFactorsFinset (σ * τ) → cycleFactorsFinset (σ * τ * f⁻¹) = cycleFactorsFinset (σ * τ) \ {f}
[PROOFSTEP]
simp_rw [hd.cycleFactorsFinset_mul_eq_union, mem_union]
  -- if only `wlog` could work here...
[GOAL]
case refine'_3
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
g f✝ σ τ : Perm α
hd : Disjoint σ τ
a✝ : IsCycle σ
hσ : ∀ {f : Perm α}, f ∈ cycleFactorsFinset σ → cycleFactorsFinset (σ * f⁻¹) = cycleFactorsFinset σ \ {f}
hτ : ∀ {f : Perm α}, f ∈ cycleFactorsFinset τ → cycleFactorsFinset (τ * f⁻¹) = cycleFactorsFinset τ \ {f}
f : Perm α
⊢ f ∈ cycleFactorsFinset σ ∨ f ∈ cycleFactorsFinset τ →
    cycleFactorsFinset (σ * τ * f⁻¹) = (cycleFactorsFinset σ ∪ cycleFactorsFinset τ) \ {f}
[PROOFSTEP]
rintro (hf | hf)
[GOAL]
case refine'_3.inl
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
g f✝ σ τ : Perm α
hd : Disjoint σ τ
a✝ : IsCycle σ
hσ : ∀ {f : Perm α}, f ∈ cycleFactorsFinset σ → cycleFactorsFinset (σ * f⁻¹) = cycleFactorsFinset σ \ {f}
hτ : ∀ {f : Perm α}, f ∈ cycleFactorsFinset τ → cycleFactorsFinset (τ * f⁻¹) = cycleFactorsFinset τ \ {f}
f : Perm α
hf : f ∈ cycleFactorsFinset σ
⊢ cycleFactorsFinset (σ * τ * f⁻¹) = (cycleFactorsFinset σ ∪ cycleFactorsFinset τ) \ {f}
[PROOFSTEP]
rw [hd.commute.eq, union_comm, union_sdiff_distrib, sdiff_singleton_eq_erase, erase_eq_of_not_mem, mul_assoc,
  Disjoint.cycleFactorsFinset_mul_eq_union, hσ hf]
[GOAL]
case refine'_3.inl
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
g f✝ σ τ : Perm α
hd : Disjoint σ τ
a✝ : IsCycle σ
hσ : ∀ {f : Perm α}, f ∈ cycleFactorsFinset σ → cycleFactorsFinset (σ * f⁻¹) = cycleFactorsFinset σ \ {f}
hτ : ∀ {f : Perm α}, f ∈ cycleFactorsFinset τ → cycleFactorsFinset (τ * f⁻¹) = cycleFactorsFinset τ \ {f}
f : Perm α
hf : f ∈ cycleFactorsFinset σ
⊢ Disjoint τ (σ * f⁻¹)
[PROOFSTEP]
rw [mem_cycleFactorsFinset_iff] at hf 
[GOAL]
case refine'_3.inl
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
g f✝ σ τ : Perm α
hd : Disjoint σ τ
a✝ : IsCycle σ
hσ : ∀ {f : Perm α}, f ∈ cycleFactorsFinset σ → cycleFactorsFinset (σ * f⁻¹) = cycleFactorsFinset σ \ {f}
hτ : ∀ {f : Perm α}, f ∈ cycleFactorsFinset τ → cycleFactorsFinset (τ * f⁻¹) = cycleFactorsFinset τ \ {f}
f : Perm α
hf : IsCycle f ∧ ∀ (a : α), a ∈ support f → ↑f a = ↑σ a
⊢ Disjoint τ (σ * f⁻¹)
[PROOFSTEP]
intro x
[GOAL]
case refine'_3.inl
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
g f✝ σ τ : Perm α
hd : Disjoint σ τ
a✝ : IsCycle σ
hσ : ∀ {f : Perm α}, f ∈ cycleFactorsFinset σ → cycleFactorsFinset (σ * f⁻¹) = cycleFactorsFinset σ \ {f}
hτ : ∀ {f : Perm α}, f ∈ cycleFactorsFinset τ → cycleFactorsFinset (τ * f⁻¹) = cycleFactorsFinset τ \ {f}
f : Perm α
hf : IsCycle f ∧ ∀ (a : α), a ∈ support f → ↑f a = ↑σ a
x : α
⊢ ↑τ x = x ∨ ↑(σ * f⁻¹) x = x
[PROOFSTEP]
cases' hd.symm x with hx hx
[GOAL]
case refine'_3.inl.inl
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
g f✝ σ τ : Perm α
hd : Disjoint σ τ
a✝ : IsCycle σ
hσ : ∀ {f : Perm α}, f ∈ cycleFactorsFinset σ → cycleFactorsFinset (σ * f⁻¹) = cycleFactorsFinset σ \ {f}
hτ : ∀ {f : Perm α}, f ∈ cycleFactorsFinset τ → cycleFactorsFinset (τ * f⁻¹) = cycleFactorsFinset τ \ {f}
f : Perm α
hf : IsCycle f ∧ ∀ (a : α), a ∈ support f → ↑f a = ↑σ a
x : α
hx : ↑τ x = x
⊢ ↑τ x = x ∨ ↑(σ * f⁻¹) x = x
[PROOFSTEP]
exact Or.inl hx
[GOAL]
case refine'_3.inl.inr
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
g f✝ σ τ : Perm α
hd : Disjoint σ τ
a✝ : IsCycle σ
hσ : ∀ {f : Perm α}, f ∈ cycleFactorsFinset σ → cycleFactorsFinset (σ * f⁻¹) = cycleFactorsFinset σ \ {f}
hτ : ∀ {f : Perm α}, f ∈ cycleFactorsFinset τ → cycleFactorsFinset (τ * f⁻¹) = cycleFactorsFinset τ \ {f}
f : Perm α
hf : IsCycle f ∧ ∀ (a : α), a ∈ support f → ↑f a = ↑σ a
x : α
hx : ↑σ x = x
⊢ ↑τ x = x ∨ ↑(σ * f⁻¹) x = x
[PROOFSTEP]
refine' Or.inr _
[GOAL]
case refine'_3.inl.inr
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
g f✝ σ τ : Perm α
hd : Disjoint σ τ
a✝ : IsCycle σ
hσ : ∀ {f : Perm α}, f ∈ cycleFactorsFinset σ → cycleFactorsFinset (σ * f⁻¹) = cycleFactorsFinset σ \ {f}
hτ : ∀ {f : Perm α}, f ∈ cycleFactorsFinset τ → cycleFactorsFinset (τ * f⁻¹) = cycleFactorsFinset τ \ {f}
f : Perm α
hf : IsCycle f ∧ ∀ (a : α), a ∈ support f → ↑f a = ↑σ a
x : α
hx : ↑σ x = x
⊢ ↑(σ * f⁻¹) x = x
[PROOFSTEP]
by_cases hfx : f x = x
[GOAL]
case pos
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
g f✝ σ τ : Perm α
hd : Disjoint σ τ
a✝ : IsCycle σ
hσ : ∀ {f : Perm α}, f ∈ cycleFactorsFinset σ → cycleFactorsFinset (σ * f⁻¹) = cycleFactorsFinset σ \ {f}
hτ : ∀ {f : Perm α}, f ∈ cycleFactorsFinset τ → cycleFactorsFinset (τ * f⁻¹) = cycleFactorsFinset τ \ {f}
f : Perm α
hf : IsCycle f ∧ ∀ (a : α), a ∈ support f → ↑f a = ↑σ a
x : α
hx : ↑σ x = x
hfx : ↑f x = x
⊢ ↑(σ * f⁻¹) x = x
[PROOFSTEP]
rw [← hfx]
[GOAL]
case pos
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
g f✝ σ τ : Perm α
hd : Disjoint σ τ
a✝ : IsCycle σ
hσ : ∀ {f : Perm α}, f ∈ cycleFactorsFinset σ → cycleFactorsFinset (σ * f⁻¹) = cycleFactorsFinset σ \ {f}
hτ : ∀ {f : Perm α}, f ∈ cycleFactorsFinset τ → cycleFactorsFinset (τ * f⁻¹) = cycleFactorsFinset τ \ {f}
f : Perm α
hf : IsCycle f ∧ ∀ (a : α), a ∈ support f → ↑f a = ↑σ a
x : α
hx : ↑σ x = x
hfx : ↑f x = x
⊢ ↑(σ * f⁻¹) (↑f x) = ↑f x
[PROOFSTEP]
simpa [hx] using hfx.symm
[GOAL]
case neg
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
g f✝ σ τ : Perm α
hd : Disjoint σ τ
a✝ : IsCycle σ
hσ : ∀ {f : Perm α}, f ∈ cycleFactorsFinset σ → cycleFactorsFinset (σ * f⁻¹) = cycleFactorsFinset σ \ {f}
hτ : ∀ {f : Perm α}, f ∈ cycleFactorsFinset τ → cycleFactorsFinset (τ * f⁻¹) = cycleFactorsFinset τ \ {f}
f : Perm α
hf : IsCycle f ∧ ∀ (a : α), a ∈ support f → ↑f a = ↑σ a
x : α
hx : ↑σ x = x
hfx : ¬↑f x = x
⊢ ↑(σ * f⁻¹) x = x
[PROOFSTEP]
rw [mul_apply]
[GOAL]
case neg
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
g f✝ σ τ : Perm α
hd : Disjoint σ τ
a✝ : IsCycle σ
hσ : ∀ {f : Perm α}, f ∈ cycleFactorsFinset σ → cycleFactorsFinset (σ * f⁻¹) = cycleFactorsFinset σ \ {f}
hτ : ∀ {f : Perm α}, f ∈ cycleFactorsFinset τ → cycleFactorsFinset (τ * f⁻¹) = cycleFactorsFinset τ \ {f}
f : Perm α
hf : IsCycle f ∧ ∀ (a : α), a ∈ support f → ↑f a = ↑σ a
x : α
hx : ↑σ x = x
hfx : ¬↑f x = x
⊢ ↑σ (↑f⁻¹ x) = x
[PROOFSTEP]
rw [← hf.right _ (mem_support.mpr hfx)] at hx 
[GOAL]
case neg
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
g f✝ σ τ : Perm α
hd : Disjoint σ τ
a✝ : IsCycle σ
hσ : ∀ {f : Perm α}, f ∈ cycleFactorsFinset σ → cycleFactorsFinset (σ * f⁻¹) = cycleFactorsFinset σ \ {f}
hτ : ∀ {f : Perm α}, f ∈ cycleFactorsFinset τ → cycleFactorsFinset (τ * f⁻¹) = cycleFactorsFinset τ \ {f}
f : Perm α
hf : IsCycle f ∧ ∀ (a : α), a ∈ support f → ↑f a = ↑σ a
x : α
hx : ↑f x = x
hfx : ¬↑f x = x
⊢ ↑σ (↑f⁻¹ x) = x
[PROOFSTEP]
contradiction
[GOAL]
case refine'_3.inl
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
g f✝ σ τ : Perm α
hd : Disjoint σ τ
a✝ : IsCycle σ
hσ : ∀ {f : Perm α}, f ∈ cycleFactorsFinset σ → cycleFactorsFinset (σ * f⁻¹) = cycleFactorsFinset σ \ {f}
hτ : ∀ {f : Perm α}, f ∈ cycleFactorsFinset τ → cycleFactorsFinset (τ * f⁻¹) = cycleFactorsFinset τ \ {f}
f : Perm α
hf : f ∈ cycleFactorsFinset σ
⊢ ¬f ∈ cycleFactorsFinset τ
[PROOFSTEP]
exact fun H => not_mem_empty _ (hd.disjoint_cycleFactorsFinset.le_bot (mem_inter_of_mem hf H))
[GOAL]
case refine'_3.inr
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
g f✝ σ τ : Perm α
hd : Disjoint σ τ
a✝ : IsCycle σ
hσ : ∀ {f : Perm α}, f ∈ cycleFactorsFinset σ → cycleFactorsFinset (σ * f⁻¹) = cycleFactorsFinset σ \ {f}
hτ : ∀ {f : Perm α}, f ∈ cycleFactorsFinset τ → cycleFactorsFinset (τ * f⁻¹) = cycleFactorsFinset τ \ {f}
f : Perm α
hf : f ∈ cycleFactorsFinset τ
⊢ cycleFactorsFinset (σ * τ * f⁻¹) = (cycleFactorsFinset σ ∪ cycleFactorsFinset τ) \ {f}
[PROOFSTEP]
rw [union_sdiff_distrib, sdiff_singleton_eq_erase, erase_eq_of_not_mem, mul_assoc,
  Disjoint.cycleFactorsFinset_mul_eq_union, hτ hf]
[GOAL]
case refine'_3.inr
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
g f✝ σ τ : Perm α
hd : Disjoint σ τ
a✝ : IsCycle σ
hσ : ∀ {f : Perm α}, f ∈ cycleFactorsFinset σ → cycleFactorsFinset (σ * f⁻¹) = cycleFactorsFinset σ \ {f}
hτ : ∀ {f : Perm α}, f ∈ cycleFactorsFinset τ → cycleFactorsFinset (τ * f⁻¹) = cycleFactorsFinset τ \ {f}
f : Perm α
hf : f ∈ cycleFactorsFinset τ
⊢ Disjoint σ (τ * f⁻¹)
[PROOFSTEP]
rw [mem_cycleFactorsFinset_iff] at hf 
[GOAL]
case refine'_3.inr
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
g f✝ σ τ : Perm α
hd : Disjoint σ τ
a✝ : IsCycle σ
hσ : ∀ {f : Perm α}, f ∈ cycleFactorsFinset σ → cycleFactorsFinset (σ * f⁻¹) = cycleFactorsFinset σ \ {f}
hτ : ∀ {f : Perm α}, f ∈ cycleFactorsFinset τ → cycleFactorsFinset (τ * f⁻¹) = cycleFactorsFinset τ \ {f}
f : Perm α
hf : IsCycle f ∧ ∀ (a : α), a ∈ support f → ↑f a = ↑τ a
⊢ Disjoint σ (τ * f⁻¹)
[PROOFSTEP]
intro x
[GOAL]
case refine'_3.inr
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
g f✝ σ τ : Perm α
hd : Disjoint σ τ
a✝ : IsCycle σ
hσ : ∀ {f : Perm α}, f ∈ cycleFactorsFinset σ → cycleFactorsFinset (σ * f⁻¹) = cycleFactorsFinset σ \ {f}
hτ : ∀ {f : Perm α}, f ∈ cycleFactorsFinset τ → cycleFactorsFinset (τ * f⁻¹) = cycleFactorsFinset τ \ {f}
f : Perm α
hf : IsCycle f ∧ ∀ (a : α), a ∈ support f → ↑f a = ↑τ a
x : α
⊢ ↑σ x = x ∨ ↑(τ * f⁻¹) x = x
[PROOFSTEP]
cases' hd x with hx hx
[GOAL]
case refine'_3.inr.inl
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
g f✝ σ τ : Perm α
hd : Disjoint σ τ
a✝ : IsCycle σ
hσ : ∀ {f : Perm α}, f ∈ cycleFactorsFinset σ → cycleFactorsFinset (σ * f⁻¹) = cycleFactorsFinset σ \ {f}
hτ : ∀ {f : Perm α}, f ∈ cycleFactorsFinset τ → cycleFactorsFinset (τ * f⁻¹) = cycleFactorsFinset τ \ {f}
f : Perm α
hf : IsCycle f ∧ ∀ (a : α), a ∈ support f → ↑f a = ↑τ a
x : α
hx : ↑σ x = x
⊢ ↑σ x = x ∨ ↑(τ * f⁻¹) x = x
[PROOFSTEP]
exact Or.inl hx
[GOAL]
case refine'_3.inr.inr
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
g f✝ σ τ : Perm α
hd : Disjoint σ τ
a✝ : IsCycle σ
hσ : ∀ {f : Perm α}, f ∈ cycleFactorsFinset σ → cycleFactorsFinset (σ * f⁻¹) = cycleFactorsFinset σ \ {f}
hτ : ∀ {f : Perm α}, f ∈ cycleFactorsFinset τ → cycleFactorsFinset (τ * f⁻¹) = cycleFactorsFinset τ \ {f}
f : Perm α
hf : IsCycle f ∧ ∀ (a : α), a ∈ support f → ↑f a = ↑τ a
x : α
hx : ↑τ x = x
⊢ ↑σ x = x ∨ ↑(τ * f⁻¹) x = x
[PROOFSTEP]
refine' Or.inr _
[GOAL]
case refine'_3.inr.inr
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
g f✝ σ τ : Perm α
hd : Disjoint σ τ
a✝ : IsCycle σ
hσ : ∀ {f : Perm α}, f ∈ cycleFactorsFinset σ → cycleFactorsFinset (σ * f⁻¹) = cycleFactorsFinset σ \ {f}
hτ : ∀ {f : Perm α}, f ∈ cycleFactorsFinset τ → cycleFactorsFinset (τ * f⁻¹) = cycleFactorsFinset τ \ {f}
f : Perm α
hf : IsCycle f ∧ ∀ (a : α), a ∈ support f → ↑f a = ↑τ a
x : α
hx : ↑τ x = x
⊢ ↑(τ * f⁻¹) x = x
[PROOFSTEP]
by_cases hfx : f x = x
[GOAL]
case pos
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
g f✝ σ τ : Perm α
hd : Disjoint σ τ
a✝ : IsCycle σ
hσ : ∀ {f : Perm α}, f ∈ cycleFactorsFinset σ → cycleFactorsFinset (σ * f⁻¹) = cycleFactorsFinset σ \ {f}
hτ : ∀ {f : Perm α}, f ∈ cycleFactorsFinset τ → cycleFactorsFinset (τ * f⁻¹) = cycleFactorsFinset τ \ {f}
f : Perm α
hf : IsCycle f ∧ ∀ (a : α), a ∈ support f → ↑f a = ↑τ a
x : α
hx : ↑τ x = x
hfx : ↑f x = x
⊢ ↑(τ * f⁻¹) x = x
[PROOFSTEP]
rw [← hfx]
[GOAL]
case pos
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
g f✝ σ τ : Perm α
hd : Disjoint σ τ
a✝ : IsCycle σ
hσ : ∀ {f : Perm α}, f ∈ cycleFactorsFinset σ → cycleFactorsFinset (σ * f⁻¹) = cycleFactorsFinset σ \ {f}
hτ : ∀ {f : Perm α}, f ∈ cycleFactorsFinset τ → cycleFactorsFinset (τ * f⁻¹) = cycleFactorsFinset τ \ {f}
f : Perm α
hf : IsCycle f ∧ ∀ (a : α), a ∈ support f → ↑f a = ↑τ a
x : α
hx : ↑τ x = x
hfx : ↑f x = x
⊢ ↑(τ * f⁻¹) (↑f x) = ↑f x
[PROOFSTEP]
simpa [hx] using hfx.symm
[GOAL]
case neg
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
g f✝ σ τ : Perm α
hd : Disjoint σ τ
a✝ : IsCycle σ
hσ : ∀ {f : Perm α}, f ∈ cycleFactorsFinset σ → cycleFactorsFinset (σ * f⁻¹) = cycleFactorsFinset σ \ {f}
hτ : ∀ {f : Perm α}, f ∈ cycleFactorsFinset τ → cycleFactorsFinset (τ * f⁻¹) = cycleFactorsFinset τ \ {f}
f : Perm α
hf : IsCycle f ∧ ∀ (a : α), a ∈ support f → ↑f a = ↑τ a
x : α
hx : ↑τ x = x
hfx : ¬↑f x = x
⊢ ↑(τ * f⁻¹) x = x
[PROOFSTEP]
rw [mul_apply]
[GOAL]
case neg
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
g f✝ σ τ : Perm α
hd : Disjoint σ τ
a✝ : IsCycle σ
hσ : ∀ {f : Perm α}, f ∈ cycleFactorsFinset σ → cycleFactorsFinset (σ * f⁻¹) = cycleFactorsFinset σ \ {f}
hτ : ∀ {f : Perm α}, f ∈ cycleFactorsFinset τ → cycleFactorsFinset (τ * f⁻¹) = cycleFactorsFinset τ \ {f}
f : Perm α
hf : IsCycle f ∧ ∀ (a : α), a ∈ support f → ↑f a = ↑τ a
x : α
hx : ↑τ x = x
hfx : ¬↑f x = x
⊢ ↑τ (↑f⁻¹ x) = x
[PROOFSTEP]
rw [← hf.right _ (mem_support.mpr hfx)] at hx 
[GOAL]
case neg
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
g f✝ σ τ : Perm α
hd : Disjoint σ τ
a✝ : IsCycle σ
hσ : ∀ {f : Perm α}, f ∈ cycleFactorsFinset σ → cycleFactorsFinset (σ * f⁻¹) = cycleFactorsFinset σ \ {f}
hτ : ∀ {f : Perm α}, f ∈ cycleFactorsFinset τ → cycleFactorsFinset (τ * f⁻¹) = cycleFactorsFinset τ \ {f}
f : Perm α
hf : IsCycle f ∧ ∀ (a : α), a ∈ support f → ↑f a = ↑τ a
x : α
hx : ↑f x = x
hfx : ¬↑f x = x
⊢ ↑τ (↑f⁻¹ x) = x
[PROOFSTEP]
contradiction
[GOAL]
case refine'_3.inr
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
g f✝ σ τ : Perm α
hd : Disjoint σ τ
a✝ : IsCycle σ
hσ : ∀ {f : Perm α}, f ∈ cycleFactorsFinset σ → cycleFactorsFinset (σ * f⁻¹) = cycleFactorsFinset σ \ {f}
hτ : ∀ {f : Perm α}, f ∈ cycleFactorsFinset τ → cycleFactorsFinset (τ * f⁻¹) = cycleFactorsFinset τ \ {f}
f : Perm α
hf : f ∈ cycleFactorsFinset τ
⊢ ¬f ∈ cycleFactorsFinset σ
[PROOFSTEP]
exact fun H => not_mem_empty _ (hd.disjoint_cycleFactorsFinset.le_bot (mem_inter_of_mem H hf))
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Finite β
⊢ closure {σ | IsCycle σ} = ⊤
[PROOFSTEP]
classical
cases nonempty_fintype β
exact top_le_iff.mp (le_trans (ge_of_eq closure_isSwap) (closure_mono fun _ => IsSwap.isCycle))
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Finite β
⊢ closure {σ | IsCycle σ} = ⊤
[PROOFSTEP]
cases nonempty_fintype β
[GOAL]
case intro
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Finite β
val✝ : Fintype β
⊢ closure {σ | IsCycle σ} = ⊤
[PROOFSTEP]
exact top_le_iff.mp (le_trans (ge_of_eq closure_isSwap) (closure_mono fun _ => IsSwap.isCycle))
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝² : DecidableEq α
inst✝¹ : Finite β
inst✝ : Fintype α
σ : Perm α
h1 : IsCycle σ
h2 : support σ = ⊤
x : α
⊢ closure {σ, swap x (↑σ x)} = ⊤
[PROOFSTEP]
let H := closure ({σ, swap x (σ x)} : Set (Perm α))
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝² : DecidableEq α
inst✝¹ : Finite β
inst✝ : Fintype α
σ : Perm α
h1 : IsCycle σ
h2 : support σ = ⊤
x : α
H : Subgroup (Perm α) := closure {σ, swap x (↑σ x)}
⊢ closure {σ, swap x (↑σ x)} = ⊤
[PROOFSTEP]
have h3 : σ ∈ H := subset_closure (Set.mem_insert σ _)
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝² : DecidableEq α
inst✝¹ : Finite β
inst✝ : Fintype α
σ : Perm α
h1 : IsCycle σ
h2 : support σ = ⊤
x : α
H : Subgroup (Perm α) := closure {σ, swap x (↑σ x)}
h3 : σ ∈ H
⊢ closure {σ, swap x (↑σ x)} = ⊤
[PROOFSTEP]
have h4 : swap x (σ x) ∈ H := subset_closure (Set.mem_insert_of_mem _ (Set.mem_singleton _))
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝² : DecidableEq α
inst✝¹ : Finite β
inst✝ : Fintype α
σ : Perm α
h1 : IsCycle σ
h2 : support σ = ⊤
x : α
H : Subgroup (Perm α) := closure {σ, swap x (↑σ x)}
h3 : σ ∈ H
h4 : swap x (↑σ x) ∈ H
⊢ closure {σ, swap x (↑σ x)} = ⊤
[PROOFSTEP]
have step1 : ∀ n : ℕ, swap ((σ ^ n) x) ((σ ^ (n + 1) : Perm α) x) ∈ H :=
  by
  intro n
  induction' n with n ih
  · exact subset_closure (Set.mem_insert_of_mem _ (Set.mem_singleton _))
  · convert H.mul_mem (H.mul_mem h3 ih) (H.inv_mem h3)
    simp_rw [mul_swap_eq_swap_mul, mul_inv_cancel_right, pow_succ]
    rfl
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝² : DecidableEq α
inst✝¹ : Finite β
inst✝ : Fintype α
σ : Perm α
h1 : IsCycle σ
h2 : support σ = ⊤
x : α
H : Subgroup (Perm α) := closure {σ, swap x (↑σ x)}
h3 : σ ∈ H
h4 : swap x (↑σ x) ∈ H
⊢ ∀ (n : ℕ), swap (↑(σ ^ n) x) (↑(σ ^ (n + 1)) x) ∈ H
[PROOFSTEP]
intro n
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝² : DecidableEq α
inst✝¹ : Finite β
inst✝ : Fintype α
σ : Perm α
h1 : IsCycle σ
h2 : support σ = ⊤
x : α
H : Subgroup (Perm α) := closure {σ, swap x (↑σ x)}
h3 : σ ∈ H
h4 : swap x (↑σ x) ∈ H
n : ℕ
⊢ swap (↑(σ ^ n) x) (↑(σ ^ (n + 1)) x) ∈ H
[PROOFSTEP]
induction' n with n ih
[GOAL]
case zero
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝² : DecidableEq α
inst✝¹ : Finite β
inst✝ : Fintype α
σ : Perm α
h1 : IsCycle σ
h2 : support σ = ⊤
x : α
H : Subgroup (Perm α) := closure {σ, swap x (↑σ x)}
h3 : σ ∈ H
h4 : swap x (↑σ x) ∈ H
⊢ swap (↑(σ ^ Nat.zero) x) (↑(σ ^ (Nat.zero + 1)) x) ∈ H
[PROOFSTEP]
exact subset_closure (Set.mem_insert_of_mem _ (Set.mem_singleton _))
[GOAL]
case succ
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝² : DecidableEq α
inst✝¹ : Finite β
inst✝ : Fintype α
σ : Perm α
h1 : IsCycle σ
h2 : support σ = ⊤
x : α
H : Subgroup (Perm α) := closure {σ, swap x (↑σ x)}
h3 : σ ∈ H
h4 : swap x (↑σ x) ∈ H
n : ℕ
ih : swap (↑(σ ^ n) x) (↑(σ ^ (n + 1)) x) ∈ H
⊢ swap (↑(σ ^ Nat.succ n) x) (↑(σ ^ (Nat.succ n + 1)) x) ∈ H
[PROOFSTEP]
convert H.mul_mem (H.mul_mem h3 ih) (H.inv_mem h3)
[GOAL]
case h.e'_4
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝² : DecidableEq α
inst✝¹ : Finite β
inst✝ : Fintype α
σ : Perm α
h1 : IsCycle σ
h2 : support σ = ⊤
x : α
H : Subgroup (Perm α) := closure {σ, swap x (↑σ x)}
h3 : σ ∈ H
h4 : swap x (↑σ x) ∈ H
n : ℕ
ih : swap (↑(σ ^ n) x) (↑(σ ^ (n + 1)) x) ∈ H
⊢ swap (↑(σ ^ Nat.succ n) x) (↑(σ ^ (Nat.succ n + 1)) x) = σ * swap (↑(σ ^ n) x) (↑(σ ^ (n + 1)) x) * σ⁻¹
[PROOFSTEP]
simp_rw [mul_swap_eq_swap_mul, mul_inv_cancel_right, pow_succ]
[GOAL]
case h.e'_4
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝² : DecidableEq α
inst✝¹ : Finite β
inst✝ : Fintype α
σ : Perm α
h1 : IsCycle σ
h2 : support σ = ⊤
x : α
H : Subgroup (Perm α) := closure {σ, swap x (↑σ x)}
h3 : σ ∈ H
h4 : swap x (↑σ x) ∈ H
n : ℕ
ih : swap (↑(σ ^ n) x) (↑(σ ^ (n + 1)) x) ∈ H
⊢ swap (↑(σ * σ ^ n) x) (↑(σ * (σ * σ ^ n)) x) = swap (↑σ (↑(σ ^ n) x)) (↑σ (↑(σ * σ ^ n) x))
[PROOFSTEP]
rfl
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝² : DecidableEq α
inst✝¹ : Finite β
inst✝ : Fintype α
σ : Perm α
h1 : IsCycle σ
h2 : support σ = ⊤
x : α
H : Subgroup (Perm α) := closure {σ, swap x (↑σ x)}
h3 : σ ∈ H
h4 : swap x (↑σ x) ∈ H
step1 : ∀ (n : ℕ), swap (↑(σ ^ n) x) (↑(σ ^ (n + 1)) x) ∈ H
⊢ closure {σ, swap x (↑σ x)} = ⊤
[PROOFSTEP]
have step2 : ∀ n : ℕ, swap x ((σ ^ n) x) ∈ H := by
  intro n
  induction' n with n ih
  · simp only [Nat.zero_eq, pow_zero, coe_one, id_eq, swap_self, Set.mem_singleton_iff]
    convert H.one_mem
  · by_cases h5 : x = (σ ^ n) x
    · rw [pow_succ, mul_apply, ← h5]
      exact h4
    by_cases h6 : x = (σ ^ (n + 1) : Perm α) x
    · rw [← h6, swap_self]
      exact H.one_mem
    rw [swap_comm, ← swap_mul_swap_mul_swap h5 h6]
    exact H.mul_mem (H.mul_mem (step1 n) ih) (step1 n)
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝² : DecidableEq α
inst✝¹ : Finite β
inst✝ : Fintype α
σ : Perm α
h1 : IsCycle σ
h2 : support σ = ⊤
x : α
H : Subgroup (Perm α) := closure {σ, swap x (↑σ x)}
h3 : σ ∈ H
h4 : swap x (↑σ x) ∈ H
step1 : ∀ (n : ℕ), swap (↑(σ ^ n) x) (↑(σ ^ (n + 1)) x) ∈ H
⊢ ∀ (n : ℕ), swap x (↑(σ ^ n) x) ∈ H
[PROOFSTEP]
intro n
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝² : DecidableEq α
inst✝¹ : Finite β
inst✝ : Fintype α
σ : Perm α
h1 : IsCycle σ
h2 : support σ = ⊤
x : α
H : Subgroup (Perm α) := closure {σ, swap x (↑σ x)}
h3 : σ ∈ H
h4 : swap x (↑σ x) ∈ H
step1 : ∀ (n : ℕ), swap (↑(σ ^ n) x) (↑(σ ^ (n + 1)) x) ∈ H
n : ℕ
⊢ swap x (↑(σ ^ n) x) ∈ H
[PROOFSTEP]
induction' n with n ih
[GOAL]
case zero
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝² : DecidableEq α
inst✝¹ : Finite β
inst✝ : Fintype α
σ : Perm α
h1 : IsCycle σ
h2 : support σ = ⊤
x : α
H : Subgroup (Perm α) := closure {σ, swap x (↑σ x)}
h3 : σ ∈ H
h4 : swap x (↑σ x) ∈ H
step1 : ∀ (n : ℕ), swap (↑(σ ^ n) x) (↑(σ ^ (n + 1)) x) ∈ H
⊢ swap x (↑(σ ^ Nat.zero) x) ∈ H
[PROOFSTEP]
simp only [Nat.zero_eq, pow_zero, coe_one, id_eq, swap_self, Set.mem_singleton_iff]
[GOAL]
case zero
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝² : DecidableEq α
inst✝¹ : Finite β
inst✝ : Fintype α
σ : Perm α
h1 : IsCycle σ
h2 : support σ = ⊤
x : α
H : Subgroup (Perm α) := closure {σ, swap x (↑σ x)}
h3 : σ ∈ H
h4 : swap x (↑σ x) ∈ H
step1 : ∀ (n : ℕ), swap (↑(σ ^ n) x) (↑(σ ^ (n + 1)) x) ∈ H
⊢ Equiv.refl α ∈ closure {σ, swap x (↑σ x)}
[PROOFSTEP]
convert H.one_mem
[GOAL]
case succ
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝² : DecidableEq α
inst✝¹ : Finite β
inst✝ : Fintype α
σ : Perm α
h1 : IsCycle σ
h2 : support σ = ⊤
x : α
H : Subgroup (Perm α) := closure {σ, swap x (↑σ x)}
h3 : σ ∈ H
h4 : swap x (↑σ x) ∈ H
step1 : ∀ (n : ℕ), swap (↑(σ ^ n) x) (↑(σ ^ (n + 1)) x) ∈ H
n : ℕ
ih : swap x (↑(σ ^ n) x) ∈ H
⊢ swap x (↑(σ ^ Nat.succ n) x) ∈ H
[PROOFSTEP]
by_cases h5 : x = (σ ^ n) x
[GOAL]
case pos
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝² : DecidableEq α
inst✝¹ : Finite β
inst✝ : Fintype α
σ : Perm α
h1 : IsCycle σ
h2 : support σ = ⊤
x : α
H : Subgroup (Perm α) := closure {σ, swap x (↑σ x)}
h3 : σ ∈ H
h4 : swap x (↑σ x) ∈ H
step1 : ∀ (n : ℕ), swap (↑(σ ^ n) x) (↑(σ ^ (n + 1)) x) ∈ H
n : ℕ
ih : swap x (↑(σ ^ n) x) ∈ H
h5 : x = ↑(σ ^ n) x
⊢ swap x (↑(σ ^ Nat.succ n) x) ∈ H
[PROOFSTEP]
rw [pow_succ, mul_apply, ← h5]
[GOAL]
case pos
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝² : DecidableEq α
inst✝¹ : Finite β
inst✝ : Fintype α
σ : Perm α
h1 : IsCycle σ
h2 : support σ = ⊤
x : α
H : Subgroup (Perm α) := closure {σ, swap x (↑σ x)}
h3 : σ ∈ H
h4 : swap x (↑σ x) ∈ H
step1 : ∀ (n : ℕ), swap (↑(σ ^ n) x) (↑(σ ^ (n + 1)) x) ∈ H
n : ℕ
ih : swap x (↑(σ ^ n) x) ∈ H
h5 : x = ↑(σ ^ n) x
⊢ swap x (↑σ x) ∈ H
[PROOFSTEP]
exact h4
[GOAL]
case neg
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝² : DecidableEq α
inst✝¹ : Finite β
inst✝ : Fintype α
σ : Perm α
h1 : IsCycle σ
h2 : support σ = ⊤
x : α
H : Subgroup (Perm α) := closure {σ, swap x (↑σ x)}
h3 : σ ∈ H
h4 : swap x (↑σ x) ∈ H
step1 : ∀ (n : ℕ), swap (↑(σ ^ n) x) (↑(σ ^ (n + 1)) x) ∈ H
n : ℕ
ih : swap x (↑(σ ^ n) x) ∈ H
h5 : ¬x = ↑(σ ^ n) x
⊢ swap x (↑(σ ^ Nat.succ n) x) ∈ H
[PROOFSTEP]
by_cases h6 : x = (σ ^ (n + 1) : Perm α) x
[GOAL]
case pos
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝² : DecidableEq α
inst✝¹ : Finite β
inst✝ : Fintype α
σ : Perm α
h1 : IsCycle σ
h2 : support σ = ⊤
x : α
H : Subgroup (Perm α) := closure {σ, swap x (↑σ x)}
h3 : σ ∈ H
h4 : swap x (↑σ x) ∈ H
step1 : ∀ (n : ℕ), swap (↑(σ ^ n) x) (↑(σ ^ (n + 1)) x) ∈ H
n : ℕ
ih : swap x (↑(σ ^ n) x) ∈ H
h5 : ¬x = ↑(σ ^ n) x
h6 : x = ↑(σ ^ (n + 1)) x
⊢ swap x (↑(σ ^ Nat.succ n) x) ∈ H
[PROOFSTEP]
rw [← h6, swap_self]
[GOAL]
case pos
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝² : DecidableEq α
inst✝¹ : Finite β
inst✝ : Fintype α
σ : Perm α
h1 : IsCycle σ
h2 : support σ = ⊤
x : α
H : Subgroup (Perm α) := closure {σ, swap x (↑σ x)}
h3 : σ ∈ H
h4 : swap x (↑σ x) ∈ H
step1 : ∀ (n : ℕ), swap (↑(σ ^ n) x) (↑(σ ^ (n + 1)) x) ∈ H
n : ℕ
ih : swap x (↑(σ ^ n) x) ∈ H
h5 : ¬x = ↑(σ ^ n) x
h6 : x = ↑(σ ^ (n + 1)) x
⊢ Equiv.refl α ∈ H
[PROOFSTEP]
exact H.one_mem
[GOAL]
case neg
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝² : DecidableEq α
inst✝¹ : Finite β
inst✝ : Fintype α
σ : Perm α
h1 : IsCycle σ
h2 : support σ = ⊤
x : α
H : Subgroup (Perm α) := closure {σ, swap x (↑σ x)}
h3 : σ ∈ H
h4 : swap x (↑σ x) ∈ H
step1 : ∀ (n : ℕ), swap (↑(σ ^ n) x) (↑(σ ^ (n + 1)) x) ∈ H
n : ℕ
ih : swap x (↑(σ ^ n) x) ∈ H
h5 : ¬x = ↑(σ ^ n) x
h6 : ¬x = ↑(σ ^ (n + 1)) x
⊢ swap x (↑(σ ^ Nat.succ n) x) ∈ H
[PROOFSTEP]
rw [swap_comm, ← swap_mul_swap_mul_swap h5 h6]
[GOAL]
case neg
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝² : DecidableEq α
inst✝¹ : Finite β
inst✝ : Fintype α
σ : Perm α
h1 : IsCycle σ
h2 : support σ = ⊤
x : α
H : Subgroup (Perm α) := closure {σ, swap x (↑σ x)}
h3 : σ ∈ H
h4 : swap x (↑σ x) ∈ H
step1 : ∀ (n : ℕ), swap (↑(σ ^ n) x) (↑(σ ^ (n + 1)) x) ∈ H
n : ℕ
ih : swap x (↑(σ ^ n) x) ∈ H
h5 : ¬x = ↑(σ ^ n) x
h6 : ¬x = ↑(σ ^ (n + 1)) x
⊢ swap (↑(σ ^ n) x) (↑(σ ^ (n + 1)) x) * swap x (↑(σ ^ n) x) * swap (↑(σ ^ n) x) (↑(σ ^ (n + 1)) x) ∈ H
[PROOFSTEP]
exact H.mul_mem (H.mul_mem (step1 n) ih) (step1 n)
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝² : DecidableEq α
inst✝¹ : Finite β
inst✝ : Fintype α
σ : Perm α
h1 : IsCycle σ
h2 : support σ = ⊤
x : α
H : Subgroup (Perm α) := closure {σ, swap x (↑σ x)}
h3 : σ ∈ H
h4 : swap x (↑σ x) ∈ H
step1 : ∀ (n : ℕ), swap (↑(σ ^ n) x) (↑(σ ^ (n + 1)) x) ∈ H
step2 : ∀ (n : ℕ), swap x (↑(σ ^ n) x) ∈ H
⊢ closure {σ, swap x (↑σ x)} = ⊤
[PROOFSTEP]
have step3 : ∀ y : α, swap x y ∈ H := by
  intro y
  have hx : x ∈ (⊤ : Finset α) := Finset.mem_univ x
  rw [← h2, mem_support] at hx 
  have hy : y ∈ (⊤ : Finset α) := Finset.mem_univ y
  rw [← h2, mem_support] at hy 
  cases' IsCycle.exists_pow_eq h1 hx hy with n hn
  rw [← hn]
  exact step2 n
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝² : DecidableEq α
inst✝¹ : Finite β
inst✝ : Fintype α
σ : Perm α
h1 : IsCycle σ
h2 : support σ = ⊤
x : α
H : Subgroup (Perm α) := closure {σ, swap x (↑σ x)}
h3 : σ ∈ H
h4 : swap x (↑σ x) ∈ H
step1 : ∀ (n : ℕ), swap (↑(σ ^ n) x) (↑(σ ^ (n + 1)) x) ∈ H
step2 : ∀ (n : ℕ), swap x (↑(σ ^ n) x) ∈ H
⊢ ∀ (y : α), swap x y ∈ H
[PROOFSTEP]
intro y
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝² : DecidableEq α
inst✝¹ : Finite β
inst✝ : Fintype α
σ : Perm α
h1 : IsCycle σ
h2 : support σ = ⊤
x : α
H : Subgroup (Perm α) := closure {σ, swap x (↑σ x)}
h3 : σ ∈ H
h4 : swap x (↑σ x) ∈ H
step1 : ∀ (n : ℕ), swap (↑(σ ^ n) x) (↑(σ ^ (n + 1)) x) ∈ H
step2 : ∀ (n : ℕ), swap x (↑(σ ^ n) x) ∈ H
y : α
⊢ swap x y ∈ H
[PROOFSTEP]
have hx : x ∈ (⊤ : Finset α) := Finset.mem_univ x
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝² : DecidableEq α
inst✝¹ : Finite β
inst✝ : Fintype α
σ : Perm α
h1 : IsCycle σ
h2 : support σ = ⊤
x : α
H : Subgroup (Perm α) := closure {σ, swap x (↑σ x)}
h3 : σ ∈ H
h4 : swap x (↑σ x) ∈ H
step1 : ∀ (n : ℕ), swap (↑(σ ^ n) x) (↑(σ ^ (n + 1)) x) ∈ H
step2 : ∀ (n : ℕ), swap x (↑(σ ^ n) x) ∈ H
y : α
hx : x ∈ ⊤
⊢ swap x y ∈ H
[PROOFSTEP]
rw [← h2, mem_support] at hx 
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝² : DecidableEq α
inst✝¹ : Finite β
inst✝ : Fintype α
σ : Perm α
h1 : IsCycle σ
h2 : support σ = ⊤
x : α
H : Subgroup (Perm α) := closure {σ, swap x (↑σ x)}
h3 : σ ∈ H
h4 : swap x (↑σ x) ∈ H
step1 : ∀ (n : ℕ), swap (↑(σ ^ n) x) (↑(σ ^ (n + 1)) x) ∈ H
step2 : ∀ (n : ℕ), swap x (↑(σ ^ n) x) ∈ H
y : α
hx : ↑σ x ≠ x
⊢ swap x y ∈ H
[PROOFSTEP]
have hy : y ∈ (⊤ : Finset α) := Finset.mem_univ y
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝² : DecidableEq α
inst✝¹ : Finite β
inst✝ : Fintype α
σ : Perm α
h1 : IsCycle σ
h2 : support σ = ⊤
x : α
H : Subgroup (Perm α) := closure {σ, swap x (↑σ x)}
h3 : σ ∈ H
h4 : swap x (↑σ x) ∈ H
step1 : ∀ (n : ℕ), swap (↑(σ ^ n) x) (↑(σ ^ (n + 1)) x) ∈ H
step2 : ∀ (n : ℕ), swap x (↑(σ ^ n) x) ∈ H
y : α
hx : ↑σ x ≠ x
hy : y ∈ ⊤
⊢ swap x y ∈ H
[PROOFSTEP]
rw [← h2, mem_support] at hy 
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝² : DecidableEq α
inst✝¹ : Finite β
inst✝ : Fintype α
σ : Perm α
h1 : IsCycle σ
h2 : support σ = ⊤
x : α
H : Subgroup (Perm α) := closure {σ, swap x (↑σ x)}
h3 : σ ∈ H
h4 : swap x (↑σ x) ∈ H
step1 : ∀ (n : ℕ), swap (↑(σ ^ n) x) (↑(σ ^ (n + 1)) x) ∈ H
step2 : ∀ (n : ℕ), swap x (↑(σ ^ n) x) ∈ H
y : α
hx : ↑σ x ≠ x
hy : ↑σ y ≠ y
⊢ swap x y ∈ H
[PROOFSTEP]
cases' IsCycle.exists_pow_eq h1 hx hy with n hn
[GOAL]
case intro
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝² : DecidableEq α
inst✝¹ : Finite β
inst✝ : Fintype α
σ : Perm α
h1 : IsCycle σ
h2 : support σ = ⊤
x : α
H : Subgroup (Perm α) := closure {σ, swap x (↑σ x)}
h3 : σ ∈ H
h4 : swap x (↑σ x) ∈ H
step1 : ∀ (n : ℕ), swap (↑(σ ^ n) x) (↑(σ ^ (n + 1)) x) ∈ H
step2 : ∀ (n : ℕ), swap x (↑(σ ^ n) x) ∈ H
y : α
hx : ↑σ x ≠ x
hy : ↑σ y ≠ y
n : ℕ
hn : ↑(σ ^ n) x = y
⊢ swap x y ∈ H
[PROOFSTEP]
rw [← hn]
[GOAL]
case intro
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝² : DecidableEq α
inst✝¹ : Finite β
inst✝ : Fintype α
σ : Perm α
h1 : IsCycle σ
h2 : support σ = ⊤
x : α
H : Subgroup (Perm α) := closure {σ, swap x (↑σ x)}
h3 : σ ∈ H
h4 : swap x (↑σ x) ∈ H
step1 : ∀ (n : ℕ), swap (↑(σ ^ n) x) (↑(σ ^ (n + 1)) x) ∈ H
step2 : ∀ (n : ℕ), swap x (↑(σ ^ n) x) ∈ H
y : α
hx : ↑σ x ≠ x
hy : ↑σ y ≠ y
n : ℕ
hn : ↑(σ ^ n) x = y
⊢ swap x (↑(σ ^ n) x) ∈ H
[PROOFSTEP]
exact step2 n
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝² : DecidableEq α
inst✝¹ : Finite β
inst✝ : Fintype α
σ : Perm α
h1 : IsCycle σ
h2 : support σ = ⊤
x : α
H : Subgroup (Perm α) := closure {σ, swap x (↑σ x)}
h3 : σ ∈ H
h4 : swap x (↑σ x) ∈ H
step1 : ∀ (n : ℕ), swap (↑(σ ^ n) x) (↑(σ ^ (n + 1)) x) ∈ H
step2 : ∀ (n : ℕ), swap x (↑(σ ^ n) x) ∈ H
step3 : ∀ (y : α), swap x y ∈ H
⊢ closure {σ, swap x (↑σ x)} = ⊤
[PROOFSTEP]
have step4 : ∀ y z : α, swap y z ∈ H := by
  intro y z
  by_cases h5 : z = x
  · rw [h5, swap_comm]
    exact step3 y
  by_cases h6 : z = y
  · rw [h6, swap_self]
    exact H.one_mem
  rw [← swap_mul_swap_mul_swap h5 h6, swap_comm z x]
  exact H.mul_mem (H.mul_mem (step3 y) (step3 z)) (step3 y)
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝² : DecidableEq α
inst✝¹ : Finite β
inst✝ : Fintype α
σ : Perm α
h1 : IsCycle σ
h2 : support σ = ⊤
x : α
H : Subgroup (Perm α) := closure {σ, swap x (↑σ x)}
h3 : σ ∈ H
h4 : swap x (↑σ x) ∈ H
step1 : ∀ (n : ℕ), swap (↑(σ ^ n) x) (↑(σ ^ (n + 1)) x) ∈ H
step2 : ∀ (n : ℕ), swap x (↑(σ ^ n) x) ∈ H
step3 : ∀ (y : α), swap x y ∈ H
⊢ ∀ (y z : α), swap y z ∈ H
[PROOFSTEP]
intro y z
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝² : DecidableEq α
inst✝¹ : Finite β
inst✝ : Fintype α
σ : Perm α
h1 : IsCycle σ
h2 : support σ = ⊤
x : α
H : Subgroup (Perm α) := closure {σ, swap x (↑σ x)}
h3 : σ ∈ H
h4 : swap x (↑σ x) ∈ H
step1 : ∀ (n : ℕ), swap (↑(σ ^ n) x) (↑(σ ^ (n + 1)) x) ∈ H
step2 : ∀ (n : ℕ), swap x (↑(σ ^ n) x) ∈ H
step3 : ∀ (y : α), swap x y ∈ H
y z : α
⊢ swap y z ∈ H
[PROOFSTEP]
by_cases h5 : z = x
[GOAL]
case pos
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝² : DecidableEq α
inst✝¹ : Finite β
inst✝ : Fintype α
σ : Perm α
h1 : IsCycle σ
h2 : support σ = ⊤
x : α
H : Subgroup (Perm α) := closure {σ, swap x (↑σ x)}
h3 : σ ∈ H
h4 : swap x (↑σ x) ∈ H
step1 : ∀ (n : ℕ), swap (↑(σ ^ n) x) (↑(σ ^ (n + 1)) x) ∈ H
step2 : ∀ (n : ℕ), swap x (↑(σ ^ n) x) ∈ H
step3 : ∀ (y : α), swap x y ∈ H
y z : α
h5 : z = x
⊢ swap y z ∈ H
[PROOFSTEP]
rw [h5, swap_comm]
[GOAL]
case pos
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝² : DecidableEq α
inst✝¹ : Finite β
inst✝ : Fintype α
σ : Perm α
h1 : IsCycle σ
h2 : support σ = ⊤
x : α
H : Subgroup (Perm α) := closure {σ, swap x (↑σ x)}
h3 : σ ∈ H
h4 : swap x (↑σ x) ∈ H
step1 : ∀ (n : ℕ), swap (↑(σ ^ n) x) (↑(σ ^ (n + 1)) x) ∈ H
step2 : ∀ (n : ℕ), swap x (↑(σ ^ n) x) ∈ H
step3 : ∀ (y : α), swap x y ∈ H
y z : α
h5 : z = x
⊢ swap x y ∈ H
[PROOFSTEP]
exact step3 y
[GOAL]
case neg
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝² : DecidableEq α
inst✝¹ : Finite β
inst✝ : Fintype α
σ : Perm α
h1 : IsCycle σ
h2 : support σ = ⊤
x : α
H : Subgroup (Perm α) := closure {σ, swap x (↑σ x)}
h3 : σ ∈ H
h4 : swap x (↑σ x) ∈ H
step1 : ∀ (n : ℕ), swap (↑(σ ^ n) x) (↑(σ ^ (n + 1)) x) ∈ H
step2 : ∀ (n : ℕ), swap x (↑(σ ^ n) x) ∈ H
step3 : ∀ (y : α), swap x y ∈ H
y z : α
h5 : ¬z = x
⊢ swap y z ∈ H
[PROOFSTEP]
by_cases h6 : z = y
[GOAL]
case pos
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝² : DecidableEq α
inst✝¹ : Finite β
inst✝ : Fintype α
σ : Perm α
h1 : IsCycle σ
h2 : support σ = ⊤
x : α
H : Subgroup (Perm α) := closure {σ, swap x (↑σ x)}
h3 : σ ∈ H
h4 : swap x (↑σ x) ∈ H
step1 : ∀ (n : ℕ), swap (↑(σ ^ n) x) (↑(σ ^ (n + 1)) x) ∈ H
step2 : ∀ (n : ℕ), swap x (↑(σ ^ n) x) ∈ H
step3 : ∀ (y : α), swap x y ∈ H
y z : α
h5 : ¬z = x
h6 : z = y
⊢ swap y z ∈ H
[PROOFSTEP]
rw [h6, swap_self]
[GOAL]
case pos
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝² : DecidableEq α
inst✝¹ : Finite β
inst✝ : Fintype α
σ : Perm α
h1 : IsCycle σ
h2 : support σ = ⊤
x : α
H : Subgroup (Perm α) := closure {σ, swap x (↑σ x)}
h3 : σ ∈ H
h4 : swap x (↑σ x) ∈ H
step1 : ∀ (n : ℕ), swap (↑(σ ^ n) x) (↑(σ ^ (n + 1)) x) ∈ H
step2 : ∀ (n : ℕ), swap x (↑(σ ^ n) x) ∈ H
step3 : ∀ (y : α), swap x y ∈ H
y z : α
h5 : ¬z = x
h6 : z = y
⊢ Equiv.refl α ∈ H
[PROOFSTEP]
exact H.one_mem
[GOAL]
case neg
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝² : DecidableEq α
inst✝¹ : Finite β
inst✝ : Fintype α
σ : Perm α
h1 : IsCycle σ
h2 : support σ = ⊤
x : α
H : Subgroup (Perm α) := closure {σ, swap x (↑σ x)}
h3 : σ ∈ H
h4 : swap x (↑σ x) ∈ H
step1 : ∀ (n : ℕ), swap (↑(σ ^ n) x) (↑(σ ^ (n + 1)) x) ∈ H
step2 : ∀ (n : ℕ), swap x (↑(σ ^ n) x) ∈ H
step3 : ∀ (y : α), swap x y ∈ H
y z : α
h5 : ¬z = x
h6 : ¬z = y
⊢ swap y z ∈ H
[PROOFSTEP]
rw [← swap_mul_swap_mul_swap h5 h6, swap_comm z x]
[GOAL]
case neg
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝² : DecidableEq α
inst✝¹ : Finite β
inst✝ : Fintype α
σ : Perm α
h1 : IsCycle σ
h2 : support σ = ⊤
x : α
H : Subgroup (Perm α) := closure {σ, swap x (↑σ x)}
h3 : σ ∈ H
h4 : swap x (↑σ x) ∈ H
step1 : ∀ (n : ℕ), swap (↑(σ ^ n) x) (↑(σ ^ (n + 1)) x) ∈ H
step2 : ∀ (n : ℕ), swap x (↑(σ ^ n) x) ∈ H
step3 : ∀ (y : α), swap x y ∈ H
y z : α
h5 : ¬z = x
h6 : ¬z = y
⊢ swap x y * swap x z * swap x y ∈ H
[PROOFSTEP]
exact H.mul_mem (H.mul_mem (step3 y) (step3 z)) (step3 y)
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝² : DecidableEq α
inst✝¹ : Finite β
inst✝ : Fintype α
σ : Perm α
h1 : IsCycle σ
h2 : support σ = ⊤
x : α
H : Subgroup (Perm α) := closure {σ, swap x (↑σ x)}
h3 : σ ∈ H
h4 : swap x (↑σ x) ∈ H
step1 : ∀ (n : ℕ), swap (↑(σ ^ n) x) (↑(σ ^ (n + 1)) x) ∈ H
step2 : ∀ (n : ℕ), swap x (↑(σ ^ n) x) ∈ H
step3 : ∀ (y : α), swap x y ∈ H
step4 : ∀ (y z : α), swap y z ∈ H
⊢ closure {σ, swap x (↑σ x)} = ⊤
[PROOFSTEP]
rw [eq_top_iff, ← closure_isSwap, closure_le]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝² : DecidableEq α
inst✝¹ : Finite β
inst✝ : Fintype α
σ : Perm α
h1 : IsCycle σ
h2 : support σ = ⊤
x : α
H : Subgroup (Perm α) := closure {σ, swap x (↑σ x)}
h3 : σ ∈ H
h4 : swap x (↑σ x) ∈ H
step1 : ∀ (n : ℕ), swap (↑(σ ^ n) x) (↑(σ ^ (n + 1)) x) ∈ H
step2 : ∀ (n : ℕ), swap x (↑(σ ^ n) x) ∈ H
step3 : ∀ (y : α), swap x y ∈ H
step4 : ∀ (y z : α), swap y z ∈ H
⊢ {σ | IsSwap σ} ⊆ ↑(closure {σ, swap x (↑σ x)})
[PROOFSTEP]
rintro τ ⟨y, z, _, h6⟩
[GOAL]
case intro.intro.intro
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝² : DecidableEq α
inst✝¹ : Finite β
inst✝ : Fintype α
σ : Perm α
h1 : IsCycle σ
h2 : support σ = ⊤
x : α
H : Subgroup (Perm α) := closure {σ, swap x (↑σ x)}
h3 : σ ∈ H
h4 : swap x (↑σ x) ∈ H
step1 : ∀ (n : ℕ), swap (↑(σ ^ n) x) (↑(σ ^ (n + 1)) x) ∈ H
step2 : ∀ (n : ℕ), swap x (↑(σ ^ n) x) ∈ H
step3 : ∀ (y : α), swap x y ∈ H
step4 : ∀ (y z : α), swap y z ∈ H
τ : Perm α
y z : α
left✝ : y ≠ z
h6 : τ = swap y z
⊢ τ ∈ ↑(closure {σ, swap x (↑σ x)})
[PROOFSTEP]
rw [h6]
[GOAL]
case intro.intro.intro
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝² : DecidableEq α
inst✝¹ : Finite β
inst✝ : Fintype α
σ : Perm α
h1 : IsCycle σ
h2 : support σ = ⊤
x : α
H : Subgroup (Perm α) := closure {σ, swap x (↑σ x)}
h3 : σ ∈ H
h4 : swap x (↑σ x) ∈ H
step1 : ∀ (n : ℕ), swap (↑(σ ^ n) x) (↑(σ ^ (n + 1)) x) ∈ H
step2 : ∀ (n : ℕ), swap x (↑(σ ^ n) x) ∈ H
step3 : ∀ (y : α), swap x y ∈ H
step4 : ∀ (y z : α), swap y z ∈ H
τ : Perm α
y z : α
left✝ : y ≠ z
h6 : τ = swap y z
⊢ swap y z ∈ ↑(closure {σ, swap x (↑σ x)})
[PROOFSTEP]
exact step4 y z
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝² : DecidableEq α
inst✝¹ : Finite β
inst✝ : Fintype α
n : ℕ
σ : Perm α
h0 : Nat.coprime n (Fintype.card α)
h1 : IsCycle σ
h2 : support σ = univ
x : α
⊢ closure {σ, swap x (↑(σ ^ n) x)} = ⊤
[PROOFSTEP]
rw [← Finset.card_univ, ← h2, ← h1.orderOf] at h0 
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝² : DecidableEq α
inst✝¹ : Finite β
inst✝ : Fintype α
n : ℕ
σ : Perm α
h0 : Nat.coprime n (orderOf σ)
h1 : IsCycle σ
h2 : support σ = univ
x : α
⊢ closure {σ, swap x (↑(σ ^ n) x)} = ⊤
[PROOFSTEP]
cases' exists_pow_eq_self_of_coprime h0 with m hm
[GOAL]
case intro
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝² : DecidableEq α
inst✝¹ : Finite β
inst✝ : Fintype α
n : ℕ
σ : Perm α
h0 : Nat.coprime n (orderOf σ)
h1 : IsCycle σ
h2 : support σ = univ
x : α
m : ℕ
hm : (σ ^ n) ^ m = σ
⊢ closure {σ, swap x (↑(σ ^ n) x)} = ⊤
[PROOFSTEP]
have h2' : (σ ^ n).support = ⊤ := Eq.trans (support_pow_coprime h0) h2
[GOAL]
case intro
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝² : DecidableEq α
inst✝¹ : Finite β
inst✝ : Fintype α
n : ℕ
σ : Perm α
h0 : Nat.coprime n (orderOf σ)
h1 : IsCycle σ
h2 : support σ = univ
x : α
m : ℕ
hm : (σ ^ n) ^ m = σ
h2' : support (σ ^ n) = ⊤
⊢ closure {σ, swap x (↑(σ ^ n) x)} = ⊤
[PROOFSTEP]
have h1' : IsCycle ((σ ^ n) ^ (m : ℤ)) := by rwa [← hm] at h1 
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝² : DecidableEq α
inst✝¹ : Finite β
inst✝ : Fintype α
n : ℕ
σ : Perm α
h0 : Nat.coprime n (orderOf σ)
h1 : IsCycle σ
h2 : support σ = univ
x : α
m : ℕ
hm : (σ ^ n) ^ m = σ
h2' : support (σ ^ n) = ⊤
⊢ IsCycle ((σ ^ n) ^ ↑m)
[PROOFSTEP]
rwa [← hm] at h1 
[GOAL]
case intro
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝² : DecidableEq α
inst✝¹ : Finite β
inst✝ : Fintype α
n : ℕ
σ : Perm α
h0 : Nat.coprime n (orderOf σ)
h1 : IsCycle σ
h2 : support σ = univ
x : α
m : ℕ
hm : (σ ^ n) ^ m = σ
h2' : support (σ ^ n) = ⊤
h1' : IsCycle ((σ ^ n) ^ ↑m)
⊢ closure {σ, swap x (↑(σ ^ n) x)} = ⊤
[PROOFSTEP]
replace h1' : IsCycle (σ ^ n) := h1'.of_pow (le_trans (support_pow_le σ n) (ge_of_eq (congr_arg support hm)))
[GOAL]
case intro
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝² : DecidableEq α
inst✝¹ : Finite β
inst✝ : Fintype α
n : ℕ
σ : Perm α
h0 : Nat.coprime n (orderOf σ)
h1 : IsCycle σ
h2 : support σ = univ
x : α
m : ℕ
hm : (σ ^ n) ^ m = σ
h2' : support (σ ^ n) = ⊤
h1' : IsCycle (σ ^ n)
⊢ closure {σ, swap x (↑(σ ^ n) x)} = ⊤
[PROOFSTEP]
rw [eq_top_iff, ← closure_cycle_adjacent_swap h1' h2' x, closure_le, Set.insert_subset_iff]
[GOAL]
case intro
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝² : DecidableEq α
inst✝¹ : Finite β
inst✝ : Fintype α
n : ℕ
σ : Perm α
h0 : Nat.coprime n (orderOf σ)
h1 : IsCycle σ
h2 : support σ = univ
x : α
m : ℕ
hm : (σ ^ n) ^ m = σ
h2' : support (σ ^ n) = ⊤
h1' : IsCycle (σ ^ n)
⊢ σ ^ n ∈ ↑(closure {σ, swap x (↑(σ ^ n) x)}) ∧ {swap x (↑(σ ^ n) x)} ⊆ ↑(closure {σ, swap x (↑(σ ^ n) x)})
[PROOFSTEP]
exact
  ⟨Subgroup.pow_mem (closure _) (subset_closure (Set.mem_insert σ _)) n,
    Set.singleton_subset_iff.mpr (subset_closure (Set.mem_insert_of_mem _ (Set.mem_singleton _)))⟩
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝² : DecidableEq α
inst✝¹ : Finite β
inst✝ : Fintype α
σ τ : Perm α
h0 : Nat.Prime (Fintype.card α)
h1 : IsCycle σ
h2 : support σ = univ
h3 : IsSwap τ
⊢ closure {σ, τ} = ⊤
[PROOFSTEP]
obtain ⟨x, y, h4, h5⟩ := h3
[GOAL]
case intro.intro.intro
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝² : DecidableEq α
inst✝¹ : Finite β
inst✝ : Fintype α
σ τ : Perm α
h0 : Nat.Prime (Fintype.card α)
h1 : IsCycle σ
h2 : support σ = univ
x y : α
h4 : x ≠ y
h5 : τ = swap x y
⊢ closure {σ, τ} = ⊤
[PROOFSTEP]
obtain ⟨i, hi⟩ :=
  h1.exists_pow_eq (mem_support.mp ((Finset.ext_iff.mp h2 x).mpr (Finset.mem_univ x)))
    (mem_support.mp ((Finset.ext_iff.mp h2 y).mpr (Finset.mem_univ y)))
[GOAL]
case intro.intro.intro.intro
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝² : DecidableEq α
inst✝¹ : Finite β
inst✝ : Fintype α
σ τ : Perm α
h0 : Nat.Prime (Fintype.card α)
h1 : IsCycle σ
h2 : support σ = univ
x y : α
h4 : x ≠ y
h5 : τ = swap x y
i : ℕ
hi : ↑(σ ^ i) x = y
⊢ closure {σ, τ} = ⊤
[PROOFSTEP]
rw [h5, ← hi]
[GOAL]
case intro.intro.intro.intro
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝² : DecidableEq α
inst✝¹ : Finite β
inst✝ : Fintype α
σ τ : Perm α
h0 : Nat.Prime (Fintype.card α)
h1 : IsCycle σ
h2 : support σ = univ
x y : α
h4 : x ≠ y
h5 : τ = swap x y
i : ℕ
hi : ↑(σ ^ i) x = y
⊢ closure {σ, swap x (↑(σ ^ i) x)} = ⊤
[PROOFSTEP]
refine' closure_cycle_coprime_swap (Nat.coprime.symm (h0.coprime_iff_not_dvd.mpr fun h => h4 _)) h1 h2 x
[GOAL]
case intro.intro.intro.intro
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝² : DecidableEq α
inst✝¹ : Finite β
inst✝ : Fintype α
σ τ : Perm α
h0 : Nat.Prime (Fintype.card α)
h1 : IsCycle σ
h2 : support σ = univ
x y : α
h4 : x ≠ y
h5 : τ = swap x y
i : ℕ
hi : ↑(σ ^ i) x = y
h : Fintype.card α ∣ i
⊢ x = y
[PROOFSTEP]
cases' h with m hm
[GOAL]
case intro.intro.intro.intro.intro
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝² : DecidableEq α
inst✝¹ : Finite β
inst✝ : Fintype α
σ τ : Perm α
h0 : Nat.Prime (Fintype.card α)
h1 : IsCycle σ
h2 : support σ = univ
x y : α
h4 : x ≠ y
h5 : τ = swap x y
i : ℕ
hi : ↑(σ ^ i) x = y
m : ℕ
hm : i = Fintype.card α * m
⊢ x = y
[PROOFSTEP]
rwa [hm, pow_mul, ← Finset.card_univ, ← h2, ← h1.orderOf, pow_orderOf_eq_one, one_pow, one_apply] at hi 
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
σ τ : Perm α
f : { x // x ∈ ↑(support σ) } ≃ { x // x ∈ ↑(support τ) }
hf :
  ∀ (x : α) (hx : x ∈ ↑(support σ)),
    ↑(↑f { val := ↑σ x, property := (_ : ↑σ x ∈ support σ) }) = ↑τ ↑(↑f { val := x, property := hx })
⊢ IsConj σ τ
[PROOFSTEP]
refine' isConj_iff.2 ⟨Equiv.extendSubtype f, _⟩
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
σ τ : Perm α
f : { x // x ∈ ↑(support σ) } ≃ { x // x ∈ ↑(support τ) }
hf :
  ∀ (x : α) (hx : x ∈ ↑(support σ)),
    ↑(↑f { val := ↑σ x, property := (_ : ↑σ x ∈ support σ) }) = ↑τ ↑(↑f { val := x, property := hx })
⊢ extendSubtype f * σ * (extendSubtype f)⁻¹ = τ
[PROOFSTEP]
rw [mul_inv_eq_iff_eq_mul]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
σ τ : Perm α
f : { x // x ∈ ↑(support σ) } ≃ { x // x ∈ ↑(support τ) }
hf :
  ∀ (x : α) (hx : x ∈ ↑(support σ)),
    ↑(↑f { val := ↑σ x, property := (_ : ↑σ x ∈ support σ) }) = ↑τ ↑(↑f { val := x, property := hx })
⊢ extendSubtype f * σ = τ * extendSubtype f
[PROOFSTEP]
ext x
[GOAL]
case H
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
σ τ : Perm α
f : { x // x ∈ ↑(support σ) } ≃ { x // x ∈ ↑(support τ) }
hf :
  ∀ (x : α) (hx : x ∈ ↑(support σ)),
    ↑(↑f { val := ↑σ x, property := (_ : ↑σ x ∈ support σ) }) = ↑τ ↑(↑f { val := x, property := hx })
x : α
⊢ ↑(extendSubtype f * σ) x = ↑(τ * extendSubtype f) x
[PROOFSTEP]
simp only [Perm.mul_apply]
[GOAL]
case H
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
σ τ : Perm α
f : { x // x ∈ ↑(support σ) } ≃ { x // x ∈ ↑(support τ) }
hf :
  ∀ (x : α) (hx : x ∈ ↑(support σ)),
    ↑(↑f { val := ↑σ x, property := (_ : ↑σ x ∈ support σ) }) = ↑τ ↑(↑f { val := x, property := hx })
x : α
⊢ ↑(extendSubtype f) (↑σ x) = ↑τ (↑(extendSubtype f) x)
[PROOFSTEP]
by_cases hx : x ∈ σ.support
[GOAL]
case pos
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
σ τ : Perm α
f : { x // x ∈ ↑(support σ) } ≃ { x // x ∈ ↑(support τ) }
hf :
  ∀ (x : α) (hx : x ∈ ↑(support σ)),
    ↑(↑f { val := ↑σ x, property := (_ : ↑σ x ∈ support σ) }) = ↑τ ↑(↑f { val := x, property := hx })
x : α
hx : x ∈ support σ
⊢ ↑(extendSubtype f) (↑σ x) = ↑τ (↑(extendSubtype f) x)
[PROOFSTEP]
rw [Equiv.extendSubtype_apply_of_mem, Equiv.extendSubtype_apply_of_mem]
[GOAL]
case pos
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
σ τ : Perm α
f : { x // x ∈ ↑(support σ) } ≃ { x // x ∈ ↑(support τ) }
hf :
  ∀ (x : α) (hx : x ∈ ↑(support σ)),
    ↑(↑f { val := ↑σ x, property := (_ : ↑σ x ∈ support σ) }) = ↑τ ↑(↑f { val := x, property := hx })
x : α
hx : x ∈ support σ
⊢ ↑(↑f { val := ↑σ x, property := ?pos.hx✝ }) = ↑τ ↑(↑f { val := x, property := ?pos.hx✝ })
[PROOFSTEP]
exact hf x (Finset.mem_coe.2 hx)
[GOAL]
case neg
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
σ τ : Perm α
f : { x // x ∈ ↑(support σ) } ≃ { x // x ∈ ↑(support τ) }
hf :
  ∀ (x : α) (hx : x ∈ ↑(support σ)),
    ↑(↑f { val := ↑σ x, property := (_ : ↑σ x ∈ support σ) }) = ↑τ ↑(↑f { val := x, property := hx })
x : α
hx : ¬x ∈ support σ
⊢ ↑(extendSubtype f) (↑σ x) = ↑τ (↑(extendSubtype f) x)
[PROOFSTEP]
rwa [Classical.not_not.1 ((not_congr mem_support).1 (Equiv.extendSubtype_not_mem f _ _)),
  Classical.not_not.1 ((not_congr mem_support).mp hx)]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
σ τ : Perm α
hσ : IsCycle σ
hτ : IsCycle τ
h : card (support σ) = card (support τ)
⊢ IsConj σ τ
[PROOFSTEP]
refine'
  isConj_of_support_equiv
    (hσ.zpowersEquivSupport.symm.trans <|
      (zpowersEquivZpowers <| by rw [hσ.orderOf, h, hτ.orderOf]).trans hτ.zpowersEquivSupport)
    _
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
σ τ : Perm α
hσ : IsCycle σ
hτ : IsCycle τ
h : card (support σ) = card (support τ)
⊢ orderOf σ = orderOf τ
[PROOFSTEP]
rw [hσ.orderOf, h, hτ.orderOf]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
σ τ : Perm α
hσ : IsCycle σ
hτ : IsCycle τ
h : card (support σ) = card (support τ)
⊢ ∀ (x : α) (hx : x ∈ ↑(support σ)),
    ↑(↑((zpowersEquivSupport hσ).symm.trans
              ((zpowersEquivZpowers (_ : orderOf σ = orderOf τ)).trans (zpowersEquivSupport hτ)))
          { val := ↑σ x, property := (_ : ↑σ x ∈ support σ) }) =
      ↑τ
        ↑(↑((zpowersEquivSupport hσ).symm.trans
                ((zpowersEquivZpowers (_ : orderOf σ = orderOf τ)).trans (zpowersEquivSupport hτ)))
            { val := x, property := hx })
[PROOFSTEP]
intro x hx
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
σ τ : Perm α
hσ : IsCycle σ
hτ : IsCycle τ
h : card (support σ) = card (support τ)
x : α
hx : x ∈ ↑(support σ)
⊢ ↑(↑((zpowersEquivSupport hσ).symm.trans
            ((zpowersEquivZpowers (_ : orderOf σ = orderOf τ)).trans (zpowersEquivSupport hτ)))
        { val := ↑σ x, property := (_ : ↑σ x ∈ support σ) }) =
    ↑τ
      ↑(↑((zpowersEquivSupport hσ).symm.trans
              ((zpowersEquivZpowers (_ : orderOf σ = orderOf τ)).trans (zpowersEquivSupport hτ)))
          { val := x, property := hx })
[PROOFSTEP]
simp only [Perm.mul_apply, Equiv.trans_apply, Equiv.sumCongr_apply]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
σ τ : Perm α
hσ : IsCycle σ
hτ : IsCycle τ
h : card (support σ) = card (support τ)
x : α
hx : x ∈ ↑(support σ)
⊢ ↑(↑(zpowersEquivSupport hτ)
        (↑(zpowersEquivZpowers (_ : orderOf σ = orderOf τ))
          (↑(zpowersEquivSupport hσ).symm { val := ↑σ x, property := (_ : ↑σ x ∈ support σ) }))) =
    ↑τ
      ↑(↑(zpowersEquivSupport hτ)
          (↑(zpowersEquivZpowers (_ : orderOf σ = orderOf τ))
            (↑(zpowersEquivSupport hσ).symm { val := x, property := hx })))
[PROOFSTEP]
obtain ⟨n, rfl⟩ := hσ.exists_pow_eq (Classical.choose_spec hσ).1 (mem_support.1 hx)
[GOAL]
case intro
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
σ τ : Perm α
hσ : IsCycle σ
hτ : IsCycle τ
h : card (support σ) = card (support τ)
n : ℕ
hx : ↑(σ ^ n) (Classical.choose hσ) ∈ ↑(support σ)
⊢ ↑(↑(zpowersEquivSupport hτ)
        (↑(zpowersEquivZpowers (_ : orderOf σ = orderOf τ))
          (↑(zpowersEquivSupport hσ).symm
            { val := ↑σ (↑(σ ^ n) (Classical.choose hσ)),
              property := (_ : ↑σ (↑(σ ^ n) (Classical.choose hσ)) ∈ support σ) }))) =
    ↑τ
      ↑(↑(zpowersEquivSupport hτ)
          (↑(zpowersEquivZpowers (_ : orderOf σ = orderOf τ))
            (↑(zpowersEquivSupport hσ).symm { val := ↑(σ ^ n) (Classical.choose hσ), property := hx })))
[PROOFSTEP]
apply Eq.trans _ (congr rfl (congr rfl (congr rfl (congr rfl (hσ.zpowersEquivSupport_symm_apply n).symm))))
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
σ τ : Perm α
hσ : IsCycle σ
hτ : IsCycle τ
h : card (support σ) = card (support τ)
n : ℕ
hx : ↑(σ ^ n) (Classical.choose hσ) ∈ ↑(support σ)
⊢ ↑(↑(zpowersEquivSupport hτ)
        (↑(zpowersEquivZpowers (_ : orderOf σ = orderOf τ))
          (↑(zpowersEquivSupport hσ).symm
            { val := ↑σ (↑(σ ^ n) (Classical.choose hσ)),
              property := (_ : ↑σ (↑(σ ^ n) (Classical.choose hσ)) ∈ support σ) }))) =
    ↑τ
      ↑(↑(zpowersEquivSupport hτ)
          (↑(zpowersEquivZpowers (_ : orderOf σ = orderOf τ))
            { val := σ ^ n, property := (_ : ∃ y, (fun x x_1 => x ^ x_1) σ y = σ ^ n) }))
[PROOFSTEP]
apply (congr rfl (congr rfl (congr rfl (hσ.zpowersEquivSupport_symm_apply (n + 1))))).trans _
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
σ τ : Perm α
hσ : IsCycle σ
hτ : IsCycle τ
h : card (support σ) = card (support τ)
n : ℕ
hx : ↑(σ ^ n) (Classical.choose hσ) ∈ ↑(support σ)
⊢ ↑(↑(zpowersEquivSupport hτ)
        (↑(zpowersEquivZpowers (_ : orderOf σ = orderOf τ))
          { val := σ ^ (n + 1), property := (_ : ∃ y, (fun x x_1 => x ^ x_1) σ y = σ ^ (n + 1)) })) =
    ↑τ
      ↑(↑(zpowersEquivSupport hτ)
          (↑(zpowersEquivZpowers (_ : orderOf σ = orderOf τ))
            { val := σ ^ n, property := (_ : ∃ y, (fun x x_1 => x ^ x_1) σ y = σ ^ n) }))
[PROOFSTEP]
simp only [Ne.def, IsCycle.zpowersEquivSupport_apply, Subtype.coe_mk, zpowersEquivZpowers_apply]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
σ τ : Perm α
hσ : IsCycle σ
hτ : IsCycle τ
h : card (support σ) = card (support τ)
n : ℕ
hx : ↑(σ ^ n) (Classical.choose hσ) ∈ ↑(support σ)
⊢ ↑(↑(zpowersEquivSupport hτ) { val := τ ^ (n + 1), property := (_ : ∃ y, (fun x x_1 => x ^ x_1) τ y = τ ^ (n + 1)) }) =
    ↑τ ↑(↑(zpowersEquivSupport hτ) { val := τ ^ n, property := (_ : ∃ y, (fun x x_1 => x ^ x_1) τ y = τ ^ n) })
[PROOFSTEP]
dsimp
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
σ τ : Perm α
hσ : IsCycle σ
hτ : IsCycle τ
h : card (support σ) = card (support τ)
n : ℕ
hx : ↑(σ ^ n) (Classical.choose hσ) ∈ ↑(support σ)
⊢ ↑(τ ^ (n + 1)) (Classical.choose hτ) = ↑τ (↑(τ ^ n) (Classical.choose hτ))
[PROOFSTEP]
rw [pow_succ, Perm.mul_apply]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
σ τ : Perm α
hσ : IsCycle σ
hτ : IsCycle τ
⊢ IsConj σ τ → card (support σ) = card (support τ)
[PROOFSTEP]
intro h
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
σ τ : Perm α
hσ : IsCycle σ
hτ : IsCycle τ
h : IsConj σ τ
⊢ card (support σ) = card (support τ)
[PROOFSTEP]
obtain ⟨π, rfl⟩ := (_root_.isConj_iff).1 h
[GOAL]
case intro
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
σ : Perm α
hσ : IsCycle σ
π : Perm α
hτ : IsCycle (π * σ * π⁻¹)
h : IsConj σ (π * σ * π⁻¹)
⊢ card (support σ) = card (support (π * σ * π⁻¹))
[PROOFSTEP]
refine' Finset.card_congr (fun a _ => π a) (fun _ ha => _) (fun _ _ _ _ ab => π.injective ab) fun b hb => _
[GOAL]
case intro.refine'_1
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
σ : Perm α
hσ : IsCycle σ
π : Perm α
hτ : IsCycle (π * σ * π⁻¹)
h : IsConj σ (π * σ * π⁻¹)
x✝ : α
ha : x✝ ∈ support σ
⊢ (fun a x => ↑π a) x✝ ha ∈ support (π * σ * π⁻¹)
[PROOFSTEP]
simp [mem_support.1 ha]
[GOAL]
case intro.refine'_2
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
σ : Perm α
hσ : IsCycle σ
π : Perm α
hτ : IsCycle (π * σ * π⁻¹)
h : IsConj σ (π * σ * π⁻¹)
b : α
hb : b ∈ support (π * σ * π⁻¹)
⊢ ∃ a ha, (fun a x => ↑π a) a ha = b
[PROOFSTEP]
refine' ⟨π⁻¹ b, ⟨_, π.apply_inv_self b⟩⟩
[GOAL]
case intro.refine'_2
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
σ : Perm α
hσ : IsCycle σ
π : Perm α
hτ : IsCycle (π * σ * π⁻¹)
h : IsConj σ (π * σ * π⁻¹)
b : α
hb : b ∈ support (π * σ * π⁻¹)
⊢ ↑π⁻¹ b ∈ support σ
[PROOFSTEP]
contrapose! hb
[GOAL]
case intro.refine'_2
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
σ : Perm α
hσ : IsCycle σ
π : Perm α
hτ : IsCycle (π * σ * π⁻¹)
h : IsConj σ (π * σ * π⁻¹)
b : α
hb : ¬↑π⁻¹ b ∈ support σ
⊢ ¬b ∈ support (π * σ * π⁻¹)
[PROOFSTEP]
rw [mem_support, Classical.not_not] at hb 
[GOAL]
case intro.refine'_2
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
σ : Perm α
hσ : IsCycle σ
π : Perm α
hτ : IsCycle (π * σ * π⁻¹)
h : IsConj σ (π * σ * π⁻¹)
b : α
hb : ↑σ (↑π⁻¹ b) = ↑π⁻¹ b
⊢ ¬b ∈ support (π * σ * π⁻¹)
[PROOFSTEP]
rw [mem_support, Classical.not_not, Perm.mul_apply, Perm.mul_apply, hb, Perm.apply_inv_self]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
σ τ : Perm α
⊢ support (σ * τ * σ⁻¹) = map (Equiv.toEmbedding σ) (support τ)
[PROOFSTEP]
ext
[GOAL]
case a
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
σ τ : Perm α
a✝ : α
⊢ a✝ ∈ support (σ * τ * σ⁻¹) ↔ a✝ ∈ map (Equiv.toEmbedding σ) (support τ)
[PROOFSTEP]
simp only [mem_map_equiv, Perm.coe_mul, Function.comp_apply, Ne.def, Perm.mem_support, Equiv.eq_symm_apply]
[GOAL]
case a
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
σ τ : Perm α
a✝ : α
⊢ ¬↑σ (↑τ (↑σ⁻¹ a✝)) = a✝ ↔ ¬↑σ (↑τ (↑σ.symm a✝)) = a✝
[PROOFSTEP]
rfl
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ : DecidableEq α
inst✝ : Fintype α
σ τ : Perm α
⊢ card (support (σ * τ * σ⁻¹)) = card (support τ)
[PROOFSTEP]
simp
[GOAL]
ι : Type u_1
α✝ : Type u_2
β : Type u_3
inst✝² : DecidableEq α✝
inst✝¹ : Fintype α✝
σ✝ τ✝ : Perm α✝
α : Type u_4
inst✝ : Finite α
σ τ π ρ : Perm α
hc1 : IsConj σ π
hc2 : IsConj τ ρ
hd1 : Disjoint σ τ
hd2 : Disjoint π ρ
⊢ IsConj (σ * τ) (π * ρ)
[PROOFSTEP]
classical
cases nonempty_fintype α
obtain ⟨f, rfl⟩ := isConj_iff.1 hc1
obtain ⟨g, rfl⟩ := isConj_iff.1 hc2
have hd1' := coe_inj.2 hd1.support_mul
have hd2' := coe_inj.2 hd2.support_mul
rw [coe_union] at *
have hd1'' := disjoint_coe.2 (disjoint_iff_disjoint_support.1 hd1)
have hd2'' := disjoint_coe.2 (disjoint_iff_disjoint_support.1 hd2)
refine' isConj_of_support_equiv _ _
·
  refine'
      ((Equiv.Set.ofEq hd1').trans (Equiv.Set.union hd1''.le_bot)).trans
        ((Equiv.sumCongr (subtypeEquiv f fun a => _) (subtypeEquiv g fun a => _)).trans
          ((Equiv.Set.ofEq hd2').trans (Equiv.Set.union hd2''.le_bot)).symm) <;>
    · simp only [Set.mem_image, toEmbedding_apply, exists_eq_right, support_conj, coe_map, apply_eq_iff_eq]
· intro x hx
  simp only [trans_apply, symm_trans_apply, Equiv.Set.ofEq_apply, Equiv.Set.ofEq_symm_apply, Equiv.sumCongr_apply]
  rw [hd1', Set.mem_union] at hx 
  cases' hx with hxσ hxτ
  · rw [mem_coe, mem_support] at hxσ 
    rw [Set.union_apply_left hd1''.le_bot _, Set.union_apply_left hd1''.le_bot _]
    simp only [subtypeEquiv_apply, Perm.coe_mul, Sum.map_inl, comp_apply, Set.union_symm_apply_left, Subtype.coe_mk,
      apply_eq_iff_eq]
    · have h := (hd2 (f x)).resolve_left ?_
      · rw [mul_apply, mul_apply] at h 
        rw [h, inv_apply_self, (hd1 x).resolve_left hxσ]
      · rwa [mul_apply, mul_apply, inv_apply_self, apply_eq_iff_eq]
    · rwa [Subtype.coe_mk, Perm.mul_apply, (hd1 x).resolve_left hxσ, mem_coe, apply_mem_support, mem_support]
    · rwa [Subtype.coe_mk, mem_coe, mem_support]
  · rw [mem_coe, ← apply_mem_support, mem_support] at hxτ 
    rw [Set.union_apply_right hd1''.le_bot _, Set.union_apply_right hd1''.le_bot _]
    simp only [subtypeEquiv_apply, Perm.coe_mul, Sum.map_inr, comp_apply, Set.union_symm_apply_right, Subtype.coe_mk,
      apply_eq_iff_eq]
    · have h := (hd2 (g (τ x))).resolve_right ?_
      · rw [mul_apply, mul_apply] at h 
        rw [inv_apply_self, h, (hd1 (τ x)).resolve_right hxτ]
      · rwa [mul_apply, mul_apply, inv_apply_self, apply_eq_iff_eq]
    · rwa [Subtype.coe_mk, Perm.mul_apply, (hd1 (τ x)).resolve_right hxτ, mem_coe, mem_support]
    · rwa [Subtype.coe_mk, mem_coe, ← apply_mem_support, mem_support]
[GOAL]
ι : Type u_1
α✝ : Type u_2
β : Type u_3
inst✝² : DecidableEq α✝
inst✝¹ : Fintype α✝
σ✝ τ✝ : Perm α✝
α : Type u_4
inst✝ : Finite α
σ τ π ρ : Perm α
hc1 : IsConj σ π
hc2 : IsConj τ ρ
hd1 : Disjoint σ τ
hd2 : Disjoint π ρ
⊢ IsConj (σ * τ) (π * ρ)
[PROOFSTEP]
cases nonempty_fintype α
[GOAL]
case intro
ι : Type u_1
α✝ : Type u_2
β : Type u_3
inst✝² : DecidableEq α✝
inst✝¹ : Fintype α✝
σ✝ τ✝ : Perm α✝
α : Type u_4
inst✝ : Finite α
σ τ π ρ : Perm α
hc1 : IsConj σ π
hc2 : IsConj τ ρ
hd1 : Disjoint σ τ
hd2 : Disjoint π ρ
val✝ : Fintype α
⊢ IsConj (σ * τ) (π * ρ)
[PROOFSTEP]
obtain ⟨f, rfl⟩ := isConj_iff.1 hc1
[GOAL]
case intro.intro
ι : Type u_1
α✝ : Type u_2
β : Type u_3
inst✝² : DecidableEq α✝
inst✝¹ : Fintype α✝
σ✝ τ✝ : Perm α✝
α : Type u_4
inst✝ : Finite α
σ τ ρ : Perm α
hc2 : IsConj τ ρ
hd1 : Disjoint σ τ
val✝ : Fintype α
f : Perm α
hc1 : IsConj σ (f * σ * f⁻¹)
hd2 : Disjoint (f * σ * f⁻¹) ρ
⊢ IsConj (σ * τ) (f * σ * f⁻¹ * ρ)
[PROOFSTEP]
obtain ⟨g, rfl⟩ := isConj_iff.1 hc2
[GOAL]
case intro.intro.intro
ι : Type u_1
α✝ : Type u_2
β : Type u_3
inst✝² : DecidableEq α✝
inst✝¹ : Fintype α✝
σ✝ τ✝ : Perm α✝
α : Type u_4
inst✝ : Finite α
σ τ : Perm α
hd1 : Disjoint σ τ
val✝ : Fintype α
f : Perm α
hc1 : IsConj σ (f * σ * f⁻¹)
g : Perm α
hc2 : IsConj τ (g * τ * g⁻¹)
hd2 : Disjoint (f * σ * f⁻¹) (g * τ * g⁻¹)
⊢ IsConj (σ * τ) (f * σ * f⁻¹ * (g * τ * g⁻¹))
[PROOFSTEP]
have hd1' := coe_inj.2 hd1.support_mul
[GOAL]
case intro.intro.intro
ι : Type u_1
α✝ : Type u_2
β : Type u_3
inst✝² : DecidableEq α✝
inst✝¹ : Fintype α✝
σ✝ τ✝ : Perm α✝
α : Type u_4
inst✝ : Finite α
σ τ : Perm α
hd1 : Disjoint σ τ
val✝ : Fintype α
f : Perm α
hc1 : IsConj σ (f * σ * f⁻¹)
g : Perm α
hc2 : IsConj τ (g * τ * g⁻¹)
hd2 : Disjoint (f * σ * f⁻¹) (g * τ * g⁻¹)
hd1' : ↑(support (σ * τ)) = ↑(support σ ∪ support τ)
⊢ IsConj (σ * τ) (f * σ * f⁻¹ * (g * τ * g⁻¹))
[PROOFSTEP]
have hd2' := coe_inj.2 hd2.support_mul
[GOAL]
case intro.intro.intro
ι : Type u_1
α✝ : Type u_2
β : Type u_3
inst✝² : DecidableEq α✝
inst✝¹ : Fintype α✝
σ✝ τ✝ : Perm α✝
α : Type u_4
inst✝ : Finite α
σ τ : Perm α
hd1 : Disjoint σ τ
val✝ : Fintype α
f : Perm α
hc1 : IsConj σ (f * σ * f⁻¹)
g : Perm α
hc2 : IsConj τ (g * τ * g⁻¹)
hd2 : Disjoint (f * σ * f⁻¹) (g * τ * g⁻¹)
hd1' : ↑(support (σ * τ)) = ↑(support σ ∪ support τ)
hd2' : ↑(support (f * σ * f⁻¹ * (g * τ * g⁻¹))) = ↑(support (f * σ * f⁻¹) ∪ support (g * τ * g⁻¹))
⊢ IsConj (σ * τ) (f * σ * f⁻¹ * (g * τ * g⁻¹))
[PROOFSTEP]
rw [coe_union] at *
[GOAL]
case intro.intro.intro
ι : Type u_1
α✝ : Type u_2
β : Type u_3
inst✝² : DecidableEq α✝
inst✝¹ : Fintype α✝
σ✝ τ✝ : Perm α✝
α : Type u_4
inst✝ : Finite α
σ τ : Perm α
hd1 : Disjoint σ τ
val✝ : Fintype α
f : Perm α
hc1 : IsConj σ (f * σ * f⁻¹)
g : Perm α
hc2 : IsConj τ (g * τ * g⁻¹)
hd2 : Disjoint (f * σ * f⁻¹) (g * τ * g⁻¹)
hd1' : ↑(support (σ * τ)) = ↑(support σ) ∪ ↑(support τ)
hd2' : ↑(support (f * σ * f⁻¹ * (g * τ * g⁻¹))) = ↑(support (f * σ * f⁻¹)) ∪ ↑(support (g * τ * g⁻¹))
⊢ IsConj (σ * τ) (f * σ * f⁻¹ * (g * τ * g⁻¹))
[PROOFSTEP]
have hd1'' := disjoint_coe.2 (disjoint_iff_disjoint_support.1 hd1)
[GOAL]
case intro.intro.intro
ι : Type u_1
α✝ : Type u_2
β : Type u_3
inst✝² : DecidableEq α✝
inst✝¹ : Fintype α✝
σ✝ τ✝ : Perm α✝
α : Type u_4
inst✝ : Finite α
σ τ : Perm α
hd1 : Disjoint σ τ
val✝ : Fintype α
f : Perm α
hc1 : IsConj σ (f * σ * f⁻¹)
g : Perm α
hc2 : IsConj τ (g * τ * g⁻¹)
hd2 : Disjoint (f * σ * f⁻¹) (g * τ * g⁻¹)
hd1' : ↑(support (σ * τ)) = ↑(support σ) ∪ ↑(support τ)
hd2' : ↑(support (f * σ * f⁻¹ * (g * τ * g⁻¹))) = ↑(support (f * σ * f⁻¹)) ∪ ↑(support (g * τ * g⁻¹))
hd1'' : _root_.Disjoint ↑(support σ) ↑(support τ)
⊢ IsConj (σ * τ) (f * σ * f⁻¹ * (g * τ * g⁻¹))
[PROOFSTEP]
have hd2'' := disjoint_coe.2 (disjoint_iff_disjoint_support.1 hd2)
[GOAL]
case intro.intro.intro
ι : Type u_1
α✝ : Type u_2
β : Type u_3
inst✝² : DecidableEq α✝
inst✝¹ : Fintype α✝
σ✝ τ✝ : Perm α✝
α : Type u_4
inst✝ : Finite α
σ τ : Perm α
hd1 : Disjoint σ τ
val✝ : Fintype α
f : Perm α
hc1 : IsConj σ (f * σ * f⁻¹)
g : Perm α
hc2 : IsConj τ (g * τ * g⁻¹)
hd2 : Disjoint (f * σ * f⁻¹) (g * τ * g⁻¹)
hd1' : ↑(support (σ * τ)) = ↑(support σ) ∪ ↑(support τ)
hd2' : ↑(support (f * σ * f⁻¹ * (g * τ * g⁻¹))) = ↑(support (f * σ * f⁻¹)) ∪ ↑(support (g * τ * g⁻¹))
hd1'' : _root_.Disjoint ↑(support σ) ↑(support τ)
hd2'' : _root_.Disjoint ↑(support (f * σ * f⁻¹)) ↑(support (g * τ * g⁻¹))
⊢ IsConj (σ * τ) (f * σ * f⁻¹ * (g * τ * g⁻¹))
[PROOFSTEP]
refine' isConj_of_support_equiv _ _
[GOAL]
case intro.intro.intro.refine'_1
ι : Type u_1
α✝ : Type u_2
β : Type u_3
inst✝² : DecidableEq α✝
inst✝¹ : Fintype α✝
σ✝ τ✝ : Perm α✝
α : Type u_4
inst✝ : Finite α
σ τ : Perm α
hd1 : Disjoint σ τ
val✝ : Fintype α
f : Perm α
hc1 : IsConj σ (f * σ * f⁻¹)
g : Perm α
hc2 : IsConj τ (g * τ * g⁻¹)
hd2 : Disjoint (f * σ * f⁻¹) (g * τ * g⁻¹)
hd1' : ↑(support (σ * τ)) = ↑(support σ) ∪ ↑(support τ)
hd2' : ↑(support (f * σ * f⁻¹ * (g * τ * g⁻¹))) = ↑(support (f * σ * f⁻¹)) ∪ ↑(support (g * τ * g⁻¹))
hd1'' : _root_.Disjoint ↑(support σ) ↑(support τ)
hd2'' : _root_.Disjoint ↑(support (f * σ * f⁻¹)) ↑(support (g * τ * g⁻¹))
⊢ { x // x ∈ ↑(support (σ * τ)) } ≃ { x // x ∈ ↑(support (f * σ * f⁻¹ * (g * τ * g⁻¹))) }
[PROOFSTEP]
refine'
  ((Equiv.Set.ofEq hd1').trans (Equiv.Set.union hd1''.le_bot)).trans
    ((Equiv.sumCongr (subtypeEquiv f fun a => _) (subtypeEquiv g fun a => _)).trans
      ((Equiv.Set.ofEq hd2').trans (Equiv.Set.union hd2''.le_bot)).symm)
[GOAL]
case intro.intro.intro.refine'_1.refine'_1
ι : Type u_1
α✝ : Type u_2
β : Type u_3
inst✝² : DecidableEq α✝
inst✝¹ : Fintype α✝
σ✝ τ✝ : Perm α✝
α : Type u_4
inst✝ : Finite α
σ τ : Perm α
hd1 : Disjoint σ τ
val✝ : Fintype α
f : Perm α
hc1 : IsConj σ (f * σ * f⁻¹)
g : Perm α
hc2 : IsConj τ (g * τ * g⁻¹)
hd2 : Disjoint (f * σ * f⁻¹) (g * τ * g⁻¹)
hd1' : ↑(support (σ * τ)) = ↑(support σ) ∪ ↑(support τ)
hd2' : ↑(support (f * σ * f⁻¹ * (g * τ * g⁻¹))) = ↑(support (f * σ * f⁻¹)) ∪ ↑(support (g * τ * g⁻¹))
hd1'' : _root_.Disjoint ↑(support σ) ↑(support τ)
hd2'' : _root_.Disjoint ↑(support (f * σ * f⁻¹)) ↑(support (g * τ * g⁻¹))
a : α
⊢ a ∈ ↑(support σ) ↔ ↑f a ∈ ↑(support (f * σ * f⁻¹))
[PROOFSTEP]
simp only [Set.mem_image, toEmbedding_apply, exists_eq_right, support_conj, coe_map, apply_eq_iff_eq]
[GOAL]
case intro.intro.intro.refine'_1.refine'_2
ι : Type u_1
α✝ : Type u_2
β : Type u_3
inst✝² : DecidableEq α✝
inst✝¹ : Fintype α✝
σ✝ τ✝ : Perm α✝
α : Type u_4
inst✝ : Finite α
σ τ : Perm α
hd1 : Disjoint σ τ
val✝ : Fintype α
f : Perm α
hc1 : IsConj σ (f * σ * f⁻¹)
g : Perm α
hc2 : IsConj τ (g * τ * g⁻¹)
hd2 : Disjoint (f * σ * f⁻¹) (g * τ * g⁻¹)
hd1' : ↑(support (σ * τ)) = ↑(support σ) ∪ ↑(support τ)
hd2' : ↑(support (f * σ * f⁻¹ * (g * τ * g⁻¹))) = ↑(support (f * σ * f⁻¹)) ∪ ↑(support (g * τ * g⁻¹))
hd1'' : _root_.Disjoint ↑(support σ) ↑(support τ)
hd2'' : _root_.Disjoint ↑(support (f * σ * f⁻¹)) ↑(support (g * τ * g⁻¹))
a : α
⊢ a ∈ ↑(support τ) ↔ ↑g a ∈ ↑(support (g * τ * g⁻¹))
[PROOFSTEP]
simp only [Set.mem_image, toEmbedding_apply, exists_eq_right, support_conj, coe_map, apply_eq_iff_eq]
[GOAL]
case intro.intro.intro.refine'_2
ι : Type u_1
α✝ : Type u_2
β : Type u_3
inst✝² : DecidableEq α✝
inst✝¹ : Fintype α✝
σ✝ τ✝ : Perm α✝
α : Type u_4
inst✝ : Finite α
σ τ : Perm α
hd1 : Disjoint σ τ
val✝ : Fintype α
f : Perm α
hc1 : IsConj σ (f * σ * f⁻¹)
g : Perm α
hc2 : IsConj τ (g * τ * g⁻¹)
hd2 : Disjoint (f * σ * f⁻¹) (g * τ * g⁻¹)
hd1' : ↑(support (σ * τ)) = ↑(support σ) ∪ ↑(support τ)
hd2' : ↑(support (f * σ * f⁻¹ * (g * τ * g⁻¹))) = ↑(support (f * σ * f⁻¹)) ∪ ↑(support (g * τ * g⁻¹))
hd1'' : _root_.Disjoint ↑(support σ) ↑(support τ)
hd2'' : _root_.Disjoint ↑(support (f * σ * f⁻¹)) ↑(support (g * τ * g⁻¹))
⊢ ∀ (x : α) (hx : x ∈ ↑(support (σ * τ))),
    ↑(↑(((Set.ofEq hd1').trans (Set.union (_ : ↑(support σ) ⊓ ↑(support τ) ≤ ⊥))).trans
              ((Equiv.sumCongr (subtypeEquiv f (_ : ∀ (a : α), a ∈ ↑(support σ) ↔ ↑f a ∈ ↑(support (f * σ * f⁻¹))))
                    (subtypeEquiv g (_ : ∀ (a : α), a ∈ ↑(support τ) ↔ ↑g a ∈ ↑(support (g * τ * g⁻¹))))).trans
                ((Set.ofEq hd2').trans (Set.union (_ : ↑(support (f * σ * f⁻¹)) ⊓ ↑(support (g * τ * g⁻¹)) ≤ ⊥))).symm))
          { val := ↑(σ * τ) x, property := (_ : ↑(σ * τ) x ∈ support (σ * τ)) }) =
      ↑(f * σ * f⁻¹ * (g * τ * g⁻¹))
        ↑(↑(((Set.ofEq hd1').trans (Set.union (_ : ↑(support σ) ⊓ ↑(support τ) ≤ ⊥))).trans
                ((Equiv.sumCongr (subtypeEquiv f (_ : ∀ (a : α), a ∈ ↑(support σ) ↔ ↑f a ∈ ↑(support (f * σ * f⁻¹))))
                      (subtypeEquiv g (_ : ∀ (a : α), a ∈ ↑(support τ) ↔ ↑g a ∈ ↑(support (g * τ * g⁻¹))))).trans
                  ((Set.ofEq hd2').trans
                      (Set.union (_ : ↑(support (f * σ * f⁻¹)) ⊓ ↑(support (g * τ * g⁻¹)) ≤ ⊥))).symm))
            { val := x, property := hx })
[PROOFSTEP]
intro x hx
[GOAL]
case intro.intro.intro.refine'_2
ι : Type u_1
α✝ : Type u_2
β : Type u_3
inst✝² : DecidableEq α✝
inst✝¹ : Fintype α✝
σ✝ τ✝ : Perm α✝
α : Type u_4
inst✝ : Finite α
σ τ : Perm α
hd1 : Disjoint σ τ
val✝ : Fintype α
f : Perm α
hc1 : IsConj σ (f * σ * f⁻¹)
g : Perm α
hc2 : IsConj τ (g * τ * g⁻¹)
hd2 : Disjoint (f * σ * f⁻¹) (g * τ * g⁻¹)
hd1' : ↑(support (σ * τ)) = ↑(support σ) ∪ ↑(support τ)
hd2' : ↑(support (f * σ * f⁻¹ * (g * τ * g⁻¹))) = ↑(support (f * σ * f⁻¹)) ∪ ↑(support (g * τ * g⁻¹))
hd1'' : _root_.Disjoint ↑(support σ) ↑(support τ)
hd2'' : _root_.Disjoint ↑(support (f * σ * f⁻¹)) ↑(support (g * τ * g⁻¹))
x : α
hx : x ∈ ↑(support (σ * τ))
⊢ ↑(↑(((Set.ofEq hd1').trans (Set.union (_ : ↑(support σ) ⊓ ↑(support τ) ≤ ⊥))).trans
            ((Equiv.sumCongr (subtypeEquiv f (_ : ∀ (a : α), a ∈ ↑(support σ) ↔ ↑f a ∈ ↑(support (f * σ * f⁻¹))))
                  (subtypeEquiv g (_ : ∀ (a : α), a ∈ ↑(support τ) ↔ ↑g a ∈ ↑(support (g * τ * g⁻¹))))).trans
              ((Set.ofEq hd2').trans (Set.union (_ : ↑(support (f * σ * f⁻¹)) ⊓ ↑(support (g * τ * g⁻¹)) ≤ ⊥))).symm))
        { val := ↑(σ * τ) x, property := (_ : ↑(σ * τ) x ∈ support (σ * τ)) }) =
    ↑(f * σ * f⁻¹ * (g * τ * g⁻¹))
      ↑(↑(((Set.ofEq hd1').trans (Set.union (_ : ↑(support σ) ⊓ ↑(support τ) ≤ ⊥))).trans
              ((Equiv.sumCongr (subtypeEquiv f (_ : ∀ (a : α), a ∈ ↑(support σ) ↔ ↑f a ∈ ↑(support (f * σ * f⁻¹))))
                    (subtypeEquiv g (_ : ∀ (a : α), a ∈ ↑(support τ) ↔ ↑g a ∈ ↑(support (g * τ * g⁻¹))))).trans
                ((Set.ofEq hd2').trans (Set.union (_ : ↑(support (f * σ * f⁻¹)) ⊓ ↑(support (g * τ * g⁻¹)) ≤ ⊥))).symm))
          { val := x, property := hx })
[PROOFSTEP]
simp only [trans_apply, symm_trans_apply, Equiv.Set.ofEq_apply, Equiv.Set.ofEq_symm_apply, Equiv.sumCongr_apply]
[GOAL]
case intro.intro.intro.refine'_2
ι : Type u_1
α✝ : Type u_2
β : Type u_3
inst✝² : DecidableEq α✝
inst✝¹ : Fintype α✝
σ✝ τ✝ : Perm α✝
α : Type u_4
inst✝ : Finite α
σ τ : Perm α
hd1 : Disjoint σ τ
val✝ : Fintype α
f : Perm α
hc1 : IsConj σ (f * σ * f⁻¹)
g : Perm α
hc2 : IsConj τ (g * τ * g⁻¹)
hd2 : Disjoint (f * σ * f⁻¹) (g * τ * g⁻¹)
hd1' : ↑(support (σ * τ)) = ↑(support σ) ∪ ↑(support τ)
hd2' : ↑(support (f * σ * f⁻¹ * (g * τ * g⁻¹))) = ↑(support (f * σ * f⁻¹)) ∪ ↑(support (g * τ * g⁻¹))
hd1'' : _root_.Disjoint ↑(support σ) ↑(support τ)
hd2'' : _root_.Disjoint ↑(support (f * σ * f⁻¹)) ↑(support (g * τ * g⁻¹))
x : α
hx : x ∈ ↑(support (σ * τ))
⊢ ↑(↑(Set.union (_ : ↑(support (f * σ * f⁻¹)) ⊓ ↑(support (g * τ * g⁻¹)) ≤ ⊥)).symm
        (Sum.map (↑(subtypeEquiv f (_ : ∀ (a : α), a ∈ ↑(support σ) ↔ ↑f a ∈ ↑(support (f * σ * f⁻¹)))))
          (↑(subtypeEquiv g (_ : ∀ (a : α), a ∈ ↑(support τ) ↔ ↑g a ∈ ↑(support (g * τ * g⁻¹)))))
          (↑(Set.union (_ : ↑(support σ) ⊓ ↑(support τ) ≤ ⊥))
            { val := ↑(σ * τ) x,
              property :=
                (_ :
                  ↑(Equiv.refl α) ↑{ val := ↑(σ * τ) x, property := (_ : ↑(σ * τ) x ∈ support (σ * τ)) } ∈
                    ↑(support σ) ∪ ↑(support τ)) }))) =
    ↑(f * σ * f⁻¹ * (g * τ * g⁻¹))
      ↑(↑(Set.union (_ : ↑(support (f * σ * f⁻¹)) ⊓ ↑(support (g * τ * g⁻¹)) ≤ ⊥)).symm
          (Sum.map (↑(subtypeEquiv f (_ : ∀ (a : α), a ∈ ↑(support σ) ↔ ↑f a ∈ ↑(support (f * σ * f⁻¹)))))
            (↑(subtypeEquiv g (_ : ∀ (a : α), a ∈ ↑(support τ) ↔ ↑g a ∈ ↑(support (g * τ * g⁻¹)))))
            (↑(Set.union (_ : ↑(support σ) ⊓ ↑(support τ) ≤ ⊥))
              { val := x,
                property := (_ : ↑(Equiv.refl α) ↑{ val := x, property := hx } ∈ ↑(support σ) ∪ ↑(support τ)) })))
[PROOFSTEP]
rw [hd1', Set.mem_union] at hx 
[GOAL]
case intro.intro.intro.refine'_2
ι : Type u_1
α✝ : Type u_2
β : Type u_3
inst✝² : DecidableEq α✝
inst✝¹ : Fintype α✝
σ✝ τ✝ : Perm α✝
α : Type u_4
inst✝ : Finite α
σ τ : Perm α
hd1 : Disjoint σ τ
val✝ : Fintype α
f : Perm α
hc1 : IsConj σ (f * σ * f⁻¹)
g : Perm α
hc2 : IsConj τ (g * τ * g⁻¹)
hd2 : Disjoint (f * σ * f⁻¹) (g * τ * g⁻¹)
hd1' : ↑(support (σ * τ)) = ↑(support σ) ∪ ↑(support τ)
hd2' : ↑(support (f * σ * f⁻¹ * (g * τ * g⁻¹))) = ↑(support (f * σ * f⁻¹)) ∪ ↑(support (g * τ * g⁻¹))
hd1'' : _root_.Disjoint ↑(support σ) ↑(support τ)
hd2'' : _root_.Disjoint ↑(support (f * σ * f⁻¹)) ↑(support (g * τ * g⁻¹))
x : α
hx✝ : x ∈ ↑(support (σ * τ))
hx : x ∈ ↑(support σ) ∨ x ∈ ↑(support τ)
⊢ ↑(↑(Set.union (_ : ↑(support (f * σ * f⁻¹)) ⊓ ↑(support (g * τ * g⁻¹)) ≤ ⊥)).symm
        (Sum.map (↑(subtypeEquiv f (_ : ∀ (a : α), a ∈ ↑(support σ) ↔ ↑f a ∈ ↑(support (f * σ * f⁻¹)))))
          (↑(subtypeEquiv g (_ : ∀ (a : α), a ∈ ↑(support τ) ↔ ↑g a ∈ ↑(support (g * τ * g⁻¹)))))
          (↑(Set.union (_ : ↑(support σ) ⊓ ↑(support τ) ≤ ⊥))
            { val := ↑(σ * τ) x,
              property :=
                (_ :
                  ↑(Equiv.refl α) ↑{ val := ↑(σ * τ) x, property := (_ : ↑(σ * τ) x ∈ support (σ * τ)) } ∈
                    ↑(support σ) ∪ ↑(support τ)) }))) =
    ↑(f * σ * f⁻¹ * (g * τ * g⁻¹))
      ↑(↑(Set.union (_ : ↑(support (f * σ * f⁻¹)) ⊓ ↑(support (g * τ * g⁻¹)) ≤ ⊥)).symm
          (Sum.map (↑(subtypeEquiv f (_ : ∀ (a : α), a ∈ ↑(support σ) ↔ ↑f a ∈ ↑(support (f * σ * f⁻¹)))))
            (↑(subtypeEquiv g (_ : ∀ (a : α), a ∈ ↑(support τ) ↔ ↑g a ∈ ↑(support (g * τ * g⁻¹)))))
            (↑(Set.union (_ : ↑(support σ) ⊓ ↑(support τ) ≤ ⊥))
              { val := x,
                property := (_ : ↑(Equiv.refl α) ↑{ val := x, property := hx✝ } ∈ ↑(support σ) ∪ ↑(support τ)) })))
[PROOFSTEP]
cases' hx with hxσ hxτ
[GOAL]
case intro.intro.intro.refine'_2.inl
ι : Type u_1
α✝ : Type u_2
β : Type u_3
inst✝² : DecidableEq α✝
inst✝¹ : Fintype α✝
σ✝ τ✝ : Perm α✝
α : Type u_4
inst✝ : Finite α
σ τ : Perm α
hd1 : Disjoint σ τ
val✝ : Fintype α
f : Perm α
hc1 : IsConj σ (f * σ * f⁻¹)
g : Perm α
hc2 : IsConj τ (g * τ * g⁻¹)
hd2 : Disjoint (f * σ * f⁻¹) (g * τ * g⁻¹)
hd1' : ↑(support (σ * τ)) = ↑(support σ) ∪ ↑(support τ)
hd2' : ↑(support (f * σ * f⁻¹ * (g * τ * g⁻¹))) = ↑(support (f * σ * f⁻¹)) ∪ ↑(support (g * τ * g⁻¹))
hd1'' : _root_.Disjoint ↑(support σ) ↑(support τ)
hd2'' : _root_.Disjoint ↑(support (f * σ * f⁻¹)) ↑(support (g * τ * g⁻¹))
x : α
hx : x ∈ ↑(support (σ * τ))
hxσ : x ∈ ↑(support σ)
⊢ ↑(↑(Set.union (_ : ↑(support (f * σ * f⁻¹)) ⊓ ↑(support (g * τ * g⁻¹)) ≤ ⊥)).symm
        (Sum.map (↑(subtypeEquiv f (_ : ∀ (a : α), a ∈ ↑(support σ) ↔ ↑f a ∈ ↑(support (f * σ * f⁻¹)))))
          (↑(subtypeEquiv g (_ : ∀ (a : α), a ∈ ↑(support τ) ↔ ↑g a ∈ ↑(support (g * τ * g⁻¹)))))
          (↑(Set.union (_ : ↑(support σ) ⊓ ↑(support τ) ≤ ⊥))
            { val := ↑(σ * τ) x,
              property :=
                (_ :
                  ↑(Equiv.refl α) ↑{ val := ↑(σ * τ) x, property := (_ : ↑(σ * τ) x ∈ support (σ * τ)) } ∈
                    ↑(support σ) ∪ ↑(support τ)) }))) =
    ↑(f * σ * f⁻¹ * (g * τ * g⁻¹))
      ↑(↑(Set.union (_ : ↑(support (f * σ * f⁻¹)) ⊓ ↑(support (g * τ * g⁻¹)) ≤ ⊥)).symm
          (Sum.map (↑(subtypeEquiv f (_ : ∀ (a : α), a ∈ ↑(support σ) ↔ ↑f a ∈ ↑(support (f * σ * f⁻¹)))))
            (↑(subtypeEquiv g (_ : ∀ (a : α), a ∈ ↑(support τ) ↔ ↑g a ∈ ↑(support (g * τ * g⁻¹)))))
            (↑(Set.union (_ : ↑(support σ) ⊓ ↑(support τ) ≤ ⊥))
              { val := x,
                property := (_ : ↑(Equiv.refl α) ↑{ val := x, property := hx } ∈ ↑(support σ) ∪ ↑(support τ)) })))
[PROOFSTEP]
rw [mem_coe, mem_support] at hxσ 
[GOAL]
case intro.intro.intro.refine'_2.inl
ι : Type u_1
α✝ : Type u_2
β : Type u_3
inst✝² : DecidableEq α✝
inst✝¹ : Fintype α✝
σ✝ τ✝ : Perm α✝
α : Type u_4
inst✝ : Finite α
σ τ : Perm α
hd1 : Disjoint σ τ
val✝ : Fintype α
f : Perm α
hc1 : IsConj σ (f * σ * f⁻¹)
g : Perm α
hc2 : IsConj τ (g * τ * g⁻¹)
hd2 : Disjoint (f * σ * f⁻¹) (g * τ * g⁻¹)
hd1' : ↑(support (σ * τ)) = ↑(support σ) ∪ ↑(support τ)
hd2' : ↑(support (f * σ * f⁻¹ * (g * τ * g⁻¹))) = ↑(support (f * σ * f⁻¹)) ∪ ↑(support (g * τ * g⁻¹))
hd1'' : _root_.Disjoint ↑(support σ) ↑(support τ)
hd2'' : _root_.Disjoint ↑(support (f * σ * f⁻¹)) ↑(support (g * τ * g⁻¹))
x : α
hx : x ∈ ↑(support (σ * τ))
hxσ : ↑σ x ≠ x
⊢ ↑(↑(Set.union (_ : ↑(support (f * σ * f⁻¹)) ⊓ ↑(support (g * τ * g⁻¹)) ≤ ⊥)).symm
        (Sum.map (↑(subtypeEquiv f (_ : ∀ (a : α), a ∈ ↑(support σ) ↔ ↑f a ∈ ↑(support (f * σ * f⁻¹)))))
          (↑(subtypeEquiv g (_ : ∀ (a : α), a ∈ ↑(support τ) ↔ ↑g a ∈ ↑(support (g * τ * g⁻¹)))))
          (↑(Set.union (_ : ↑(support σ) ⊓ ↑(support τ) ≤ ⊥))
            { val := ↑(σ * τ) x,
              property :=
                (_ :
                  ↑(Equiv.refl α) ↑{ val := ↑(σ * τ) x, property := (_ : ↑(σ * τ) x ∈ support (σ * τ)) } ∈
                    ↑(support σ) ∪ ↑(support τ)) }))) =
    ↑(f * σ * f⁻¹ * (g * τ * g⁻¹))
      ↑(↑(Set.union (_ : ↑(support (f * σ * f⁻¹)) ⊓ ↑(support (g * τ * g⁻¹)) ≤ ⊥)).symm
          (Sum.map (↑(subtypeEquiv f (_ : ∀ (a : α), a ∈ ↑(support σ) ↔ ↑f a ∈ ↑(support (f * σ * f⁻¹)))))
            (↑(subtypeEquiv g (_ : ∀ (a : α), a ∈ ↑(support τ) ↔ ↑g a ∈ ↑(support (g * τ * g⁻¹)))))
            (↑(Set.union (_ : ↑(support σ) ⊓ ↑(support τ) ≤ ⊥))
              { val := x,
                property := (_ : ↑(Equiv.refl α) ↑{ val := x, property := hx } ∈ ↑(support σ) ∪ ↑(support τ)) })))
[PROOFSTEP]
rw [Set.union_apply_left hd1''.le_bot _, Set.union_apply_left hd1''.le_bot _]
[GOAL]
case intro.intro.intro.refine'_2.inl
ι : Type u_1
α✝ : Type u_2
β : Type u_3
inst✝² : DecidableEq α✝
inst✝¹ : Fintype α✝
σ✝ τ✝ : Perm α✝
α : Type u_4
inst✝ : Finite α
σ τ : Perm α
hd1 : Disjoint σ τ
val✝ : Fintype α
f : Perm α
hc1 : IsConj σ (f * σ * f⁻¹)
g : Perm α
hc2 : IsConj τ (g * τ * g⁻¹)
hd2 : Disjoint (f * σ * f⁻¹) (g * τ * g⁻¹)
hd1' : ↑(support (σ * τ)) = ↑(support σ) ∪ ↑(support τ)
hd2' : ↑(support (f * σ * f⁻¹ * (g * τ * g⁻¹))) = ↑(support (f * σ * f⁻¹)) ∪ ↑(support (g * τ * g⁻¹))
hd1'' : _root_.Disjoint ↑(support σ) ↑(support τ)
hd2'' : _root_.Disjoint ↑(support (f * σ * f⁻¹)) ↑(support (g * τ * g⁻¹))
x : α
hx : x ∈ ↑(support (σ * τ))
hxσ : ↑σ x ≠ x
⊢ ↑(↑(Set.union (_ : ↑(support (f * σ * f⁻¹)) ⊓ ↑(support (g * τ * g⁻¹)) ≤ ⊥)).symm
        (Sum.map (↑(subtypeEquiv f (_ : ∀ (a : α), a ∈ ↑(support σ) ↔ ↑f a ∈ ↑(support (f * σ * f⁻¹)))))
          (↑(subtypeEquiv g (_ : ∀ (a : α), a ∈ ↑(support τ) ↔ ↑g a ∈ ↑(support (g * τ * g⁻¹)))))
          (Sum.inl
            {
              val :=
                ↑{ val := ↑(σ * τ) x,
                    property :=
                      (_ :
                        ↑(Equiv.refl α) ↑{ val := ↑(σ * τ) x, property := (_ : ↑(σ * τ) x ∈ support (σ * τ)) } ∈
                          ↑(support σ) ∪ ↑(support τ)) },
              property := ?m.3180485 }))) =
    ↑(f * σ * f⁻¹ * (g * τ * g⁻¹))
      ↑(↑(Set.union (_ : ↑(support (f * σ * f⁻¹)) ⊓ ↑(support (g * τ * g⁻¹)) ≤ ⊥)).symm
          (Sum.map (↑(subtypeEquiv f (_ : ∀ (a : α), a ∈ ↑(support σ) ↔ ↑f a ∈ ↑(support (f * σ * f⁻¹)))))
            (↑(subtypeEquiv g (_ : ∀ (a : α), a ∈ ↑(support τ) ↔ ↑g a ∈ ↑(support (g * τ * g⁻¹)))))
            (Sum.inl
              {
                val :=
                  ↑{ val := x,
                      property := (_ : ↑(Equiv.refl α) ↑{ val := x, property := hx } ∈ ↑(support σ) ∪ ↑(support τ)) },
                property := ?m.3180859 })))
ι : Type u_1
α✝ : Type u_2
β : Type u_3
inst✝² : DecidableEq α✝
inst✝¹ : Fintype α✝
σ✝ τ✝ : Perm α✝
α : Type u_4
inst✝ : Finite α
σ τ : Perm α
hd1 : Disjoint σ τ
val✝ : Fintype α
f : Perm α
hc1 : IsConj σ (f * σ * f⁻¹)
g : Perm α
hc2 : IsConj τ (g * τ * g⁻¹)
hd2 : Disjoint (f * σ * f⁻¹) (g * τ * g⁻¹)
hd1' : ↑(support (σ * τ)) = ↑(support σ) ∪ ↑(support τ)
hd2' : ↑(support (f * σ * f⁻¹ * (g * τ * g⁻¹))) = ↑(support (f * σ * f⁻¹)) ∪ ↑(support (g * τ * g⁻¹))
hd1'' : _root_.Disjoint ↑(support σ) ↑(support τ)
hd2'' : _root_.Disjoint ↑(support (f * σ * f⁻¹)) ↑(support (g * τ * g⁻¹))
x : α
hx : x ∈ ↑(support (σ * τ))
hxσ : ↑σ x ≠ x
⊢ ↑{ val := ↑(σ * τ) x,
        property :=
          (_ :
            ↑(Equiv.refl α) ↑{ val := ↑(σ * τ) x, property := (_ : ↑(σ * τ) x ∈ support (σ * τ)) } ∈
              ↑(support σ) ∪ ↑(support τ)) } ∈
    ↑(support σ)
ι : Type u_1
α✝ : Type u_2
β : Type u_3
inst✝² : DecidableEq α✝
inst✝¹ : Fintype α✝
σ✝ τ✝ : Perm α✝
α : Type u_4
inst✝ : Finite α
σ τ : Perm α
hd1 : Disjoint σ τ
val✝ : Fintype α
f : Perm α
hc1 : IsConj σ (f * σ * f⁻¹)
g : Perm α
hc2 : IsConj τ (g * τ * g⁻¹)
hd2 : Disjoint (f * σ * f⁻¹) (g * τ * g⁻¹)
hd1' : ↑(support (σ * τ)) = ↑(support σ) ∪ ↑(support τ)
hd2' : ↑(support (f * σ * f⁻¹ * (g * τ * g⁻¹))) = ↑(support (f * σ * f⁻¹)) ∪ ↑(support (g * τ * g⁻¹))
hd1'' : _root_.Disjoint ↑(support σ) ↑(support τ)
hd2'' : _root_.Disjoint ↑(support (f * σ * f⁻¹)) ↑(support (g * τ * g⁻¹))
x : α
hx : x ∈ ↑(support (σ * τ))
hxσ : ↑σ x ≠ x
⊢ ↑{ val := x, property := (_ : ↑(Equiv.refl α) ↑{ val := x, property := hx } ∈ ↑(support σ) ∪ ↑(support τ)) } ∈
    ↑(support σ)
ι : Type u_1
α✝ : Type u_2
β : Type u_3
inst✝² : DecidableEq α✝
inst✝¹ : Fintype α✝
σ✝ τ✝ : Perm α✝
α : Type u_4
inst✝ : Finite α
σ τ : Perm α
hd1 : Disjoint σ τ
val✝ : Fintype α
f : Perm α
hc1 : IsConj σ (f * σ * f⁻¹)
g : Perm α
hc2 : IsConj τ (g * τ * g⁻¹)
hd2 : Disjoint (f * σ * f⁻¹) (g * τ * g⁻¹)
hd1' : ↑(support (σ * τ)) = ↑(support σ) ∪ ↑(support τ)
hd2' : ↑(support (f * σ * f⁻¹ * (g * τ * g⁻¹))) = ↑(support (f * σ * f⁻¹)) ∪ ↑(support (g * τ * g⁻¹))
hd1'' : _root_.Disjoint ↑(support σ) ↑(support τ)
hd2'' : _root_.Disjoint ↑(support (f * σ * f⁻¹)) ↑(support (g * τ * g⁻¹))
x : α
hx : x ∈ ↑(support (σ * τ))
hxσ : ↑σ x ≠ x
⊢ ↑{ val := ↑(σ * τ) x,
        property :=
          (_ :
            ↑(Equiv.refl α) ↑{ val := ↑(σ * τ) x, property := (_ : ↑(σ * τ) x ∈ support (σ * τ)) } ∈
              ↑(support σ) ∪ ↑(support τ)) } ∈
    ↑(support σ)
[PROOFSTEP]
simp only [subtypeEquiv_apply, Perm.coe_mul, Sum.map_inl, comp_apply, Set.union_symm_apply_left, Subtype.coe_mk,
  apply_eq_iff_eq]
[GOAL]
case intro.intro.intro.refine'_2.inl
ι : Type u_1
α✝ : Type u_2
β : Type u_3
inst✝² : DecidableEq α✝
inst✝¹ : Fintype α✝
σ✝ τ✝ : Perm α✝
α : Type u_4
inst✝ : Finite α
σ τ : Perm α
hd1 : Disjoint σ τ
val✝ : Fintype α
f : Perm α
hc1 : IsConj σ (f * σ * f⁻¹)
g : Perm α
hc2 : IsConj τ (g * τ * g⁻¹)
hd2 : Disjoint (f * σ * f⁻¹) (g * τ * g⁻¹)
hd1' : ↑(support (σ * τ)) = ↑(support σ) ∪ ↑(support τ)
hd2' : ↑(support (f * σ * f⁻¹ * (g * τ * g⁻¹))) = ↑(support (f * σ * f⁻¹)) ∪ ↑(support (g * τ * g⁻¹))
hd1'' : _root_.Disjoint ↑(support σ) ↑(support τ)
hd2'' : _root_.Disjoint ↑(support (f * σ * f⁻¹)) ↑(support (g * τ * g⁻¹))
x : α
hx : x ∈ ↑(support (σ * τ))
hxσ : ↑σ x ≠ x
⊢ ↑τ x = ↑f⁻¹ (↑g (↑τ (↑g⁻¹ (↑f x))))
[PROOFSTEP]
have h := (hd2 (f x)).resolve_left ?_
[GOAL]
case intro.intro.intro.refine'_2.inl.refine_2
ι : Type u_1
α✝ : Type u_2
β : Type u_3
inst✝² : DecidableEq α✝
inst✝¹ : Fintype α✝
σ✝ τ✝ : Perm α✝
α : Type u_4
inst✝ : Finite α
σ τ : Perm α
hd1 : Disjoint σ τ
val✝ : Fintype α
f : Perm α
hc1 : IsConj σ (f * σ * f⁻¹)
g : Perm α
hc2 : IsConj τ (g * τ * g⁻¹)
hd2 : Disjoint (f * σ * f⁻¹) (g * τ * g⁻¹)
hd1' : ↑(support (σ * τ)) = ↑(support σ) ∪ ↑(support τ)
hd2' : ↑(support (f * σ * f⁻¹ * (g * τ * g⁻¹))) = ↑(support (f * σ * f⁻¹)) ∪ ↑(support (g * τ * g⁻¹))
hd1'' : _root_.Disjoint ↑(support σ) ↑(support τ)
hd2'' : _root_.Disjoint ↑(support (f * σ * f⁻¹)) ↑(support (g * τ * g⁻¹))
x : α
hx : x ∈ ↑(support (σ * τ))
hxσ : ↑σ x ≠ x
h : ↑(g * τ * g⁻¹) (↑f x) = ↑f x
⊢ ↑τ x = ↑f⁻¹ (↑g (↑τ (↑g⁻¹ (↑f x))))
[PROOFSTEP]
rw [mul_apply, mul_apply] at h 
[GOAL]
case intro.intro.intro.refine'_2.inl.refine_2
ι : Type u_1
α✝ : Type u_2
β : Type u_3
inst✝² : DecidableEq α✝
inst✝¹ : Fintype α✝
σ✝ τ✝ : Perm α✝
α : Type u_4
inst✝ : Finite α
σ τ : Perm α
hd1 : Disjoint σ τ
val✝ : Fintype α
f : Perm α
hc1 : IsConj σ (f * σ * f⁻¹)
g : Perm α
hc2 : IsConj τ (g * τ * g⁻¹)
hd2 : Disjoint (f * σ * f⁻¹) (g * τ * g⁻¹)
hd1' : ↑(support (σ * τ)) = ↑(support σ) ∪ ↑(support τ)
hd2' : ↑(support (f * σ * f⁻¹ * (g * τ * g⁻¹))) = ↑(support (f * σ * f⁻¹)) ∪ ↑(support (g * τ * g⁻¹))
hd1'' : _root_.Disjoint ↑(support σ) ↑(support τ)
hd2'' : _root_.Disjoint ↑(support (f * σ * f⁻¹)) ↑(support (g * τ * g⁻¹))
x : α
hx : x ∈ ↑(support (σ * τ))
hxσ : ↑σ x ≠ x
h : ↑g (↑τ (↑g⁻¹ (↑f x))) = ↑f x
⊢ ↑τ x = ↑f⁻¹ (↑g (↑τ (↑g⁻¹ (↑f x))))
[PROOFSTEP]
rw [h, inv_apply_self, (hd1 x).resolve_left hxσ]
[GOAL]
case intro.intro.intro.refine'_2.inl.refine_1
ι : Type u_1
α✝ : Type u_2
β : Type u_3
inst✝² : DecidableEq α✝
inst✝¹ : Fintype α✝
σ✝ τ✝ : Perm α✝
α : Type u_4
inst✝ : Finite α
σ τ : Perm α
hd1 : Disjoint σ τ
val✝ : Fintype α
f : Perm α
hc1 : IsConj σ (f * σ * f⁻¹)
g : Perm α
hc2 : IsConj τ (g * τ * g⁻¹)
hd2 : Disjoint (f * σ * f⁻¹) (g * τ * g⁻¹)
hd1' : ↑(support (σ * τ)) = ↑(support σ) ∪ ↑(support τ)
hd2' : ↑(support (f * σ * f⁻¹ * (g * τ * g⁻¹))) = ↑(support (f * σ * f⁻¹)) ∪ ↑(support (g * τ * g⁻¹))
hd1'' : _root_.Disjoint ↑(support σ) ↑(support τ)
hd2'' : _root_.Disjoint ↑(support (f * σ * f⁻¹)) ↑(support (g * τ * g⁻¹))
x : α
hx : x ∈ ↑(support (σ * τ))
hxσ : ↑σ x ≠ x
⊢ ¬↑(f * σ * f⁻¹) (↑f x) = ↑f x
[PROOFSTEP]
rwa [mul_apply, mul_apply, inv_apply_self, apply_eq_iff_eq]
[GOAL]
ι : Type u_1
α✝ : Type u_2
β : Type u_3
inst✝² : DecidableEq α✝
inst✝¹ : Fintype α✝
σ✝ τ✝ : Perm α✝
α : Type u_4
inst✝ : Finite α
σ τ : Perm α
hd1 : Disjoint σ τ
val✝ : Fintype α
f : Perm α
hc1 : IsConj σ (f * σ * f⁻¹)
g : Perm α
hc2 : IsConj τ (g * τ * g⁻¹)
hd2 : Disjoint (f * σ * f⁻¹) (g * τ * g⁻¹)
hd1' : ↑(support (σ * τ)) = ↑(support σ) ∪ ↑(support τ)
hd2' : ↑(support (f * σ * f⁻¹ * (g * τ * g⁻¹))) = ↑(support (f * σ * f⁻¹)) ∪ ↑(support (g * τ * g⁻¹))
hd1'' : _root_.Disjoint ↑(support σ) ↑(support τ)
hd2'' : _root_.Disjoint ↑(support (f * σ * f⁻¹)) ↑(support (g * τ * g⁻¹))
x : α
hx : x ∈ ↑(support (σ * τ))
hxσ : ↑σ x ≠ x
⊢ ↑{ val := ↑(σ * τ) x,
        property :=
          (_ :
            ↑(Equiv.refl α) ↑{ val := ↑(σ * τ) x, property := (_ : ↑(σ * τ) x ∈ support (σ * τ)) } ∈
              ↑(support σ) ∪ ↑(support τ)) } ∈
    ↑(support σ)
[PROOFSTEP]
rwa [Subtype.coe_mk, Perm.mul_apply, (hd1 x).resolve_left hxσ, mem_coe, apply_mem_support, mem_support]
[GOAL]
ι : Type u_1
α✝ : Type u_2
β : Type u_3
inst✝² : DecidableEq α✝
inst✝¹ : Fintype α✝
σ✝ τ✝ : Perm α✝
α : Type u_4
inst✝ : Finite α
σ τ : Perm α
hd1 : Disjoint σ τ
val✝ : Fintype α
f : Perm α
hc1 : IsConj σ (f * σ * f⁻¹)
g : Perm α
hc2 : IsConj τ (g * τ * g⁻¹)
hd2 : Disjoint (f * σ * f⁻¹) (g * τ * g⁻¹)
hd1' : ↑(support (σ * τ)) = ↑(support σ) ∪ ↑(support τ)
hd2' : ↑(support (f * σ * f⁻¹ * (g * τ * g⁻¹))) = ↑(support (f * σ * f⁻¹)) ∪ ↑(support (g * τ * g⁻¹))
hd1'' : _root_.Disjoint ↑(support σ) ↑(support τ)
hd2'' : _root_.Disjoint ↑(support (f * σ * f⁻¹)) ↑(support (g * τ * g⁻¹))
x : α
hx : x ∈ ↑(support (σ * τ))
hxσ : ↑σ x ≠ x
⊢ ↑{ val := x, property := (_ : ↑(Equiv.refl α) ↑{ val := x, property := hx } ∈ ↑(support σ) ∪ ↑(support τ)) } ∈
    ↑(support σ)
[PROOFSTEP]
rwa [Subtype.coe_mk, mem_coe, mem_support]
[GOAL]
case intro.intro.intro.refine'_2.inr
ι : Type u_1
α✝ : Type u_2
β : Type u_3
inst✝² : DecidableEq α✝
inst✝¹ : Fintype α✝
σ✝ τ✝ : Perm α✝
α : Type u_4
inst✝ : Finite α
σ τ : Perm α
hd1 : Disjoint σ τ
val✝ : Fintype α
f : Perm α
hc1 : IsConj σ (f * σ * f⁻¹)
g : Perm α
hc2 : IsConj τ (g * τ * g⁻¹)
hd2 : Disjoint (f * σ * f⁻¹) (g * τ * g⁻¹)
hd1' : ↑(support (σ * τ)) = ↑(support σ) ∪ ↑(support τ)
hd2' : ↑(support (f * σ * f⁻¹ * (g * τ * g⁻¹))) = ↑(support (f * σ * f⁻¹)) ∪ ↑(support (g * τ * g⁻¹))
hd1'' : _root_.Disjoint ↑(support σ) ↑(support τ)
hd2'' : _root_.Disjoint ↑(support (f * σ * f⁻¹)) ↑(support (g * τ * g⁻¹))
x : α
hx : x ∈ ↑(support (σ * τ))
hxτ : x ∈ ↑(support τ)
⊢ ↑(↑(Set.union (_ : ↑(support (f * σ * f⁻¹)) ⊓ ↑(support (g * τ * g⁻¹)) ≤ ⊥)).symm
        (Sum.map (↑(subtypeEquiv f (_ : ∀ (a : α), a ∈ ↑(support σ) ↔ ↑f a ∈ ↑(support (f * σ * f⁻¹)))))
          (↑(subtypeEquiv g (_ : ∀ (a : α), a ∈ ↑(support τ) ↔ ↑g a ∈ ↑(support (g * τ * g⁻¹)))))
          (↑(Set.union (_ : ↑(support σ) ⊓ ↑(support τ) ≤ ⊥))
            { val := ↑(σ * τ) x,
              property :=
                (_ :
                  ↑(Equiv.refl α) ↑{ val := ↑(σ * τ) x, property := (_ : ↑(σ * τ) x ∈ support (σ * τ)) } ∈
                    ↑(support σ) ∪ ↑(support τ)) }))) =
    ↑(f * σ * f⁻¹ * (g * τ * g⁻¹))
      ↑(↑(Set.union (_ : ↑(support (f * σ * f⁻¹)) ⊓ ↑(support (g * τ * g⁻¹)) ≤ ⊥)).symm
          (Sum.map (↑(subtypeEquiv f (_ : ∀ (a : α), a ∈ ↑(support σ) ↔ ↑f a ∈ ↑(support (f * σ * f⁻¹)))))
            (↑(subtypeEquiv g (_ : ∀ (a : α), a ∈ ↑(support τ) ↔ ↑g a ∈ ↑(support (g * τ * g⁻¹)))))
            (↑(Set.union (_ : ↑(support σ) ⊓ ↑(support τ) ≤ ⊥))
              { val := x,
                property := (_ : ↑(Equiv.refl α) ↑{ val := x, property := hx } ∈ ↑(support σ) ∪ ↑(support τ)) })))
[PROOFSTEP]
rw [mem_coe, ← apply_mem_support, mem_support] at hxτ 
[GOAL]
case intro.intro.intro.refine'_2.inr
ι : Type u_1
α✝ : Type u_2
β : Type u_3
inst✝² : DecidableEq α✝
inst✝¹ : Fintype α✝
σ✝ τ✝ : Perm α✝
α : Type u_4
inst✝ : Finite α
σ τ : Perm α
hd1 : Disjoint σ τ
val✝ : Fintype α
f : Perm α
hc1 : IsConj σ (f * σ * f⁻¹)
g : Perm α
hc2 : IsConj τ (g * τ * g⁻¹)
hd2 : Disjoint (f * σ * f⁻¹) (g * τ * g⁻¹)
hd1' : ↑(support (σ * τ)) = ↑(support σ) ∪ ↑(support τ)
hd2' : ↑(support (f * σ * f⁻¹ * (g * τ * g⁻¹))) = ↑(support (f * σ * f⁻¹)) ∪ ↑(support (g * τ * g⁻¹))
hd1'' : _root_.Disjoint ↑(support σ) ↑(support τ)
hd2'' : _root_.Disjoint ↑(support (f * σ * f⁻¹)) ↑(support (g * τ * g⁻¹))
x : α
hx : x ∈ ↑(support (σ * τ))
hxτ : ↑τ (↑τ x) ≠ ↑τ x
⊢ ↑(↑(Set.union (_ : ↑(support (f * σ * f⁻¹)) ⊓ ↑(support (g * τ * g⁻¹)) ≤ ⊥)).symm
        (Sum.map (↑(subtypeEquiv f (_ : ∀ (a : α), a ∈ ↑(support σ) ↔ ↑f a ∈ ↑(support (f * σ * f⁻¹)))))
          (↑(subtypeEquiv g (_ : ∀ (a : α), a ∈ ↑(support τ) ↔ ↑g a ∈ ↑(support (g * τ * g⁻¹)))))
          (↑(Set.union (_ : ↑(support σ) ⊓ ↑(support τ) ≤ ⊥))
            { val := ↑(σ * τ) x,
              property :=
                (_ :
                  ↑(Equiv.refl α) ↑{ val := ↑(σ * τ) x, property := (_ : ↑(σ * τ) x ∈ support (σ * τ)) } ∈
                    ↑(support σ) ∪ ↑(support τ)) }))) =
    ↑(f * σ * f⁻¹ * (g * τ * g⁻¹))
      ↑(↑(Set.union (_ : ↑(support (f * σ * f⁻¹)) ⊓ ↑(support (g * τ * g⁻¹)) ≤ ⊥)).symm
          (Sum.map (↑(subtypeEquiv f (_ : ∀ (a : α), a ∈ ↑(support σ) ↔ ↑f a ∈ ↑(support (f * σ * f⁻¹)))))
            (↑(subtypeEquiv g (_ : ∀ (a : α), a ∈ ↑(support τ) ↔ ↑g a ∈ ↑(support (g * τ * g⁻¹)))))
            (↑(Set.union (_ : ↑(support σ) ⊓ ↑(support τ) ≤ ⊥))
              { val := x,
                property := (_ : ↑(Equiv.refl α) ↑{ val := x, property := hx } ∈ ↑(support σ) ∪ ↑(support τ)) })))
[PROOFSTEP]
rw [Set.union_apply_right hd1''.le_bot _, Set.union_apply_right hd1''.le_bot _]
[GOAL]
case intro.intro.intro.refine'_2.inr
ι : Type u_1
α✝ : Type u_2
β : Type u_3
inst✝² : DecidableEq α✝
inst✝¹ : Fintype α✝
σ✝ τ✝ : Perm α✝
α : Type u_4
inst✝ : Finite α
σ τ : Perm α
hd1 : Disjoint σ τ
val✝ : Fintype α
f : Perm α
hc1 : IsConj σ (f * σ * f⁻¹)
g : Perm α
hc2 : IsConj τ (g * τ * g⁻¹)
hd2 : Disjoint (f * σ * f⁻¹) (g * τ * g⁻¹)
hd1' : ↑(support (σ * τ)) = ↑(support σ) ∪ ↑(support τ)
hd2' : ↑(support (f * σ * f⁻¹ * (g * τ * g⁻¹))) = ↑(support (f * σ * f⁻¹)) ∪ ↑(support (g * τ * g⁻¹))
hd1'' : _root_.Disjoint ↑(support σ) ↑(support τ)
hd2'' : _root_.Disjoint ↑(support (f * σ * f⁻¹)) ↑(support (g * τ * g⁻¹))
x : α
hx : x ∈ ↑(support (σ * τ))
hxτ : ↑τ (↑τ x) ≠ ↑τ x
⊢ ↑(↑(Set.union (_ : ↑(support (f * σ * f⁻¹)) ⊓ ↑(support (g * τ * g⁻¹)) ≤ ⊥)).symm
        (Sum.map (↑(subtypeEquiv f (_ : ∀ (a : α), a ∈ ↑(support σ) ↔ ↑f a ∈ ↑(support (f * σ * f⁻¹)))))
          (↑(subtypeEquiv g (_ : ∀ (a : α), a ∈ ↑(support τ) ↔ ↑g a ∈ ↑(support (g * τ * g⁻¹)))))
          (Sum.inr
            {
              val :=
                ↑{ val := ↑(σ * τ) x,
                    property :=
                      (_ :
                        ↑(Equiv.refl α) ↑{ val := ↑(σ * τ) x, property := (_ : ↑(σ * τ) x ∈ support (σ * τ)) } ∈
                          ↑(support σ) ∪ ↑(support τ)) },
              property := ?m.3185057 }))) =
    ↑(f * σ * f⁻¹ * (g * τ * g⁻¹))
      ↑(↑(Set.union (_ : ↑(support (f * σ * f⁻¹)) ⊓ ↑(support (g * τ * g⁻¹)) ≤ ⊥)).symm
          (Sum.map (↑(subtypeEquiv f (_ : ∀ (a : α), a ∈ ↑(support σ) ↔ ↑f a ∈ ↑(support (f * σ * f⁻¹)))))
            (↑(subtypeEquiv g (_ : ∀ (a : α), a ∈ ↑(support τ) ↔ ↑g a ∈ ↑(support (g * τ * g⁻¹)))))
            (Sum.inr
              {
                val :=
                  ↑{ val := x,
                      property := (_ : ↑(Equiv.refl α) ↑{ val := x, property := hx } ∈ ↑(support σ) ∪ ↑(support τ)) },
                property := ?m.3185166 })))
ι : Type u_1
α✝ : Type u_2
β : Type u_3
inst✝² : DecidableEq α✝
inst✝¹ : Fintype α✝
σ✝ τ✝ : Perm α✝
α : Type u_4
inst✝ : Finite α
σ τ : Perm α
hd1 : Disjoint σ τ
val✝ : Fintype α
f : Perm α
hc1 : IsConj σ (f * σ * f⁻¹)
g : Perm α
hc2 : IsConj τ (g * τ * g⁻¹)
hd2 : Disjoint (f * σ * f⁻¹) (g * τ * g⁻¹)
hd1' : ↑(support (σ * τ)) = ↑(support σ) ∪ ↑(support τ)
hd2' : ↑(support (f * σ * f⁻¹ * (g * τ * g⁻¹))) = ↑(support (f * σ * f⁻¹)) ∪ ↑(support (g * τ * g⁻¹))
hd1'' : _root_.Disjoint ↑(support σ) ↑(support τ)
hd2'' : _root_.Disjoint ↑(support (f * σ * f⁻¹)) ↑(support (g * τ * g⁻¹))
x : α
hx : x ∈ ↑(support (σ * τ))
hxτ : ↑τ (↑τ x) ≠ ↑τ x
⊢ ↑{ val := ↑(σ * τ) x,
        property :=
          (_ :
            ↑(Equiv.refl α) ↑{ val := ↑(σ * τ) x, property := (_ : ↑(σ * τ) x ∈ support (σ * τ)) } ∈
              ↑(support σ) ∪ ↑(support τ)) } ∈
    ↑(support τ)
ι : Type u_1
α✝ : Type u_2
β : Type u_3
inst✝² : DecidableEq α✝
inst✝¹ : Fintype α✝
σ✝ τ✝ : Perm α✝
α : Type u_4
inst✝ : Finite α
σ τ : Perm α
hd1 : Disjoint σ τ
val✝ : Fintype α
f : Perm α
hc1 : IsConj σ (f * σ * f⁻¹)
g : Perm α
hc2 : IsConj τ (g * τ * g⁻¹)
hd2 : Disjoint (f * σ * f⁻¹) (g * τ * g⁻¹)
hd1' : ↑(support (σ * τ)) = ↑(support σ) ∪ ↑(support τ)
hd2' : ↑(support (f * σ * f⁻¹ * (g * τ * g⁻¹))) = ↑(support (f * σ * f⁻¹)) ∪ ↑(support (g * τ * g⁻¹))
hd1'' : _root_.Disjoint ↑(support σ) ↑(support τ)
hd2'' : _root_.Disjoint ↑(support (f * σ * f⁻¹)) ↑(support (g * τ * g⁻¹))
x : α
hx : x ∈ ↑(support (σ * τ))
hxτ : ↑τ (↑τ x) ≠ ↑τ x
⊢ ↑{ val := x, property := (_ : ↑(Equiv.refl α) ↑{ val := x, property := hx } ∈ ↑(support σ) ∪ ↑(support τ)) } ∈
    ↑(support τ)
ι : Type u_1
α✝ : Type u_2
β : Type u_3
inst✝² : DecidableEq α✝
inst✝¹ : Fintype α✝
σ✝ τ✝ : Perm α✝
α : Type u_4
inst✝ : Finite α
σ τ : Perm α
hd1 : Disjoint σ τ
val✝ : Fintype α
f : Perm α
hc1 : IsConj σ (f * σ * f⁻¹)
g : Perm α
hc2 : IsConj τ (g * τ * g⁻¹)
hd2 : Disjoint (f * σ * f⁻¹) (g * τ * g⁻¹)
hd1' : ↑(support (σ * τ)) = ↑(support σ) ∪ ↑(support τ)
hd2' : ↑(support (f * σ * f⁻¹ * (g * τ * g⁻¹))) = ↑(support (f * σ * f⁻¹)) ∪ ↑(support (g * τ * g⁻¹))
hd1'' : _root_.Disjoint ↑(support σ) ↑(support τ)
hd2'' : _root_.Disjoint ↑(support (f * σ * f⁻¹)) ↑(support (g * τ * g⁻¹))
x : α
hx : x ∈ ↑(support (σ * τ))
hxτ : ↑τ (↑τ x) ≠ ↑τ x
⊢ ↑{ val := ↑(σ * τ) x,
        property :=
          (_ :
            ↑(Equiv.refl α) ↑{ val := ↑(σ * τ) x, property := (_ : ↑(σ * τ) x ∈ support (σ * τ)) } ∈
              ↑(support σ) ∪ ↑(support τ)) } ∈
    ↑(support τ)
[PROOFSTEP]
simp only [subtypeEquiv_apply, Perm.coe_mul, Sum.map_inr, comp_apply, Set.union_symm_apply_right, Subtype.coe_mk,
  apply_eq_iff_eq]
[GOAL]
case intro.intro.intro.refine'_2.inr
ι : Type u_1
α✝ : Type u_2
β : Type u_3
inst✝² : DecidableEq α✝
inst✝¹ : Fintype α✝
σ✝ τ✝ : Perm α✝
α : Type u_4
inst✝ : Finite α
σ τ : Perm α
hd1 : Disjoint σ τ
val✝ : Fintype α
f : Perm α
hc1 : IsConj σ (f * σ * f⁻¹)
g : Perm α
hc2 : IsConj τ (g * τ * g⁻¹)
hd2 : Disjoint (f * σ * f⁻¹) (g * τ * g⁻¹)
hd1' : ↑(support (σ * τ)) = ↑(support σ) ∪ ↑(support τ)
hd2' : ↑(support (f * σ * f⁻¹ * (g * τ * g⁻¹))) = ↑(support (f * σ * f⁻¹)) ∪ ↑(support (g * τ * g⁻¹))
hd1'' : _root_.Disjoint ↑(support σ) ↑(support τ)
hd2'' : _root_.Disjoint ↑(support (f * σ * f⁻¹)) ↑(support (g * τ * g⁻¹))
x : α
hx : x ∈ ↑(support (σ * τ))
hxτ : ↑τ (↑τ x) ≠ ↑τ x
⊢ ↑g (↑σ (↑τ x)) = ↑f (↑σ (↑f⁻¹ (↑g (↑τ (↑g⁻¹ (↑g x))))))
[PROOFSTEP]
have h := (hd2 (g (τ x))).resolve_right ?_
[GOAL]
case intro.intro.intro.refine'_2.inr.refine_2
ι : Type u_1
α✝ : Type u_2
β : Type u_3
inst✝² : DecidableEq α✝
inst✝¹ : Fintype α✝
σ✝ τ✝ : Perm α✝
α : Type u_4
inst✝ : Finite α
σ τ : Perm α
hd1 : Disjoint σ τ
val✝ : Fintype α
f : Perm α
hc1 : IsConj σ (f * σ * f⁻¹)
g : Perm α
hc2 : IsConj τ (g * τ * g⁻¹)
hd2 : Disjoint (f * σ * f⁻¹) (g * τ * g⁻¹)
hd1' : ↑(support (σ * τ)) = ↑(support σ) ∪ ↑(support τ)
hd2' : ↑(support (f * σ * f⁻¹ * (g * τ * g⁻¹))) = ↑(support (f * σ * f⁻¹)) ∪ ↑(support (g * τ * g⁻¹))
hd1'' : _root_.Disjoint ↑(support σ) ↑(support τ)
hd2'' : _root_.Disjoint ↑(support (f * σ * f⁻¹)) ↑(support (g * τ * g⁻¹))
x : α
hx : x ∈ ↑(support (σ * τ))
hxτ : ↑τ (↑τ x) ≠ ↑τ x
h : ↑(f * σ * f⁻¹) (↑g (↑τ x)) = ↑g (↑τ x)
⊢ ↑g (↑σ (↑τ x)) = ↑f (↑σ (↑f⁻¹ (↑g (↑τ (↑g⁻¹ (↑g x))))))
[PROOFSTEP]
rw [mul_apply, mul_apply] at h 
[GOAL]
case intro.intro.intro.refine'_2.inr.refine_2
ι : Type u_1
α✝ : Type u_2
β : Type u_3
inst✝² : DecidableEq α✝
inst✝¹ : Fintype α✝
σ✝ τ✝ : Perm α✝
α : Type u_4
inst✝ : Finite α
σ τ : Perm α
hd1 : Disjoint σ τ
val✝ : Fintype α
f : Perm α
hc1 : IsConj σ (f * σ * f⁻¹)
g : Perm α
hc2 : IsConj τ (g * τ * g⁻¹)
hd2 : Disjoint (f * σ * f⁻¹) (g * τ * g⁻¹)
hd1' : ↑(support (σ * τ)) = ↑(support σ) ∪ ↑(support τ)
hd2' : ↑(support (f * σ * f⁻¹ * (g * τ * g⁻¹))) = ↑(support (f * σ * f⁻¹)) ∪ ↑(support (g * τ * g⁻¹))
hd1'' : _root_.Disjoint ↑(support σ) ↑(support τ)
hd2'' : _root_.Disjoint ↑(support (f * σ * f⁻¹)) ↑(support (g * τ * g⁻¹))
x : α
hx : x ∈ ↑(support (σ * τ))
hxτ : ↑τ (↑τ x) ≠ ↑τ x
h : ↑f (↑σ (↑f⁻¹ (↑g (↑τ x)))) = ↑g (↑τ x)
⊢ ↑g (↑σ (↑τ x)) = ↑f (↑σ (↑f⁻¹ (↑g (↑τ (↑g⁻¹ (↑g x))))))
[PROOFSTEP]
rw [inv_apply_self, h, (hd1 (τ x)).resolve_right hxτ]
[GOAL]
case intro.intro.intro.refine'_2.inr.refine_1
ι : Type u_1
α✝ : Type u_2
β : Type u_3
inst✝² : DecidableEq α✝
inst✝¹ : Fintype α✝
σ✝ τ✝ : Perm α✝
α : Type u_4
inst✝ : Finite α
σ τ : Perm α
hd1 : Disjoint σ τ
val✝ : Fintype α
f : Perm α
hc1 : IsConj σ (f * σ * f⁻¹)
g : Perm α
hc2 : IsConj τ (g * τ * g⁻¹)
hd2 : Disjoint (f * σ * f⁻¹) (g * τ * g⁻¹)
hd1' : ↑(support (σ * τ)) = ↑(support σ) ∪ ↑(support τ)
hd2' : ↑(support (f * σ * f⁻¹ * (g * τ * g⁻¹))) = ↑(support (f * σ * f⁻¹)) ∪ ↑(support (g * τ * g⁻¹))
hd1'' : _root_.Disjoint ↑(support σ) ↑(support τ)
hd2'' : _root_.Disjoint ↑(support (f * σ * f⁻¹)) ↑(support (g * τ * g⁻¹))
x : α
hx : x ∈ ↑(support (σ * τ))
hxτ : ↑τ (↑τ x) ≠ ↑τ x
⊢ ¬↑(g * τ * g⁻¹) (↑g (↑τ x)) = ↑g (↑τ x)
[PROOFSTEP]
rwa [mul_apply, mul_apply, inv_apply_self, apply_eq_iff_eq]
[GOAL]
ι : Type u_1
α✝ : Type u_2
β : Type u_3
inst✝² : DecidableEq α✝
inst✝¹ : Fintype α✝
σ✝ τ✝ : Perm α✝
α : Type u_4
inst✝ : Finite α
σ τ : Perm α
hd1 : Disjoint σ τ
val✝ : Fintype α
f : Perm α
hc1 : IsConj σ (f * σ * f⁻¹)
g : Perm α
hc2 : IsConj τ (g * τ * g⁻¹)
hd2 : Disjoint (f * σ * f⁻¹) (g * τ * g⁻¹)
hd1' : ↑(support (σ * τ)) = ↑(support σ) ∪ ↑(support τ)
hd2' : ↑(support (f * σ * f⁻¹ * (g * τ * g⁻¹))) = ↑(support (f * σ * f⁻¹)) ∪ ↑(support (g * τ * g⁻¹))
hd1'' : _root_.Disjoint ↑(support σ) ↑(support τ)
hd2'' : _root_.Disjoint ↑(support (f * σ * f⁻¹)) ↑(support (g * τ * g⁻¹))
x : α
hx : x ∈ ↑(support (σ * τ))
hxτ : ↑τ (↑τ x) ≠ ↑τ x
⊢ ↑{ val := ↑(σ * τ) x,
        property :=
          (_ :
            ↑(Equiv.refl α) ↑{ val := ↑(σ * τ) x, property := (_ : ↑(σ * τ) x ∈ support (σ * τ)) } ∈
              ↑(support σ) ∪ ↑(support τ)) } ∈
    ↑(support τ)
[PROOFSTEP]
rwa [Subtype.coe_mk, Perm.mul_apply, (hd1 (τ x)).resolve_right hxτ, mem_coe, mem_support]
[GOAL]
ι : Type u_1
α✝ : Type u_2
β : Type u_3
inst✝² : DecidableEq α✝
inst✝¹ : Fintype α✝
σ✝ τ✝ : Perm α✝
α : Type u_4
inst✝ : Finite α
σ τ : Perm α
hd1 : Disjoint σ τ
val✝ : Fintype α
f : Perm α
hc1 : IsConj σ (f * σ * f⁻¹)
g : Perm α
hc2 : IsConj τ (g * τ * g⁻¹)
hd2 : Disjoint (f * σ * f⁻¹) (g * τ * g⁻¹)
hd1' : ↑(support (σ * τ)) = ↑(support σ) ∪ ↑(support τ)
hd2' : ↑(support (f * σ * f⁻¹ * (g * τ * g⁻¹))) = ↑(support (f * σ * f⁻¹)) ∪ ↑(support (g * τ * g⁻¹))
hd1'' : _root_.Disjoint ↑(support σ) ↑(support τ)
hd2'' : _root_.Disjoint ↑(support (f * σ * f⁻¹)) ↑(support (g * τ * g⁻¹))
x : α
hx : x ∈ ↑(support (σ * τ))
hxτ : ↑τ (↑τ x) ≠ ↑τ x
⊢ ↑{ val := x, property := (_ : ↑(Equiv.refl α) ↑{ val := x, property := hx } ∈ ↑(support σ) ∪ ↑(support τ)) } ∈
    ↑(support τ)
[PROOFSTEP]
rwa [Subtype.coe_mk, mem_coe, ← apply_mem_support, mem_support]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝² : DecidableEq α
inst✝¹ : Fintype α
σ✝ τ : Perm α
inst✝ : Fintype α
σ : Perm α
h : σ ≠ 1
⊢ card (filter (fun x => ↑σ x = x) univ) < Fintype.card α - 1
[PROOFSTEP]
rw [lt_tsub_iff_left, ← lt_tsub_iff_right, ← Finset.card_compl, Finset.compl_filter]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝² : DecidableEq α
inst✝¹ : Fintype α
σ✝ τ : Perm α
inst✝ : Fintype α
σ : Perm α
h : σ ≠ 1
⊢ 1 < card (filter (fun x => ¬↑σ x = x) univ)
[PROOFSTEP]
exact one_lt_card_support_of_ne_one h
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ inst✝ : DecidableEq α
l : List α
h : List.Nodup l
⊢ IsCycleOn (List.formPerm l) {a | a ∈ l}
[PROOFSTEP]
refine' ⟨l.formPerm.bijOn fun _ => List.formPerm_mem_iff_mem, fun a ha b hb => _⟩
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ inst✝ : DecidableEq α
l : List α
h : List.Nodup l
a : α
ha : a ∈ {a | a ∈ l}
b : α
hb : b ∈ {a | a ∈ l}
⊢ SameCycle (List.formPerm l) a b
[PROOFSTEP]
rw [Set.mem_setOf, ← List.indexOf_lt_length] at ha hb 
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ inst✝ : DecidableEq α
l : List α
h : List.Nodup l
a : α
ha✝ : a ∈ l
ha : List.indexOf a l < List.length l
b : α
hb✝ : b ∈ l
hb : List.indexOf b l < List.length l
⊢ SameCycle (List.formPerm l) a b
[PROOFSTEP]
rw [← List.indexOf_get ha, ← List.indexOf_get hb]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ inst✝ : DecidableEq α
l : List α
h : List.Nodup l
a : α
ha✝ : a ∈ l
ha : List.indexOf a l < List.length l
b : α
hb✝ : b ∈ l
hb : List.indexOf b l < List.length l
⊢ SameCycle (List.formPerm l) (List.get l { val := List.indexOf a l, isLt := ha })
    (List.get l { val := List.indexOf b l, isLt := hb })
[PROOFSTEP]
refine' ⟨l.indexOf b - l.indexOf a, _⟩
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ inst✝ : DecidableEq α
l : List α
h : List.Nodup l
a : α
ha✝ : a ∈ l
ha : List.indexOf a l < List.length l
b : α
hb✝ : b ∈ l
hb : List.indexOf b l < List.length l
⊢ ↑(List.formPerm l ^ (↑(List.indexOf b l) - ↑(List.indexOf a l)))
      (List.get l { val := List.indexOf a l, isLt := ha }) =
    List.get l { val := List.indexOf b l, isLt := hb }
[PROOFSTEP]
simp only [sub_eq_neg_add, zpow_add, zpow_neg, Equiv.Perm.inv_eq_iff_eq, zpow_ofNat, Equiv.Perm.coe_mul, ←
  List.nthLe_eq, List.formPerm_pow_apply_nthLe _ h, Function.comp]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝¹ inst✝ : DecidableEq α
l : List α
h : List.Nodup l
a : α
ha✝ : a ∈ l
ha : List.indexOf a l < List.length l
b : α
hb✝ : b ∈ l
hb : List.indexOf b l < List.length l
⊢ List.nthLe l ((List.indexOf a l + List.indexOf b l) % List.length l)
      (_ : (List.indexOf a l + List.indexOf b l) % List.length l < List.length l) =
    List.nthLe l ((List.indexOf b l + List.indexOf a l) % List.length l)
      (_ : (List.indexOf b l + List.indexOf a l) % List.length l < List.length l)
[PROOFSTEP]
rw [add_comm]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝ : DecidableEq α
n : ℤ
x✝ : ↑(Equiv.addLeft 1) n ≠ n
⊢ ↑(Equiv.addLeft 1 ^ n) 0 = n
[PROOFSTEP]
simp
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝ : DecidableEq α
n : ℤ
x✝ : ↑(Equiv.addRight 1) n ≠ n
⊢ ↑(Equiv.addRight 1 ^ n) 0 = n
[PROOFSTEP]
simp
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝² inst✝¹ : DecidableEq α
inst✝ : Fintype α
s : Finset α
⊢ ∃ f, IsCycleOn f ↑s ∧ support f ⊆ s
[PROOFSTEP]
refine' ⟨s.toList.formPerm, _, fun x hx => by simpa using List.mem_of_formPerm_apply_ne _ _ (Perm.mem_support.1 hx)⟩
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝² inst✝¹ : DecidableEq α
inst✝ : Fintype α
s : Finset α
x : α
hx : x ∈ support (List.formPerm (toList s))
⊢ x ∈ s
[PROOFSTEP]
simpa using List.mem_of_formPerm_apply_ne _ _ (Perm.mem_support.1 hx)
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝² inst✝¹ : DecidableEq α
inst✝ : Fintype α
s : Finset α
⊢ IsCycleOn (List.formPerm (toList s)) ↑s
[PROOFSTEP]
convert s.nodup_toList.isCycleOn_formPerm
[GOAL]
case h.e'_3
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝² inst✝¹ : DecidableEq α
inst✝ : Fintype α
s : Finset α
⊢ ↑s = {a | a ∈ toList s}
[PROOFSTEP]
simp
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝ : DecidableEq α
f : Perm α
s : Set α
hs : Set.Countable s
⊢ ∃ f, IsCycleOn f s ∧ {x | ↑f x ≠ x} ⊆ s
[PROOFSTEP]
classical
obtain hs' | hs' := s.finite_or_infinite
· refine' ⟨hs'.toFinset.toList.formPerm, _, fun x hx => by simpa using List.mem_of_formPerm_apply_ne _ _ hx⟩
  convert hs'.toFinset.nodup_toList.isCycleOn_formPerm
  simp
haveI := hs.to_subtype
haveI := hs'.to_subtype
obtain ⟨f⟩ : Nonempty (ℤ ≃ s) := inferInstance
refine'
  ⟨(Equiv.addRight 1).extendDomain f, _, fun x hx =>
    of_not_not fun h => hx <| Perm.extendDomain_apply_not_subtype _ _ h⟩
convert Int.addRight_one_isCycle.isCycleOn.extendDomain f
rw [Set.image_comp, Equiv.image_eq_preimage]
ext
simp
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝ : DecidableEq α
f : Perm α
s : Set α
hs : Set.Countable s
⊢ ∃ f, IsCycleOn f s ∧ {x | ↑f x ≠ x} ⊆ s
[PROOFSTEP]
obtain hs' | hs' := s.finite_or_infinite
[GOAL]
case inl
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝ : DecidableEq α
f : Perm α
s : Set α
hs : Set.Countable s
hs' : Set.Finite s
⊢ ∃ f, IsCycleOn f s ∧ {x | ↑f x ≠ x} ⊆ s
[PROOFSTEP]
refine' ⟨hs'.toFinset.toList.formPerm, _, fun x hx => by simpa using List.mem_of_formPerm_apply_ne _ _ hx⟩
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝ : DecidableEq α
f : Perm α
s : Set α
hs : Set.Countable s
hs' : Set.Finite s
x : α
hx : x ∈ {x | ↑(List.formPerm (toList (Set.Finite.toFinset hs'))) x ≠ x}
⊢ x ∈ s
[PROOFSTEP]
simpa using List.mem_of_formPerm_apply_ne _ _ hx
[GOAL]
case inl
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝ : DecidableEq α
f : Perm α
s : Set α
hs : Set.Countable s
hs' : Set.Finite s
⊢ IsCycleOn (List.formPerm (toList (Set.Finite.toFinset hs'))) s
[PROOFSTEP]
convert hs'.toFinset.nodup_toList.isCycleOn_formPerm
[GOAL]
case h.e'_3
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝ : DecidableEq α
f : Perm α
s : Set α
hs : Set.Countable s
hs' : Set.Finite s
⊢ s = {a | a ∈ toList (Set.Finite.toFinset hs')}
[PROOFSTEP]
simp
[GOAL]
case inr
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝ : DecidableEq α
f : Perm α
s : Set α
hs : Set.Countable s
hs' : Set.Infinite s
⊢ ∃ f, IsCycleOn f s ∧ {x | ↑f x ≠ x} ⊆ s
[PROOFSTEP]
haveI := hs.to_subtype
[GOAL]
case inr
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝ : DecidableEq α
f : Perm α
s : Set α
hs : Set.Countable s
hs' : Set.Infinite s
this : Countable ↑s
⊢ ∃ f, IsCycleOn f s ∧ {x | ↑f x ≠ x} ⊆ s
[PROOFSTEP]
haveI := hs'.to_subtype
[GOAL]
case inr
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝ : DecidableEq α
f : Perm α
s : Set α
hs : Set.Countable s
hs' : Set.Infinite s
this✝ : Countable ↑s
this : Infinite ↑s
⊢ ∃ f, IsCycleOn f s ∧ {x | ↑f x ≠ x} ⊆ s
[PROOFSTEP]
obtain ⟨f⟩ : Nonempty (ℤ ≃ s) := inferInstance
[GOAL]
case inr.intro
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝ : DecidableEq α
f✝ : Perm α
s : Set α
hs : Set.Countable s
hs' : Set.Infinite s
this✝ : Countable ↑s
this : Infinite ↑s
f : ℤ ≃ ↑s
⊢ ∃ f, IsCycleOn f s ∧ {x | ↑f x ≠ x} ⊆ s
[PROOFSTEP]
refine'
  ⟨(Equiv.addRight 1).extendDomain f, _, fun x hx =>
    of_not_not fun h => hx <| Perm.extendDomain_apply_not_subtype _ _ h⟩
[GOAL]
case inr.intro
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝ : DecidableEq α
f✝ : Perm α
s : Set α
hs : Set.Countable s
hs' : Set.Infinite s
this✝ : Countable ↑s
this : Infinite ↑s
f : ℤ ≃ ↑s
⊢ IsCycleOn (extendDomain (Equiv.addRight 1) f) s
[PROOFSTEP]
convert Int.addRight_one_isCycle.isCycleOn.extendDomain f
[GOAL]
case h.e'_3
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝ : DecidableEq α
f✝ : Perm α
s : Set α
hs : Set.Countable s
hs' : Set.Infinite s
this✝ : Countable ↑s
this : Infinite ↑s
f : ℤ ≃ ↑s
⊢ s = Subtype.val ∘ ↑f '' {x | ↑(Equiv.addRight 1) x ≠ x}
[PROOFSTEP]
rw [Set.image_comp, Equiv.image_eq_preimage]
[GOAL]
case h.e'_3
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝ : DecidableEq α
f✝ : Perm α
s : Set α
hs : Set.Countable s
hs' : Set.Infinite s
this✝ : Countable ↑s
this : Infinite ↑s
f : ℤ ≃ ↑s
⊢ s = Subtype.val '' (↑f.symm ⁻¹' {x | ↑(Equiv.addRight 1) x ≠ x})
[PROOFSTEP]
ext
[GOAL]
case h.e'_3.h
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝ : DecidableEq α
f✝ : Perm α
s : Set α
hs : Set.Countable s
hs' : Set.Infinite s
this✝ : Countable ↑s
this : Infinite ↑s
f : ℤ ≃ ↑s
x✝ : α
⊢ x✝ ∈ s ↔ x✝ ∈ Subtype.val '' (↑f.symm ⁻¹' {x | ↑(Equiv.addRight 1) x ≠ x})
[PROOFSTEP]
simp
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝ : DecidableEq α
f : Perm α
s : Set α
hf : IsCycleOn f s
⊢ s ×ˢ s = ⋃ (n : ℤ), (fun a => (a, ↑(f ^ n) a)) '' s
[PROOFSTEP]
ext ⟨a, b⟩
[GOAL]
case h.mk
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝ : DecidableEq α
f : Perm α
s : Set α
hf : IsCycleOn f s
a b : α
⊢ (a, b) ∈ s ×ˢ s ↔ (a, b) ∈ ⋃ (n : ℤ), (fun a => (a, ↑(f ^ n) a)) '' s
[PROOFSTEP]
simp only [Set.mem_prod, Set.mem_iUnion, Set.mem_image]
[GOAL]
case h.mk
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝ : DecidableEq α
f : Perm α
s : Set α
hf : IsCycleOn f s
a b : α
⊢ a ∈ s ∧ b ∈ s ↔ ∃ i x, x ∈ s ∧ (x, ↑(f ^ i) x) = (a, b)
[PROOFSTEP]
refine' ⟨fun hx => _, _⟩
[GOAL]
case h.mk.refine'_1
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝ : DecidableEq α
f : Perm α
s : Set α
hf : IsCycleOn f s
a b : α
hx : a ∈ s ∧ b ∈ s
⊢ ∃ i x, x ∈ s ∧ (x, ↑(f ^ i) x) = (a, b)
[PROOFSTEP]
obtain ⟨n, rfl⟩ := hf.2 hx.1 hx.2
[GOAL]
case h.mk.refine'_1.intro
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝ : DecidableEq α
f : Perm α
s : Set α
hf : IsCycleOn f s
a : α
n : ℤ
hx : a ∈ s ∧ ↑(f ^ n) a ∈ s
⊢ ∃ i x, x ∈ s ∧ (x, ↑(f ^ i) x) = (a, ↑(f ^ n) a)
[PROOFSTEP]
exact ⟨_, _, hx.1, rfl⟩
[GOAL]
case h.mk.refine'_2
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝ : DecidableEq α
f : Perm α
s : Set α
hf : IsCycleOn f s
a b : α
⊢ (∃ i x, x ∈ s ∧ (x, ↑(f ^ i) x) = (a, b)) → a ∈ s ∧ b ∈ s
[PROOFSTEP]
rintro ⟨n, a, ha, ⟨⟩⟩
[GOAL]
case h.mk.refine'_2.intro.intro.intro.refl
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝ : DecidableEq α
f : Perm α
s : Set α
hf : IsCycleOn f s
a : α
n : ℤ
ha : a ∈ s
⊢ a ∈ s ∧ ↑(f ^ n) a ∈ s
[PROOFSTEP]
exact ⟨ha, (hf.1.perm_zpow _).mapsTo ha⟩
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝ : DecidableEq α
f : Perm α
s : Finset α
hf : IsCycleOn f ↑s
⊢ Set.PairwiseDisjoint ↑(range (card s)) fun k =>
    map
      { toFun := fun i => (i, ↑(f ^ k) i),
        inj' :=
          (_ :
            ∀ (i j : α),
              (fun i => (i, ↑(f ^ k) i)) i = (fun i => (i, ↑(f ^ k) i)) j →
                ((fun i => (i, ↑(f ^ k) i)) i).fst = ((fun i => (i, ↑(f ^ k) i)) j).fst) }
      s
[PROOFSTEP]
obtain hs | _ := (s : Set α).subsingleton_or_nontrivial
[GOAL]
case inl
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝ : DecidableEq α
f : Perm α
s : Finset α
hf : IsCycleOn f ↑s
hs : Set.Subsingleton ↑s
⊢ Set.PairwiseDisjoint ↑(range (card s)) fun k =>
    map
      { toFun := fun i => (i, ↑(f ^ k) i),
        inj' :=
          (_ :
            ∀ (i j : α),
              (fun i => (i, ↑(f ^ k) i)) i = (fun i => (i, ↑(f ^ k) i)) j →
                ((fun i => (i, ↑(f ^ k) i)) i).fst = ((fun i => (i, ↑(f ^ k) i)) j).fst) }
      s
[PROOFSTEP]
refine' Set.Subsingleton.pairwise _ _
[GOAL]
case inl
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝ : DecidableEq α
f : Perm α
s : Finset α
hf : IsCycleOn f ↑s
hs : Set.Subsingleton ↑s
⊢ Set.Subsingleton ↑(range (card s))
[PROOFSTEP]
simp_rw [Set.Subsingleton, mem_coe, ← card_le_one] at hs ⊢
[GOAL]
case inl
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝ : DecidableEq α
f : Perm α
s : Finset α
hf : IsCycleOn f ↑s
hs : card s ≤ 1
⊢ card (range (card s)) ≤ 1
[PROOFSTEP]
rwa [card_range]
[GOAL]
case inr
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝ : DecidableEq α
f : Perm α
s : Finset α
hf : IsCycleOn f ↑s
h✝ : Set.Nontrivial ↑s
⊢ Set.PairwiseDisjoint ↑(range (card s)) fun k =>
    map
      { toFun := fun i => (i, ↑(f ^ k) i),
        inj' :=
          (_ :
            ∀ (i j : α),
              (fun i => (i, ↑(f ^ k) i)) i = (fun i => (i, ↑(f ^ k) i)) j →
                ((fun i => (i, ↑(f ^ k) i)) i).fst = ((fun i => (i, ↑(f ^ k) i)) j).fst) }
      s
[PROOFSTEP]
classical
rintro m hm n hn hmn
simp only [disjoint_left, Function.onFun, mem_map, Function.Embedding.coeFn_mk, exists_prop, not_exists, not_and,
  forall_exists_index, and_imp, Prod.forall, Prod.mk.inj_iff]
rintro _ _ _ - rfl rfl a ha rfl h
rw [hf.pow_apply_eq_pow_apply ha] at h 
rw [mem_coe, mem_range] at hm hn 
exact hmn.symm (h.eq_of_lt_of_lt hn hm)
[GOAL]
case inr
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝ : DecidableEq α
f : Perm α
s : Finset α
hf : IsCycleOn f ↑s
h✝ : Set.Nontrivial ↑s
⊢ Set.PairwiseDisjoint ↑(range (card s)) fun k =>
    map
      { toFun := fun i => (i, ↑(f ^ k) i),
        inj' :=
          (_ :
            ∀ (i j : α),
              (fun i => (i, ↑(f ^ k) i)) i = (fun i => (i, ↑(f ^ k) i)) j →
                ((fun i => (i, ↑(f ^ k) i)) i).fst = ((fun i => (i, ↑(f ^ k) i)) j).fst) }
      s
[PROOFSTEP]
rintro m hm n hn hmn
[GOAL]
case inr
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝ : DecidableEq α
f : Perm α
s : Finset α
hf : IsCycleOn f ↑s
h✝ : Set.Nontrivial ↑s
m : ℕ
hm : m ∈ ↑(range (card s))
n : ℕ
hn : n ∈ ↑(range (card s))
hmn : m ≠ n
⊢ (_root_.Disjoint on fun k =>
      map
        { toFun := fun i => (i, ↑(f ^ k) i),
          inj' :=
            (_ :
              ∀ (i j : α),
                (fun i => (i, ↑(f ^ k) i)) i = (fun i => (i, ↑(f ^ k) i)) j →
                  ((fun i => (i, ↑(f ^ k) i)) i).fst = ((fun i => (i, ↑(f ^ k) i)) j).fst) }
        s)
    m n
[PROOFSTEP]
simp only [disjoint_left, Function.onFun, mem_map, Function.Embedding.coeFn_mk, exists_prop, not_exists, not_and,
  forall_exists_index, and_imp, Prod.forall, Prod.mk.inj_iff]
[GOAL]
case inr
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝ : DecidableEq α
f : Perm α
s : Finset α
hf : IsCycleOn f ↑s
h✝ : Set.Nontrivial ↑s
m : ℕ
hm : m ∈ ↑(range (card s))
n : ℕ
hn : n ∈ ↑(range (card s))
hmn : m ≠ n
⊢ ∀ (a b x : α), x ∈ s → x = a → ↑(f ^ m) x = b → ∀ (x : α), x ∈ s → x = a → ¬↑(f ^ n) x = b
[PROOFSTEP]
rintro _ _ _ - rfl rfl a ha rfl h
[GOAL]
case inr
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝ : DecidableEq α
f : Perm α
s : Finset α
hf : IsCycleOn f ↑s
h✝ : Set.Nontrivial ↑s
m : ℕ
hm : m ∈ ↑(range (card s))
n : ℕ
hn : n ∈ ↑(range (card s))
hmn : m ≠ n
a : α
ha : a ∈ s
h : ↑(f ^ n) a = ↑(f ^ m) a
⊢ False
[PROOFSTEP]
rw [hf.pow_apply_eq_pow_apply ha] at h 
[GOAL]
case inr
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝ : DecidableEq α
f : Perm α
s : Finset α
hf : IsCycleOn f ↑s
h✝ : Set.Nontrivial ↑s
m : ℕ
hm : m ∈ ↑(range (card s))
n : ℕ
hn : n ∈ ↑(range (card s))
hmn : m ≠ n
a : α
ha : a ∈ s
h : n ≡ m [MOD card s]
⊢ False
[PROOFSTEP]
rw [mem_coe, mem_range] at hm hn 
[GOAL]
case inr
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝ : DecidableEq α
f : Perm α
s : Finset α
hf : IsCycleOn f ↑s
h✝ : Set.Nontrivial ↑s
m : ℕ
hm : m < card s
n : ℕ
hn : n < card s
hmn : m ≠ n
a : α
ha : a ∈ s
h : n ≡ m [MOD card s]
⊢ False
[PROOFSTEP]
exact hmn.symm (h.eq_of_lt_of_lt hn hm)
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝ : DecidableEq α
f : Perm α
s : Finset α
hf : IsCycleOn f ↑s
⊢ s ×ˢ s =
    disjiUnion (range (card s))
      (fun k =>
        map
          { toFun := fun i => (i, ↑(f ^ k) i),
            inj' :=
              (_ :
                ∀ (i j : α),
                  (fun i => (i, ↑(f ^ k) i)) i = (fun i => (i, ↑(f ^ k) i)) j →
                    ((fun i => (i, ↑(f ^ k) i)) i).fst = ((fun i => (i, ↑(f ^ k) i)) j).fst) }
          s)
      (_ :
        Set.PairwiseDisjoint ↑(range (card s)) fun k =>
          map
            { toFun := fun i => (i, ↑(f ^ k) i),
              inj' :=
                (_ :
                  ∀ (i j : α),
                    (fun i => (i, ↑(f ^ k) i)) i = (fun i => (i, ↑(f ^ k) i)) j →
                      ((fun i => (i, ↑(f ^ k) i)) i).fst = ((fun i => (i, ↑(f ^ k) i)) j).fst) }
            s)
[PROOFSTEP]
ext ⟨a, b⟩
[GOAL]
case a.mk
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝ : DecidableEq α
f : Perm α
s : Finset α
hf : IsCycleOn f ↑s
a b : α
⊢ (a, b) ∈ s ×ˢ s ↔
    (a, b) ∈
      disjiUnion (range (card s))
        (fun k =>
          map
            { toFun := fun i => (i, ↑(f ^ k) i),
              inj' :=
                (_ :
                  ∀ (i j : α),
                    (fun i => (i, ↑(f ^ k) i)) i = (fun i => (i, ↑(f ^ k) i)) j →
                      ((fun i => (i, ↑(f ^ k) i)) i).fst = ((fun i => (i, ↑(f ^ k) i)) j).fst) }
            s)
        (_ :
          Set.PairwiseDisjoint ↑(range (card s)) fun k =>
            map
              { toFun := fun i => (i, ↑(f ^ k) i),
                inj' :=
                  (_ :
                    ∀ (i j : α),
                      (fun i => (i, ↑(f ^ k) i)) i = (fun i => (i, ↑(f ^ k) i)) j →
                        ((fun i => (i, ↑(f ^ k) i)) i).fst = ((fun i => (i, ↑(f ^ k) i)) j).fst) }
              s)
[PROOFSTEP]
simp only [mem_product, Equiv.Perm.coe_pow, mem_disjiUnion, mem_range, mem_map, Function.Embedding.coeFn_mk,
  Prod.mk.inj_iff, exists_prop]
[GOAL]
case a.mk
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝ : DecidableEq α
f : Perm α
s : Finset α
hf : IsCycleOn f ↑s
a b : α
⊢ a ∈ s ∧ b ∈ s ↔ ∃ a_1, a_1 < card s ∧ ∃ a_2, a_2 ∈ s ∧ a_2 = a ∧ (↑f)^[a_1] a_2 = b
[PROOFSTEP]
refine' ⟨fun hx => _, _⟩
[GOAL]
case a.mk.refine'_1
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝ : DecidableEq α
f : Perm α
s : Finset α
hf : IsCycleOn f ↑s
a b : α
hx : a ∈ s ∧ b ∈ s
⊢ ∃ a_1, a_1 < card s ∧ ∃ a_2, a_2 ∈ s ∧ a_2 = a ∧ (↑f)^[a_1] a_2 = b
[PROOFSTEP]
obtain ⟨n, hn, rfl⟩ := hf.exists_pow_eq hx.1 hx.2
[GOAL]
case a.mk.refine'_1.intro.intro
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝ : DecidableEq α
f : Perm α
s : Finset α
hf : IsCycleOn f ↑s
a : α
n : ℕ
hn : n < card s
hx : a ∈ s ∧ ↑(f ^ n) a ∈ s
⊢ ∃ a_1, a_1 < card s ∧ ∃ a_2, a_2 ∈ s ∧ a_2 = a ∧ (↑f)^[a_1] a_2 = ↑(f ^ n) a
[PROOFSTEP]
exact ⟨n, hn, a, hx.1, rfl, by rw [f.iterate_eq_pow]⟩
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝ : DecidableEq α
f : Perm α
s : Finset α
hf : IsCycleOn f ↑s
a : α
n : ℕ
hn : n < card s
hx : a ∈ s ∧ ↑(f ^ n) a ∈ s
⊢ (↑f)^[n] a = ↑(f ^ n) a
[PROOFSTEP]
rw [f.iterate_eq_pow]
[GOAL]
case a.mk.refine'_2
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝ : DecidableEq α
f : Perm α
s : Finset α
hf : IsCycleOn f ↑s
a b : α
⊢ (∃ a_1, a_1 < card s ∧ ∃ a_2, a_2 ∈ s ∧ a_2 = a ∧ (↑f)^[a_1] a_2 = b) → a ∈ s ∧ b ∈ s
[PROOFSTEP]
rintro ⟨n, -, a, ha, rfl, rfl⟩
[GOAL]
case a.mk.refine'_2.intro.intro.intro.intro.intro
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝ : DecidableEq α
f : Perm α
s : Finset α
hf : IsCycleOn f ↑s
n : ℕ
a : α
ha : a ∈ s
⊢ a ∈ s ∧ (↑f)^[n] a ∈ s
[PROOFSTEP]
exact ⟨ha, (hf.1.iterate _).mapsTo ha⟩
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝³ : DecidableEq α
inst✝² : Semiring α
inst✝¹ : AddCommMonoid β
inst✝ : Module α β
s : Finset ι
σ : Perm ι
hσ : IsCycleOn σ ↑s
f : ι → α
g : ι → β
⊢ (∑ i in s, f i) • ∑ i in s, g i = ∑ k in range (card s), ∑ i in s, f i • g (↑(σ ^ k) i)
[PROOFSTEP]
simp_rw [sum_smul_sum, product_self_eq_disjUnion_perm hσ, sum_disjiUnion, sum_map]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
inst✝³ : DecidableEq α
inst✝² : Semiring α
inst✝¹ : AddCommMonoid β
inst✝ : Module α β
s : Finset ι
σ : Perm ι
hσ : IsCycleOn σ ↑s
f : ι → α
g : ι → β
⊢ ∑ x in range (card s),
      ∑ x_1 in s,
        f
            (↑{ toFun := fun i => (i, ↑(σ ^ x) i),
                    inj' :=
                      (_ :
                        ∀ (i j : ι),
                          (fun i => (i, ↑(σ ^ x) i)) i = (fun i => (i, ↑(σ ^ x) i)) j →
                            ((fun i => (i, ↑(σ ^ x) i)) i).fst = ((fun i => (i, ↑(σ ^ x) i)) j).fst) }
                x_1).fst •
          g
            (↑{ toFun := fun i => (i, ↑(σ ^ x) i),
                    inj' :=
                      (_ :
                        ∀ (i j : ι),
                          (fun i => (i, ↑(σ ^ x) i)) i = (fun i => (i, ↑(σ ^ x) i)) j →
                            ((fun i => (i, ↑(σ ^ x) i)) i).fst = ((fun i => (i, ↑(σ ^ x) i)) j).fst) }
                x_1).snd =
    ∑ x in range (card s), ∑ x_1 in s, f x_1 • g (↑(σ ^ x) x_1)
[PROOFSTEP]
rfl
