Twist

Lane Biocini
21 January 2026

The twist automorphism of PSL(2,ℤ): the unique non-trivial element of
Out(PSL(2,ℤ)) ≅ ℤ/2ℤ. Geometrically, it corresponds to complex
conjugation on the upper half-plane action.

Algebraically, twist swaps r ↔ r² while fixing s:
  twist(s x) = s(twist x)
  twist(r x) = r²(twist x)

Unlike the group inverse (which reverses word order), twist preserves
word order but inverts each generator individually. It is involutive
and respects multiplication, making it a group automorphism.


{-# OPTIONS --safe --without-K #-}

module Groups.ModularGroup.Twist where

open import MLTT.Spartan
open import UF.FunExt
open import Groups.ModularGroup.Type
open import Groups.ModularGroup.Base
open import Groups.ModularGroup.Properties
open import Groups.ModularGroup.Induction
open import Groups.ModularGroup.Multiplication

twist-η : S-edge → PSL2Z
twist-θ : R-edge → PSL2Z

twist-η e₀         = E
twist-η e₁         = S
twist-η (cross re) = s (twist-θ re)

twist-θ (r+ se) = r² (twist-η se)
twist-θ (r- se) = r (twist-η se)

twist : PSL2Z → PSL2Z
twist (η se) = twist-η se
twist (θ re) = twist-θ re

twist-s : (x : PSL2Z) → twist (s x) = s (twist x)
twist-s (η e₀)    = refl
twist-s (η e₁)    = refl
twist-s (sr∙ se)  = s² (r (r (twist-η se))) ⁻¹
twist-s (sr²∙ se) = s² (r (twist-η se)) ⁻¹
twist-s (r∙ se)   = refl
twist-s (r²∙ se)  = refl

twist-r : (x : PSL2Z) → twist (r x) = r² (twist x)
twist-r (η e₀)    = refl
twist-r (η e₁)    = refl
twist-r (sr∙ se)  = refl
twist-r (sr²∙ se) = refl
twist-r (r∙ se)   = r³ (r (twist-η se)) ⁻¹
twist-r (r²∙ se)  = r³ (twist-η se) ⁻¹

twist-r² : (x : PSL2Z) → twist (r² x) = r (twist x)
twist-r² (η e₀)          = refl
twist-r² (η e₁)          = refl
twist-r² (sr∙ se)        = refl
twist-r² (sr²∙ se)       = refl
twist-r² (r∙ se)         = r³ (twist-η se) ⁻¹
twist-r² (r²∙ e₀)        = refl
twist-r² (r²∙ e₁)        = refl
twist-r² (r²∙ (cross x)) = refl

twist-involute : (x : PSL2Z) → twist (twist x) = x
twist-involute (η e₀)    = refl
twist-involute (η e₁)    = refl
twist-involute (sr∙ se)  =
  twist (s (r² (twist-η se))) =⟨ twist-s (r² (twist-η se)) ⟩
  s (twist (r² (twist-η se))) =⟨ ap s (twist-r² (twist-η se)) ⟩
  s (r (twist (twist-η se)))  =⟨ ap (s ∘ r) (twist-involute (η se)) ⟩
  s (r (η se))                =⟨ sr-η se ⟩
  sr∙ se                      ∎
twist-involute (sr²∙ se) =
  twist (twist (sr²∙ se))     =⟨ twist-s (r (twist-η se)) ⟩
  s (twist (r (twist-η se)))  =⟨ ap s (twist-r (twist-η se)) ⟩
  s (r² (twist (twist-η se))) =⟨ ap (s ∘ r²) (twist-involute (η se)) ⟩
  s (r² (η se))               =⟨ sr²-η se ⟩
  sr²∙ se                     ∎
twist-involute (r∙ se) =
  twist (r² (twist-η se))     =⟨ twist-r² (twist-η se) ⟩
  r (twist (twist-η se))      =⟨ ap r (twist-involute (η se)) ⟩
  r (η se)                    =⟨ r-η se ⟩
  r∙ se                       ∎
twist-involute (r²∙ se)  =
  twist (twist (r²∙ se))      =⟨ twist-r (twist-η se) ⟩
  r² (twist (twist-η se))     =⟨ ap r² (twist-involute (η se)) ⟩
  r² (η se)                   =⟨ r²-η se ⟩
  r²∙ se                      ∎

twist-product : (x y : PSL2Z) → twist (x · y) = twist x · twist y
twist-product = PSL2Z-ind base-E base-S ind-s ind-r
 where
  base-E : (y : PSL2Z) → twist (E · y) = twist E · twist y
  base-E y = refl

  base-S : (y : PSL2Z) → twist (S · y) = twist S · twist y
  base-S y = twist-s y

  ind-s : (re : R-edge)
        → ((y : PSL2Z) → twist ((θ re) · y) = twist (θ re) · twist y)
        → (y : PSL2Z) → twist ((s∙ re) · y) = twist (s∙ re) · twist y
  ind-s re ih y =
   twist ((s∙ re) · y)            =⟨ ap twist (·-s-left (θ re) y) ⟩
   twist (s ((θ re) · y))         =⟨ twist-s ((θ re) · y) ⟩
   s (twist ((θ re) · y))         =⟨ ap s (ih y) ⟩
   s (twist (θ re) · twist y)     =⟨ ·-s-left (twist (θ re)) (twist y) ⁻¹ ⟩
   (s (twist (θ re))) · twist y   =⟨ ap (_· twist y) (twist-s (θ re) ⁻¹) ⟩
   twist (s∙ re) · twist y        ∎

  ind-r : (d : R-sgn) (se : S-edge)
        → ((y : PSL2Z) → twist ((η se) · y) = twist (η se) · twist y)
        → (y : PSL2Z) → twist ((ρ d se) · y) = twist (ρ d se) · twist y
  ind-r cw se ih y =
   twist ((r∙ se) · y)            =⟨ ap (twist ∘ (_· y)) (r-η se ⁻¹) ⟩
   twist ((r (η se)) · y)         =⟨ ap twist (·-r-left (η se) y) ⟩
   twist (r ((η se) · y))         =⟨ twist-r ((η se) · y) ⟩
   r² (twist ((η se) · y))        =⟨ ap r² (ih y) ⟩
   r² (twist (η se) · twist y)    =⟨ ·-r²-left (twist (η se)) (twist y) ⁻¹ ⟩
   (r² (twist (η se))) · twist y  =⟨ ap (_· twist y) (twist-r (η se) ⁻¹) ⟩
   twist (r (η se)) · twist y     =⟨ ap (_· twist y) (ap twist (r-η se)) ⟩
   twist (r∙ se) · twist y        ∎
  ind-r ccw se ih y =
   twist ((r²∙ se) · y)           =⟨ ap (twist ∘ (_· y)) (r²-η se ⁻¹) ⟩
   twist ((r² (η se)) · y)        =⟨ ap twist (·-r²-left (η se) y) ⟩
   twist (r² ((η se) · y))        =⟨ twist-r² ((η se) · y) ⟩
   r (twist ((η se) · y))         =⟨ ap r (ih y) ⟩
   r (twist (η se) · twist y)     =⟨ ·-r-left (twist (η se)) (twist y) ⁻¹ ⟩
   (r (twist (η se))) · twist y   =⟨ ap (_· twist y) (twist-r² (η se) ⁻¹) ⟩
   twist (r² (η se)) · twist y    =⟨ ap (_· twist y) (ap twist (r²-η se)) ⟩
   twist (r²∙ se) · twist y       ∎

module _ (fe : funext 𝓤₀ 𝓤₀) where
 twist-gen-iter : twist = PSL2Z-gen-iter E s r²
 twist-gen-iter = dfunext fe lemma
  where
   iter : PSL2Z → PSL2Z
   iter = PSL2Z-gen-iter E s r²

   lemma : (x : PSL2Z) → twist x = iter x
   lemma =
    PSL2Z-η s r² twist iter refl twist-s PSL2Z-gen-iter-s twist-r
     PSL2Z-gen-iter-r

 twist-iter : twist = PSL2Z-iter E S s r² r
 twist-iter = dfunext fe lemma
  where
   iter : PSL2Z → PSL2Z
   iter = PSL2Z-iter E S s r² r

   lemma-η : (se : S-edge) → twist-η se = iter (η se)
   lemma-θ : (re : R-edge) → twist-θ re = iter (θ re)

   lemma-η e₀         = refl
   lemma-η e₁         = refl
   lemma-η (cross re) = ap s (lemma-θ re)

   lemma-θ (r+ se) = ap r² (lemma-η se)
   lemma-θ (r- se) = ap r (lemma-η se)

   lemma : (x : PSL2Z) → twist x = iter x
   lemma (η se) = lemma-η se
   lemma (θ re) = lemma-θ re