# Iterating automorphisms ```agda module foundation.iterating-automorphisms where ``` <details><summary>Imports</summary> ```agda open import elementary-number-theory.addition-integers open import elementary-number-theory.integers open import elementary-number-theory.natural-numbers open import foundation.automorphisms open import foundation.equivalence-extensionality open import foundation.iterating-functions open import foundation.universe-levels open import foundation.whiskering-homotopies-composition open import foundation-core.coproduct-types open import foundation-core.equivalences open import foundation-core.function-types open import foundation-core.homotopies ``` </details> ## Definition ### Iterating automorphisms #### Iterating by postcomposition using a natural number ```agda module _ {l : Level} {X : UU l} where iterate-automorphism-ℕ : ℕ → Aut X → Aut X iterate-automorphism-ℕ zero-ℕ e = id-equiv iterate-automorphism-ℕ (succ-ℕ n) e = e ∘e (iterate-automorphism-ℕ n e) map-iterate-automorphism : ℕ → Aut X → X → X map-iterate-automorphism n e = map-equiv (iterate-automorphism-ℕ n e) is-equiv-map-iterate-automorphism : (n : ℕ) (e : Aut X) → is-equiv (map-iterate-automorphism n e) is-equiv-map-iterate-automorphism n e = is-equiv-map-equiv (iterate-automorphism-ℕ n e) compute-map-iterate-automorphism : (n : ℕ) (e : Aut X) → map-iterate-automorphism n e ~ iterate n (map-equiv e) compute-map-iterate-automorphism zero-ℕ e = refl-htpy compute-map-iterate-automorphism (succ-ℕ n) e = map-equiv e ·l (compute-map-iterate-automorphism n e) ``` #### Iterating by precomposition using a natural number ```agda module _ {l : Level} {X : UU l} where iterate-automorphism-ℕ' : ℕ → Aut X → Aut X iterate-automorphism-ℕ' zero-ℕ e = id-equiv iterate-automorphism-ℕ' (succ-ℕ n) e = iterate-automorphism-ℕ' n e ∘e e map-iterate-automorphism-ℕ' : ℕ → Aut X → X → X map-iterate-automorphism-ℕ' n e = map-equiv (iterate-automorphism-ℕ' n e) is-equiv-map-iterate-automorphism-ℕ' : (n : ℕ) (e : Aut X) → is-equiv (map-iterate-automorphism-ℕ' n e) is-equiv-map-iterate-automorphism-ℕ' n e = is-equiv-map-equiv (iterate-automorphism-ℕ' n e) compute-map-iterate-automorphism-ℕ' : (n : ℕ) (e : Aut X) → map-iterate-automorphism-ℕ' n e ~ iterate' n (map-equiv e) compute-map-iterate-automorphism-ℕ' zero-ℕ e = refl-htpy compute-map-iterate-automorphism-ℕ' (succ-ℕ n) e = (compute-map-iterate-automorphism-ℕ' n e ·r (map-equiv e)) ``` #### Iterating by postcomposition using an integer ```agda module _ {l : Level} {X : UU l} where iterate-automorphism-ℤ : ℤ → Aut X → Aut X iterate-automorphism-ℤ (inl zero-ℕ) e = inv-equiv e iterate-automorphism-ℤ (inl (succ-ℕ x)) e = inv-equiv e ∘e (iterate-automorphism-ℤ (inl x) e) iterate-automorphism-ℤ (inr (inl _)) e = id-equiv iterate-automorphism-ℤ (inr (inr zero-ℕ)) e = e iterate-automorphism-ℤ (inr (inr (succ-ℕ x))) e = e ∘e (iterate-automorphism-ℤ (inr (inr x)) e) map-iterate-automorphism-ℤ : ℤ → Aut X → X → X map-iterate-automorphism-ℤ k e = map-equiv (iterate-automorphism-ℤ k e) is-equiv-map-iterate-automorphism-ℤ : (k : ℤ) (e : Aut X) → is-equiv (map-iterate-automorphism-ℤ k e) is-equiv-map-iterate-automorphism-ℤ k e = is-equiv-map-equiv (iterate-automorphism-ℤ k e) map-inv-iterate-automorphism-ℤ : ℤ → Aut X → X → X map-inv-iterate-automorphism-ℤ k e = map-inv-equiv (iterate-automorphism-ℤ k e) is-section-map-inv-iterate-automorphism-ℤ : (k : ℤ) (e : Aut X) → (map-iterate-automorphism-ℤ k e ∘ map-inv-iterate-automorphism-ℤ k e) ~ id is-section-map-inv-iterate-automorphism-ℤ k e = is-section-map-inv-equiv (iterate-automorphism-ℤ k e) is-retraction-map-inv-iterate-automorphism-ℤ : (k : ℤ) (e : Aut X) → (map-inv-iterate-automorphism-ℤ k e ∘ map-iterate-automorphism-ℤ k e) ~ id is-retraction-map-inv-iterate-automorphism-ℤ k e = is-retraction-map-inv-equiv (iterate-automorphism-ℤ k e) ``` #### Iterating by precomposition using an integer ```agda module _ {l : Level} {X : UU l} where iterate-automorphism-ℤ' : ℤ → Aut X → Aut X iterate-automorphism-ℤ' (inl zero-ℕ) e = inv-equiv e iterate-automorphism-ℤ' (inl (succ-ℕ x)) e = iterate-automorphism-ℤ' (inl x) e ∘e inv-equiv e iterate-automorphism-ℤ' (inr (inl _)) e = id-equiv iterate-automorphism-ℤ' (inr (inr zero-ℕ)) e = e iterate-automorphism-ℤ' (inr (inr (succ-ℕ x))) e = iterate-automorphism-ℤ' (inr (inr x)) e ∘e e ``` ## Properties ### Iterating an automorphism by a natural number `n` is the same as iterating it by the integer `int-ℕ n` ```agda module _ {l : Level} {X : UU l} where iterate-automorphism-int-ℕ : (n : ℕ) (e : Aut X) → htpy-equiv (iterate-automorphism-ℕ n e) (iterate-automorphism-ℤ (int-ℕ n) e) iterate-automorphism-int-ℕ zero-ℕ e = refl-htpy iterate-automorphism-int-ℕ (succ-ℕ zero-ℕ) e = refl-htpy iterate-automorphism-int-ℕ (succ-ℕ (succ-ℕ n)) e = map-equiv e ·l (iterate-automorphism-int-ℕ (succ-ℕ n) e) ``` ### Iterating by postcomposition is homotopic to iterating by precomposition #### For the natural numbers ```agda module _ {l : Level} {X : UU l} where iterate-automorphism-succ-ℕ : (n : ℕ) (e : Aut X) → htpy-equiv ( iterate-automorphism-ℕ (succ-ℕ n) e) ( iterate-automorphism-ℕ n e ∘e e) iterate-automorphism-succ-ℕ zero-ℕ e = refl-htpy iterate-automorphism-succ-ℕ (succ-ℕ n) e = map-equiv e ·l (iterate-automorphism-succ-ℕ n e) reassociate-iterate-automorphism-ℕ : (n : ℕ) (e : Aut X) → htpy-equiv (iterate-automorphism-ℕ n e) (iterate-automorphism-ℕ' n e) reassociate-iterate-automorphism-ℕ zero-ℕ e = refl-htpy reassociate-iterate-automorphism-ℕ (succ-ℕ n) e = ( iterate-automorphism-succ-ℕ n e) ∙h ( reassociate-iterate-automorphism-ℕ n e ·r map-equiv e) ``` #### For the integers ```agda module _ {l : Level} {X : UU l} where iterate-automorphism-succ-ℤ : (k : ℤ) (e : Aut X) → htpy-equiv ( iterate-automorphism-ℤ (succ-ℤ k) e) ( iterate-automorphism-ℤ k e ∘e e) iterate-automorphism-succ-ℤ (inl zero-ℕ) e = inv-htpy (is-retraction-map-inv-equiv e) iterate-automorphism-succ-ℤ (inl (succ-ℕ zero-ℕ)) e = inv-htpy (map-inv-equiv e ·l is-retraction-map-inv-equiv e) iterate-automorphism-succ-ℤ (inl (succ-ℕ (succ-ℕ x))) e = map-inv-equiv e ·l iterate-automorphism-succ-ℤ (inl (succ-ℕ x)) e iterate-automorphism-succ-ℤ (inr (inl _)) e = refl-htpy iterate-automorphism-succ-ℤ (inr (inr zero-ℕ)) e = refl-htpy iterate-automorphism-succ-ℤ (inr (inr (succ-ℕ x))) e = map-equiv e ·l iterate-automorphism-succ-ℤ (inr (inr x)) e iterate-automorphism-succ-ℤ' : (k : ℤ) (e : Aut X) → htpy-equiv ( iterate-automorphism-ℤ (succ-ℤ k) e) ( e ∘e iterate-automorphism-ℤ k e) iterate-automorphism-succ-ℤ' (inl zero-ℕ) e = inv-htpy (is-section-map-inv-equiv e) iterate-automorphism-succ-ℤ' (inl (succ-ℕ x)) e = ( inv-htpy (is-section-map-inv-equiv e)) ·r ( map-iterate-automorphism-ℤ (inl x) e) iterate-automorphism-succ-ℤ' (inr (inl _)) e = refl-htpy iterate-automorphism-succ-ℤ' (inr (inr x)) e = refl-htpy iterate-automorphism-pred-ℤ : (k : ℤ) (e : Aut X) → htpy-equiv ( iterate-automorphism-ℤ (pred-ℤ k) e) ( iterate-automorphism-ℤ k e ∘e inv-equiv e) iterate-automorphism-pred-ℤ (inl zero-ℕ) e = refl-htpy iterate-automorphism-pred-ℤ (inl (succ-ℕ x)) e = map-inv-equiv e ·l iterate-automorphism-pred-ℤ (inl x) e iterate-automorphism-pred-ℤ (inr (inl _)) e = refl-htpy iterate-automorphism-pred-ℤ (inr (inr zero-ℕ)) e = inv-htpy (is-section-map-inv-equiv e) iterate-automorphism-pred-ℤ (inr (inr (succ-ℕ zero-ℕ))) e = inv-htpy (map-equiv e ·l is-section-map-inv-equiv e) iterate-automorphism-pred-ℤ (inr (inr (succ-ℕ (succ-ℕ x)))) e = map-equiv e ·l iterate-automorphism-pred-ℤ (inr (inr (succ-ℕ x))) e iterate-automorphism-pred-ℤ' : (k : ℤ) (e : Aut X) → htpy-equiv ( iterate-automorphism-ℤ (pred-ℤ k) e) ( inv-equiv e ∘e iterate-automorphism-ℤ k e) iterate-automorphism-pred-ℤ' (inl zero-ℕ) e = refl-htpy iterate-automorphism-pred-ℤ' (inl (succ-ℕ x)) e = refl-htpy iterate-automorphism-pred-ℤ' (inr (inl _)) e = refl-htpy iterate-automorphism-pred-ℤ' (inr (inr zero-ℕ)) e = inv-htpy (is-retraction-map-inv-equiv e) iterate-automorphism-pred-ℤ' (inr (inr (succ-ℕ x))) e = ( inv-htpy (is-retraction-map-inv-equiv e)) ·r ( map-equiv (iterate-automorphism-ℤ (inr (inr x)) e)) reassociate-iterate-automorphism-ℤ : (k : ℤ) (e : Aut X) → htpy-equiv (iterate-automorphism-ℤ k e) (iterate-automorphism-ℤ' k e) reassociate-iterate-automorphism-ℤ (inl zero-ℕ) e = refl-htpy reassociate-iterate-automorphism-ℤ (inl (succ-ℕ x)) e = ( iterate-automorphism-pred-ℤ (inl x) e) ∙h ( reassociate-iterate-automorphism-ℤ (inl x) e ·r map-inv-equiv e) reassociate-iterate-automorphism-ℤ (inr (inl _)) e = refl-htpy reassociate-iterate-automorphism-ℤ (inr (inr zero-ℕ)) e = refl-htpy reassociate-iterate-automorphism-ℤ (inr (inr (succ-ℕ x))) e = ( iterate-automorphism-succ-ℤ (inr (inr x)) e) ∙h ( reassociate-iterate-automorphism-ℤ (inr (inr x)) e ·r map-equiv e) ``` ### Iterating an automorphism `k+l` times ```agda module _ {l : Level} {X : UU l} where iterate-automorphism-add-ℤ : (k l : ℤ) (e : Aut X) → htpy-equiv ( iterate-automorphism-ℤ (k +ℤ l) e) ( iterate-automorphism-ℤ k e ∘e iterate-automorphism-ℤ l e) iterate-automorphism-add-ℤ (inl zero-ℕ) l e = iterate-automorphism-pred-ℤ' l e iterate-automorphism-add-ℤ (inl (succ-ℕ k)) l e = ( iterate-automorphism-pred-ℤ' ((inl k) +ℤ l) e) ∙h ( map-inv-equiv e ·l iterate-automorphism-add-ℤ (inl k) l e) iterate-automorphism-add-ℤ (inr (inl _)) l e = refl-htpy iterate-automorphism-add-ℤ (inr (inr zero-ℕ)) l e = iterate-automorphism-succ-ℤ' l e iterate-automorphism-add-ℤ (inr (inr (succ-ℕ x))) l e = ( iterate-automorphism-succ-ℤ' ((inr (inr x)) +ℤ l) e) ∙h ( map-equiv e ·l iterate-automorphism-add-ℤ (inr (inr x)) l e) ```