# Arithmetic Fuchsian Groups and Shimura Curves

In this chapter, we document algorithms for arithmetic Fuchsian groups. Let $F$ be a totally real number field. Let $A$ be a *quaternion algebra* over $F$, a central simple algebra of dimension $4$ (see Chapter [Quaternion Algebras](../../Algebras/QuaternionAlgebras/index-quaternion-algebras.md#chapalgquat)), such that $A$ is split at exactly one real place, corresponding to the injective map $\iota_\infty:A \to M_2({\mathbb{R}})$. Let ${\cal O}$ be a maximal order in $A$ (see also Section [Orders](../../Algebras/AssociativeAlgebras/alg_ass_ord.md#secalgassvord)), let ${\cal O}^*$ denote the group of elements of ${\cal O}$ of reduced norm $1$, and let $\Gamma(1)=\iota_\infty({\cal O}^*)/\{\pm 1\} \subset PSL_2({\mathbb{R}})$. An *arithmetic Fuchsian group* $\Gamma$ is a discrete subgroup of $PSL_2({\mathbb{R}})$ which is commensurable with $\Gamma(1)$ (for some choice of $F$ and $A$).

The classical case of the modular groups corresponds to $F={\mathbb{Q}}$, $A=M_2({\mathbb{Q}})$, ${\cal O}=M_2({\mathbb{Z}})$, and $\Gamma(1)={\operatorname{PSL}}_2({\mathbb{Z}})$. Specialized algorithms for this case apply, and they are treated in detail in Chapter [Congruence Subgroups of ${\operatorname{PSL}}_2({\mathbb{R}})$](../CongruenceSubgroupsOfPSL2R/index-congruence-subgroups-of-psl2-r.md#chapgrppsl2). To exclude this case, we assume throughout that $A$ is a division ring, or equivalently $A \not\cong M_2({\mathbb{Q}})$.

The group $\Gamma$ acts properly and discontinuously on the upper half-plane ${\mathbb{H}}$, and the quotient $\Gamma \backslash {\mathbb{H}}= X(\Gamma)$ can be given the structure of a compact Riemann surface, called a *Shimura curve*.

We exhibit methods for computing with arithmetic Fuchsian groups $\Gamma$, including the basic invariants of $\Gamma$ and a fundamental domain for $X(\Gamma)$. We provide further specialized algorithms for triangle groups. Along the way, we also present an interface for computing with the unit disc, parallel to that for the upper half-plane (see Chapter [Congruence Subgroups of ${\operatorname{PSL}}_2({\mathbb{R}})$](../CongruenceSubgroupsOfPSL2R/index-congruence-subgroups-of-psl2-r.md#chapgrppsl2)).

The algorithm used to compute fundamental domains is described in [[Voight, 2009](../../references.md#cite-voight-fundamental-domain)]. We recommend the following additional reading concerning the algorithms in this section. For an introduction to Fuchsian groups, see Katok [[Katok, 1992](../../references.md#cite-katok)] and Beardon [[Beardon, 1977](../../references.md#cite-beardon)], and for their relationship to quaternion algebras, see also Vignéras [[Vignéras, 1980](../../references.md#cite-vigneras80)]. For a computational perspective on arithmetic Fuchsian groups and Shimura curves, see Alsina-Bayer [[Alsina and Bayer, 2004](../../references.md#cite-alsina-bayer)], Elkies [[Elkies, 1998](../../references.md#cite-elkies)], and Voight [[Voight, 2005](../../references.md#cite-voight1)], and for a discussion of triangle groups, see Voight [[Voight, 2006](../../references.md#cite-voight2)].

- [Arithmetic Fuchsian Groups](ArithmeticFuchsianGroups.md)

  - [Creation](ArithmeticFuchsianGroups.md#creation)

    - [`FuchsianGroup(O): AlgQuatOrd → GrpPSL2`](ArithmeticFuchsianGroups.md#function-fuchsiangroup-algquatord)

    - [`FuchsianGroup(O): AlgAssVOrd → GrpPSL2`](ArithmeticFuchsianGroups.md#function-fuchsiangroup-algassvord)

    - [`FuchsianGroup(A): AlgQuat → GrpPSL2`](ArithmeticFuchsianGroups.md#function-fuchsiangroup-algquat)

    - [`FuchsianGroup(A, N): AlgQuat, RngOrdIdl → GrpPSL2`](ArithmeticFuchsianGroups.md#function-fuchsiangroup-algquat-rngordidl)

    - [`FuchsianGroup(A, N): AlgQuat, RngIntElt → GrpPSL2`](ArithmeticFuchsianGroups.md#function-fuchsiangroup-algquat-rngintelt)

    - [`Example: Construct AFG1`](ArithmeticFuchsianGroups.md#example-ex-3c7078)

  - [Quaternionic Functions](ArithmeticFuchsianGroups.md#quaternionic-functions)

    - [`QuaternionOrder(G): GrpPSL2 → AlgQuatOrd`](ArithmeticFuchsianGroups.md#function-quaternionorder-grppsl2)

    - [`BaseRing(G): GrpPSL2 → AlgQuatOrd`](ArithmeticFuchsianGroups.md#function-basering-grppsl2)

    - [`QuaternionAlgebra(G): GrpPSL2 → AlgQuat`](ArithmeticFuchsianGroups.md#function-quaternionalgebra-grppsl2)

    - [`SplitRealPlace(A): AlgQuat → PlcNum`](ArithmeticFuchsianGroups.md#function-splitrealplace-algquat)

    - [`FuchsianMatrixRepresentation(A): AlgQuat → Map`](ArithmeticFuchsianGroups.md#function-fuchsianmatrixrepresentation-algquat)

    - [`DefiniteNorm(gamma): AlgQuatElt → FldReElt`](ArithmeticFuchsianGroups.md#function-definitenorm-algquatelt)

    - [`DefiniteGramMatrix(B): SeqEnum[AlgQuatElt] → FldReElt`](ArithmeticFuchsianGroups.md#function-definitegrammatrix-seqenum-algquatelt)

    - [`Example: Quaternionic Functions`](ArithmeticFuchsianGroups.md#example-ex-755a66)

    - [`MultiplicativeOrder(gamma): AlgAssVOrdElt → SeqEnum`](ArithmeticFuchsianGroups.md#function-multiplicativeorder-algassvordelt)

    - [`MultiplicativeOrder(gamma): AlgQuatElt → SeqEnum`](ArithmeticFuchsianGroups.md#function-multiplicativeorder-algquatelt)

    - [`Quaternion(g): GrpPSL2Elt → AlgQuatElt`](ArithmeticFuchsianGroups.md#function-quaternion-grppsl2elt)

  - [Basic Invariants](ArithmeticFuchsianGroups.md#basic-invariants)

    - [`ArithmeticVolume(G): GrpPSL2 → FldRatElt`](ArithmeticFuchsianGroups.md#function-arithmeticvolume-grppsl2)

    - [`EllipticInvariants(G): GrpPSL2 → SeqEnum`](ArithmeticFuchsianGroups.md#function-ellipticinvariants-grppsl2)

    - [`Signature(G): GrpPSL2 → SeqEnum`](ArithmeticFuchsianGroups.md#function-signature-grppsl2)

  - [Group Structure](ArithmeticFuchsianGroups.md#group-structure)

    - [`Group(G): GrpPSL2 → GrpFP, Map, Map`](ArithmeticFuchsianGroups.md#function-group-grppsl2)

    - [`Example: Basic Invariants`](ArithmeticFuchsianGroups.md#example-ex-5d9bc5)

- [Unit Disc](unit-disc.md)

  - [Creation](unit-disc.md#creation)

    - [`UnitDisc() → SpcHyd`](unit-disc.md#function-unitdisc)

  - [Basic Operations](unit-disc.md#basic-operations)

    - [`D ! x: SpcHyd, . → SeqEnum`](unit-disc.md#operation-op-spchyd)

    - [`x eq y: SpcHydElt, SpcHydElt → BoolElt`](unit-disc.md#operation-op-eq-spchydelt-spchydelt)

    - [`a * x: RngElt, SpcHydElt → RngElt`](unit-disc.md#operation-op-times-rngelt-spchydelt)

    - [`x * a: SpcHydElt, RngElt → RngElt`](unit-disc.md#operation-op-times-spchydelt-rngelt)

    - [`x + y: SpcHydElt, RngElt → RngElt`](unit-disc.md#operation-op-plus-spchydelt-rngelt)

    - [`y + x: RngElt, SpcHydElt → RngElt`](unit-disc.md#operation-op-plus-rngelt-spchydelt)

    - [`x + y: SpcHydElt, SpcHydElt → RngElt`](unit-disc.md#operation-op-plus-spchydelt-spchydelt)

    - [`x - y: SpcHydElt, RngElt → RngElt`](unit-disc.md#operation-op-minus-spchydelt-rngelt)

    - [`x - y: RngElt, SpcHydElt → RngElt`](unit-disc.md#operation-op-minus-rngelt-spchydelt)

    - [`x - y: SpcHydElt, SpcHydElt → RngElt`](unit-disc.md#operation-op-minus-spchydelt-spchydelt)

    - [`x / a: SpcHydElt, RngElt → RngElt`](unit-disc.md#operation-op-div-spchydelt-rngelt)

  - [Access Operations](unit-disc.md#access-operations)

    - [`IsExact(z): SpcHydElt → BoolElt, .`](unit-disc.md#function-isexact-spchydelt)

    - [`ExactValue(z): SpcHydElt → .`](unit-disc.md#function-exactvalue-spchydelt)

    - [`ComplexValue(z): SpcHydElt → FldComElt`](unit-disc.md#function-complexvalue-spchydelt)

    - [`Im(z): SpcHydElt → FldReElt`](unit-disc.md#function-im-spchydelt)

    - [`Imaginary(z): SpcHydElt → FldReElt`](unit-disc.md#function-imaginary-spchydelt)

    - [`Re(z): SpcHydElt → FldReElt`](unit-disc.md#function-re-spchydelt)

    - [`Real(z): SpcHydElt → FldReElt`](unit-disc.md#function-real-spchydelt)

    - [`Argument(z): SpcHydElt → FldReElt`](unit-disc.md#function-argument-spchydelt)

    - [`Abs(z): SpcHydElt → FldReElt`](unit-disc.md#function-abs-spchydelt)

    - [`AbsoluteValue(z): SpcHydElt → FldReElt`](unit-disc.md#function-absolutevalue-spchydelt)

    - [`Example: Unit Disc Basics`](unit-disc.md#example-ex-98d2b2)

  - [Distance and Angles](unit-disc.md#distance-and-angles)

    - [`Distance(z,w): SpcHydElt, SpcHydElt → FldReElt`](unit-disc.md#function-distance-spchydelt-spchydelt)

    - [`Geodesic(z,w): SpcHydElt, SpcHydElt → RngElt, RngElt`](unit-disc.md#function-geodesic-spchydelt-spchydelt)

    - [`TangentAngle(x,y): SpcHydElt, SpcHydElt → FldReElt`](unit-disc.md#function-tangentangle-spchydelt-spchydelt)

    - [`Angle(e1,e2): [SpcHydElt], [SpcHydElt] → FldReElt`](unit-disc.md#function-angle-spchydelt-spchydelt)

    - [`ArithmeticVolume(P): [SpcHydElt] → FldReElt`](unit-disc.md#function-arithmeticvolume-spchydelt)

    - [`Example: Unit Disc Angle`](unit-disc.md#example-ex-f69b8f)

  - [Structural Operations](unit-disc.md#structural-operations)

    - [`T * x: GrpPSL2Elt, SpcHydElt → SpcHydElt`](unit-disc.md#operation-op-times-grppsl2elt-spchydelt)

    - [`Center(D): SpcHyd → RngElt`](unit-disc.md#function-center-spchyd)

    - [`DiscToPlane(H,z): SpcHyp, SpcHydElt → SpcHypElt`](unit-disc.md#function-disctoplane-spchyp-spchydelt)

    - [`PlaneToDisc(D,z): SpcHyd, SpcHypElt → SpcHydElt`](unit-disc.md#function-planetodisc-spchyd-spchypelt)

    - [`Matrix(g,D): GrpPSL2Elt, SpcHyd → AlgMatElt`](unit-disc.md#function-matrix-grppsl2elt-spchyd)

    - [`FixedPoints(g,D): GrpPSL2Elt, SpcHyd → SeqEnum`](unit-disc.md#function-fixedpoints-grppsl2elt-spchyd)

    - [`IsometricCircle(g): GrpPSL2Elt → RngElt, RngElt`](unit-disc.md#function-isometriccircle-grppsl2elt)

    - [`IsometricCircle(g,H): GrpPSL2Elt, SpcHyp → RngElt, RngElt`](unit-disc.md#function-isometriccircle-grppsl2elt-spchyp)

    - [`IsometricCircle(g,D): GrpPSL2Elt, SpcHyd → RngElt, RngElt`](unit-disc.md#function-isometriccircle-grppsl2elt-spchyd)

    - [`GeodesicsIntersection(x1,x2): [SpcHydElt], [SpcHydElt]) → .`](unit-disc.md#function-geodesicsintersection-spchydelt-spchydelt)

    - [`BoundaryIntersection(x): [SpcHydElt] → [FldComElt]`](unit-disc.md#function-boundaryintersection-spchydelt)

    - [`Example: Unit Disc Practice2`](unit-disc.md#example-ex-b11ad6)

- [Fundamental Domains](fundamental-domains.md)

  - [`FundamentalDomain(G,D): GrpPSL2, SpcHyd → SeqEnum`](fundamental-domains.md#function-fundamentaldomain-grppsl2-spchyd)

  - [`FundamentalDomain(G): GrpPSL2 → SeqEnum`](fundamental-domains.md#function-fundamentaldomain-grppsl2)

  - [`Example: Fundamental Domains`](fundamental-domains.md#example-ex-456f00)

  - [`ShimuraReduceUnit({delta, }{gammagens, G, D}): AlgAssVOrdElt, SeqEnum[AlgAssVOrdElt], GrpPSL2, SpcHyd → SeqEnum`](fundamental-domains.md#function-shimurareduceunit-algassvordelt-seqenum-algassvordelt-grppsl2-spchyd)

  - [`ShimuraReduceUnit(delta, gammagens, G, D): AlgQuatElt, SeqEnum[AlgQuatElt], GrpPSL2, SpcHyd → SeqEnum`](fundamental-domains.md#function-shimurareduceunit-algquatelt-seqenum-algquatelt-grppsl2-spchyd)

- [Triangle Groups](triangle-groups.md)

  - [Creation of Triangle Groups](triangle-groups.md#creation-of-triangle-groups)

    - [`ArithmeticTriangleGroup(p,q,r): RngIntElt, RngIntElt, RngIntElt → GrpPSL2, Rng`](triangle-groups.md#function-arithmetictrianglegroup-rngintelt-rngintelt-rngintelt)

    - [`AdmissableTriangleGroups() → SeqEnum`](triangle-groups.md#function-admissabletrianglegroups)

    - [`IsTriangleGroup(G): GrpPSL2 → BoolElt`](triangle-groups.md#function-istrianglegroup-grppsl2)

  - [Fundamental Domain](triangle-groups.md#fundamental-domain)

    - [`ReduceToTriangleVertices(G,z): GrpPSL2, SpcHypElt → SpcHypElt`](triangle-groups.md#function-reducetotrianglevertices-grppsl2-spchypelt)

  - [CM Points](triangle-groups.md#cm-points)

    - [`HypergeometricSeries2F1(A,B,C,z): FldRatElt, FldRatElt, FldRatElt, FldComElt → FldComElt`](triangle-groups.md#function-hypergeometricseries2f1-fldratelt-fldratelt-fldratelt-fldcomelt)

    - [`Example: Hypergeometric2F1`](triangle-groups.md#example-ex-38d10e)

    - [`ShimuraConjugates(mu): AlgAssVOrdElt → SeqEnum`](triangle-groups.md#function-shimuraconjugates-algassvordelt)

    - [`jParameter(G,z): GrpPSL2, SpcHypElt → FldComElt, SeqEnum`](triangle-groups.md#function-jparameter-grppsl2-spchypelt)

    - [`Example: Triangle239CM Points1`](triangle-groups.md#example-ex-590fd7)

    - [`CMPoints(G,mu): GrpPSL2, AlgAssVOrdElt → RngUPolElt, SeqEnum`](triangle-groups.md#function-cmpoints-grppsl2-algassvordelt)

    - [`Example: Triangle239CM Points2`](triangle-groups.md#example-ex-319e1b)
