Module docstring
{"# Extra lemmas about periodic points "}
{"# Extra lemmas about periodic points "}
Function.directed_ptsOfPeriod_pnat
theorem
(f : α → α) : Directed (· ⊆ ·) fun n : ℕ+ => ptsOfPeriod f n
theorem directed_ptsOfPeriod_pnat (f : α → α) : Directed (· ⊆ ·) fun n : ℕ+ => ptsOfPeriod f n :=
fun m n => ⟨m * n, fun _ hx => hx.mul_const n, fun _ hx => hx.const_mul m⟩
Function.bijOn_periodicPts
theorem
: BijOn f (periodicPts f) (periodicPts f)
theorem bijOn_periodicPts : BijOn f (periodicPts f) (periodicPts f) :=
iUnion_pnat_ptsOfPeriod f ▸
bijOn_iUnion_of_directed (directed_ptsOfPeriod_pnat f) fun i => bijOn_ptsOfPeriod f i.pos
Function.minimalPeriod_eq_prime_iff
theorem
{p : ℕ} [hp : Fact p.Prime] : minimalPeriod f x = p ↔ IsPeriodicPt f p x ∧ ¬IsFixedPt f x
theorem minimalPeriod_eq_prime_iff {p : ℕ} [hp : Fact p.Prime] :
minimalPeriodminimalPeriod f x = p ↔ IsPeriodicPt f p x ∧ ¬IsFixedPt f x := by
rw [Function.isPeriodicPt_iff_minimalPeriod_dvd, Nat.dvd_prime hp.out,
← minimalPeriod_eq_one_iff_isFixedPt.not, or_and_right, and_not_self_iff, false_or,
iff_self_and]
exact fun h ↦ ne_of_eq_of_ne h hp.out.ne_one
Function.minimalPeriod_eq_prime
theorem
{p : ℕ} [hp : Fact p.Prime] (hper : IsPeriodicPt f p x) (hfix : ¬IsFixedPt f x) : minimalPeriod f x = p
/-- The backward direction of `minimalPeriod_eq_prime_iff`. -/
theorem minimalPeriod_eq_prime {p : ℕ} [hp : Fact p.Prime] (hper : IsPeriodicPt f p x)
(hfix : ¬IsFixedPt f x) : minimalPeriod f x = p :=
minimalPeriod_eq_prime_iff.mpr ⟨hper, hfix⟩
Function.minimalPeriod_eq_prime_pow
theorem
{p k : ℕ} [hp : Fact p.Prime] (hk : ¬IsPeriodicPt f (p ^ k) x) (hk1 : IsPeriodicPt f (p ^ (k + 1)) x) :
minimalPeriod f x = p ^ (k + 1)
theorem minimalPeriod_eq_prime_pow {p k : ℕ} [hp : Fact p.Prime] (hk : ¬IsPeriodicPt f (p ^ k) x)
(hk1 : IsPeriodicPt f (p ^ (k + 1)) x) : minimalPeriod f x = p ^ (k + 1) := by
apply Nat.eq_prime_pow_of_dvd_least_prime_pow hp.out <;>
rwa [← isPeriodicPt_iff_minimalPeriod_dvd]
Function.Commute.minimalPeriod_of_comp_dvd_mul
theorem
{g : α → α} (h : Commute f g) : minimalPeriod (f ∘ g) x ∣ minimalPeriod f x * minimalPeriod g x
theorem Commute.minimalPeriod_of_comp_dvd_mul {g : α → α} (h : Commute f g) :
minimalPeriodminimalPeriod (f ∘ g) x ∣ minimalPeriod f x * minimalPeriod g x :=
dvd_trans h.minimalPeriod_of_comp_dvd_lcm (lcm_dvd_mul _ _)
Function.Commute.minimalPeriod_of_comp_eq_mul_of_coprime
theorem
{g : α → α} (h : Commute f g) (hco : Coprime (minimalPeriod f x) (minimalPeriod g x)) :
minimalPeriod (f ∘ g) x = minimalPeriod f x * minimalPeriod g x
theorem Commute.minimalPeriod_of_comp_eq_mul_of_coprime {g : α → α} (h : Commute f g)
(hco : Coprime (minimalPeriod f x) (minimalPeriod g x)) :
minimalPeriod (f ∘ g) x = minimalPeriod f x * minimalPeriod g x := by
apply h.minimalPeriod_of_comp_dvd_mul.antisymm
suffices
∀ {f g : α → α},
Commute f g →
Coprime (minimalPeriod f x) (minimalPeriod g x) →
minimalPeriodminimalPeriod f x ∣ minimalPeriod (f ∘ g) x from
hco.mul_dvd_of_dvd_of_dvd (this h hco) (h.comp_eq.symm ▸ this h.symm hco.symm)
intro f g h hco
refine hco.dvd_of_dvd_mul_left (IsPeriodicPt.left_of_comp h ?_ ?_).minimalPeriod_dvd
· exact (isPeriodicPt_minimalPeriod _ _).const_mul _
· exact (isPeriodicPt_minimalPeriod _ _).mul_const _
Function.minimalPeriod_le_card
theorem
[Fintype α] : minimalPeriod f x ≤ card α
theorem minimalPeriod_le_card [Fintype α] : minimalPeriod f x ≤ card α := by
rw [← periodicOrbit_length]
exact List.Nodup.length_le_card nodup_periodicOrbit
Function.isPeriodicPt_factorial_card_of_mem_periodicPts
theorem
[Fintype α] (h : x ∈ periodicPts f) : IsPeriodicPt f (card α)! x
theorem isPeriodicPt_factorial_card_of_mem_periodicPts [Fintype α] (h : x ∈ periodicPts f) :
IsPeriodicPt f (card α)! x :=
isPeriodicPt_iff_minimalPeriod_dvd.mpr
(Nat.dvd_factorial (minimalPeriod_pos_of_mem_periodicPts h) minimalPeriod_le_card)
Function.mem_periodicPts_iff_isPeriodicPt_factorial_card
theorem
[Fintype α] : x ∈ periodicPts f ↔ IsPeriodicPt f (card α)! x
theorem mem_periodicPts_iff_isPeriodicPt_factorial_card [Fintype α] :
x ∈ periodicPts fx ∈ periodicPts f ↔ IsPeriodicPt f (card α)! x where
mp := isPeriodicPt_factorial_card_of_mem_periodicPts
mpr h := minimalPeriod_pos_iff_mem_periodicPts.mp
(IsPeriodicPt.minimalPeriod_pos (Nat.factorial_pos _) h)
Function.Injective.mem_periodicPts
theorem
[Finite α] (h : Injective f) (x : α) : x ∈ periodicPts f
theorem Injective.mem_periodicPts [Finite α] (h : Injective f) (x : α) : x ∈ periodicPts f := by
obtain ⟨m, n, heq, hne⟩ : ∃ m n, f^[m] x = f^[n] x ∧ m ≠ n := by
simpa [Injective] using not_injective_infinite_finite (f^[·] x)
rcases lt_or_gt_of_ne hne with hlt | hlt
· exact mk_mem_periodicPts (by omega) (iterate_cancel h heq.symm)
· exact mk_mem_periodicPts (by omega) (iterate_cancel h heq)
Function.injective_iff_periodicPts_eq_univ
theorem
[Finite α] : Injective f ↔ periodicPts f = univ
theorem injective_iff_periodicPts_eq_univ [Finite α] : InjectiveInjective f ↔ periodicPts f = univ := by
refine ⟨fun h ↦ eq_univ_iff_forall.mpr h.mem_periodicPts, fun h ↦ ?_⟩
rw [Finite.injective_iff_surjective, ← range_eq_univ, ← univ_subset_iff, ← h]
apply periodicPts_subset_range
Function.injective_iff_iterate_factorial_card_eq_id
theorem
[Fintype α] : Injective f ↔ f^[(card α)!] = id
theorem injective_iff_iterate_factorial_card_eq_id [Fintype α] :
InjectiveInjective f ↔ f^[(card α)!] = id := by
simp only [injective_iff_periodicPts_eq_univ, mem_periodicPts_iff_isPeriodicPt_factorial_card,
funext_iff, eq_univ_iff_forall, IsPeriodicPt, id, IsFixedPt]
Function.minimalPeriod_prodMap
theorem
(f : α → α) (g : β → β) (x : α × β) : minimalPeriod (Prod.map f g) x = (minimalPeriod f x.1).lcm (minimalPeriod g x.2)
theorem minimalPeriod_prodMap (f : α → α) (g : β → β) (x : α × β) :
minimalPeriod (Prod.map f g) x = (minimalPeriod f x.1).lcm (minimalPeriod g x.2) :=
eq_of_forall_dvd <| by cases x; simp [← isPeriodicPt_iff_minimalPeriod_dvd, Nat.lcm_dvd_iff]
Function.minimalPeriod_fst_dvd
theorem
: minimalPeriod f x.1 ∣ minimalPeriod (Prod.map f g) x
theorem minimalPeriod_fst_dvd : minimalPeriodminimalPeriod f x.1 ∣ minimalPeriod (Prod.map f g) x := by
rw [minimalPeriod_prodMap]; exact Nat.dvd_lcm_left _ _
Function.minimalPeriod_snd_dvd
theorem
: minimalPeriod g x.2 ∣ minimalPeriod (Prod.map f g) x
theorem minimalPeriod_snd_dvd : minimalPeriodminimalPeriod g x.2 ∣ minimalPeriod (Prod.map f g) x := by
rw [minimalPeriod_prodMap]; exact Nat.dvd_lcm_right _ _