# HG changeset patch
# User Hartmut Monien <monien@th.physik.uni-bonn.de>
# Date 1313789623 -7200
# Node ID 2b2f5208e9e48b51a1da2a79e90d48b3172d46d2
# Parent  ce324e28c3334398d3552640e2cb1520d22465a3
11709: Implement Farey symbols to compute with subgroups of PSL(2,ZZ)

diff --git a/doc/en/reference/arithgroup.rst b/doc/en/reference/arithgroup.rst
--- a/doc/en/reference/arithgroup.rst
+++ b/doc/en/reference/arithgroup.rst
@@ -18,3 +18,4 @@
    sage/modular/arithgroup/congroup_gamma0
    sage/modular/arithgroup/congroup_gamma
    sage/modular/arithgroup/congroup_sl2z
+   sage/modular/arithgroup/farey_symbol
\ No newline at end of file
diff --git a/doc/en/reference/media/modular/arithgroup/fun_gamma0_11.png b/doc/en/reference/media/modular/arithgroup/fun_gamma0_11.png
new file mode 100644
index 0000000000000000000000000000000000000000..744231a27c4226b83ecb7ffabec98b17ff722b6a
GIT binary patch
literal 13547
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
SpXY#phpeQMM1`1f$bSR&5ETpn

diff --git a/doc/en/reference/media/modular/arithgroup/fun_gamma0_23.png b/doc/en/reference/media/modular/arithgroup/fun_gamma0_23.png
new file mode 100644
index 0000000000000000000000000000000000000000..7672706336ff48967bb135c843d7fc238c011527
GIT binary patch
literal 57654
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
W3EpM9k^*SYD_Kb;i7N3g0sjwPfqo4D

diff --git a/doc/en/reference/media/modular/arithgroup/fun_gamma_3.png b/doc/en/reference/media/modular/arithgroup/fun_gamma_3.png
new file mode 100644
index 0000000000000000000000000000000000000000..c8e77ce7886bcbc8ab3bdcf0ecaf2f3d6b54a949
GIT binary patch
literal 8466
zc$}qr2Q-{*yR{@DB%&k)(R+#LQ6@?RVU*Fk=q(b_OSFkz!>fmhh%w3#MD!j6L6E_y
zVbthE8J+yM_j}K`*1yhw*7?@@t%sRs<|+4mUHjU5U-u(g3#NSY`rYdU1OzvsDvCM;
z1efsOeG@Se_**2lfC4Xs9*?1V#Na1@*ft96lenrFdk_$iTV4EKDwHdDMnJ$q09BON
z^L@851%EM&KfCsOY00AnzF+FI@f2=eR(TcvA!oxD4VlQGTMg+=`<5RM>q?tp6Q*F{
zGxp3xYJ0wncM_A2x)BALi!<O9rREf>`S`jv+NwTHWCeO}aPZE=bYL_5u*p=dY~$?k
zXQ1ps-4Z)%4zq0bK+|S>L-y#>?m4eY5=U@URFwPsLQeukMMVyBE-yAVwl|hK+-z)v
z#Q)h&R2(<{00(EjXYlcnu`!*Z_SgQbhYnMQNgSj%Zw4p-q@<+e)XZKXr)6a9Na9rc
z<cD`UT~?M0VIi*A^k4W!IXpT#|074?)8s}5*_)^+6>0{uYnOu`O)Pc$>R2=fNTmr{
zykALRWn=5{f1&%Y8@8Yetmix5{8%f99GRGiLA<Po=74EL4Qr-C&$hdm9S{&oO6?@0
zGnk?xic)<QOzm#s_Ub`mBIP?tH@1Bb7Z<^J2C2&lU7;~CG3sz>aP;)IL&P!e&$$m6
zPi}KFQwYmU@HM7Kfq^nizB9q<a4~R<dG{g0&%;BMEm0+3E+Q(5XRBNz3k;cEPYQJ(
z0?V=)ijIo9RnUX#ce}V}w+;RwC1v6hA@prZ%4dYhkpH$*`1#;rWaZxxN`+=AOn^Bg
zb*=jRM>)_Zdp0i#K0q#@MbIAaE@r%wR2sCky!=RrHmt*1-o}QVj6qUptvQJ!r>Tjt
z)so^#E@ekY$Kj$NJlbQaKaU#BiLx(6PX|}wKt57p8o9sk%^(-V(AU@J=<KXyVPWy}
zEIV-D`1F@VOKT{(Y!v*@32v;(Ut)h_GO}T_UM+0~%y$`{q`Impd&Ds@G2uGtT*FF1
zY`Hd4^84h>_g99)+$MZ|OxP?Ck3Ae82#V<GQT^%KezO)oVv3oXy07*dglSKXgd4xT
z?dIv@lbe@kH?eQmn>IVs8tRr{TyA|eo>`8m7`e5wBJbe99dy{voKGnNhTW0us>4i6
z`$&=@0=Jc2J+-u()6ychDO^%g;=9w$?bd!%;)|mgvcCSVTDm|7dxCV5`7pSbn8HL8
z?yCG-JZ^t;D)uJ5_=nuwE2B?+7-j#QdVGA^aED&}#TO6?2N?kf%9)SMg`JHp)3gmb
zwT6FOFvLoAU1M?@hf7FGN~-Outf{fV7U>%``8^=8oNWvDT}V`RT`Q@X1GstJJ{#rF
z@UPSg&aV38Vxl4<h&;W#I;x>bVP_`?xo9-+rtt0Cw<$VSm|2N0vn3L9adYdEW&jAx
zL5mJfj`3^d9!s$GiK-hiGBRV8&u%}?p&0pSe1*XA`SbR(103_@pKEf5m%P`<g450Y
zND5$CZRckv<*#<_&ERKv*M_N`pxXc)(&>7L<DS%e!jh6veF%y9y_F%OMqgpb!-v}1
z+Ls8H*VYgtcg|-*$uARZHXWFs9<=-k?_GTS{Q152zH=l;&6mIwE)ftylQ{B1qaXo?
zLaS?QZp%Mds{xL+r(Go(hzT!0%Z@C*nCib_?Vc(w(4?xUm?Evu<rRNXwW>_TH~<#0
z5a{0p^LF^Z?L1Cx!bzb31Ms{mQeR~ld~$KRLCgPCI{$YaxvS83U3~C&9nD`{FDcy<
z@2{+UEu@u&|IUrO^z?2sUxK9$<a{<6MoOQ?4i4(jzIif?#m-iZnyX1!g2IXsL`&dh
z{P!)V>b-nt!)aVMsz&El3bLPoSe)a_;5kU7b>}%qS?zWwJtZ;W?@oG`4=5BNh<pgf
zF=gWh1tld$0z?X>=wn{*$y-{#$|wEjbhq5Os;a7XG0pT705;u;+`&(e!?P`Tf=ySv
zJVn^60r=r>tA9xFV-PnRvT@c`l7g6UP*$@IyEQ*Qzr4BmL`|)?a-%oxetT=^wRxu9
ziRWcGXf(<5k&nT+EoC9vulX7XAz|Ufe=yz#4Yaf*n02KMYJpF9XAeZ4pP$!u1)Lu(
z`EGa6<czLuZ#Hbrp$p!(#WOy19gsOd(LA`Ig1@}C4(f`q?1{uZJw2bCC&dZAP#c;B
z>lVPQ+9PfrPHhEU3vH!1s9pZ68ZFrfQswxPgxjlZ^hOpeQj15-*&hy<Q&m-+W70J-
zxsK=)cb;quzu~q$r$kCd*6+KPF!z`E1z&NRoxK#hi}~^6b!lnom^d`)6Z}t**n<Zh
zGQYsYI-+lL=Q}@in<G@`x-HG58N&+lsx1wDqifL;B;&pLGx}+RcTPdUHH5hHV;-uu
z%m>d22%MdrYyX^|*qq?JMxPRgKOU=fV?W=`{xdV>gX?G~my5#|8xEM@fgUKLp+y>j
zi#@5d3=Cg?^&#Aj_nz^aH_~QhWt9uB1_lNWO|<p)_LjTgWItN8Fu?)iXlZG^)-N{b
zU_1wyR9t~Nz4Oa=yCB@f+>Z$t;AZpET?`R0%lrQVuU$N>Ak@4pveoi6PfYn@@>Tgq
zo*__Z5=FEkNNsR;H#Dr>ic^6r)h0uS{9k3InlSz%0_zmsZ5sm40vkBpyewhLHJLJ6
zk%BDJMq(j4n#8Qu^-^wbZmsXOHBs{=bYGqwU*=cc`?^US9X+>tQv&odhNF4hxROZ>
zimC6!UIiO?kK}Rb&E$!pP!ir;jY(7?q!BRtGB!rr+1V)sfy4l|HkQl&+-ob+YF+-d
zN1v-Fg@w5MTEAMkdR{y<i>He?grH%HtYC;FvR&BOPLVSTNnDJ*UW~mvDGuh6lfw$U
zft9VTV(T)GHb!L86QXaL9}yWTEG8DVyEJf*HmhD3eS48Wo61JQtYJ#v#5DOQDbW>a
zCUUT~&AP7JOG`_WQr{=d7**5`16-TRn*}TIRPhj@CFSAgSG2NXZJQP9&z57pr<<sv
zxbj;s6q=>d@j{#)oX<d}th$lr^kHaa#=Q<~7Xb$MZEcm0d-H~u(Zu|-Ny%?tX;(;=
z)YJUy*RNlsUxg!NcGilNl=PE&Fu0Nzq5SK~jfk%K;BH$T2!nAnl2+}vjg8F(rbaE`
zC7wo^+{Bm71ZcqRzS~y}&VEy+>M#mPNJ9hNU37l)7YlkB!7Lj<i^t<@H|y6VQEztQ
zF^*y2g1w76f%=8-fEc*#uN#BHv37UYS#cHPoFJX^ZrCkV4?M$<($dm?%Me-ohbI#F
zaKnH(ccMZ12bMy67kkE6e|RqA{ivv^Tj#fDip!eY(k+6z#RtV!JRyexvb9s2jrVoU
z%V@&G!zKOq`I}F7dK>9z%6d?+6mmuFI8M<jpMYK>ZK_$k->i3o+pq6*U?9Joshx@l
z<sWHlQ#P6l_EI(T>S89!f`c!CusAlWbK+a3F_>UWA>!DMkj~C043e%aIrHXzD<Jt%
zX=!OGAsmBuf#a&Lhk$Wy|MDlvf?aFDC4l`}Gl9JJZaOd;qgq$inAlk3d;!Xmy29e(
z(8&!0$h$bzLwL}@dl{pemy8pWlWwPnZekJ=xm8uvpk6(gMu&z%-_T3U9j}!Q^g6L1
z(IC&OtE*Z%I><vK%PLWT2|+<+4UIRyAU@sQPF2Y2>N|OPdHlM&Lg1@=_Y|C+@AKb@
z9h|jQY=fS4b7w1>n$o{)*bpbYeCfqhJ#|nE^MLg3_m5qm0DlIZZ1^tcL~1>KT5{w>
zjvOZrc@4BgPhY>)QH+lf1`|f~8GW+66d;>Dm{S<TLd?U<D=$Pl{F5hIT{J_zu(TBT
z6+;NsIA_XmS63G>K{C0=0pp+TBz=F+eC(3h`=J1wQ|)g5!;BxiE=oAm^&2;gO;eGM
zrfwP<H*eDtfZ%3k-u0DcN<&kTgb<XC7T0Bd2wQa`A|e76?;wpm3}`l<#F8^ezTTLu
znP0}_mOJwYq-X-f;<g+_(zW+W&c0`eN_zZ?8=U27+d2@<=;blVzc~GRcnTS}^RowE
zz8e&RVk~#U{;gl2pyHf0_nc+w_g3{7DqwYA9mUuvh<}%eTmi)g0M|bIr8}A1!=Ayt
z9u(>2;Me)nd{{P<+qN~6n8``RkR4wRY7_65Gqhqa-LZFYkc&ducAf)gN$2P9UvAwI
zGghs_aT%IqDMb6brseFWS{i=_epeEf<(@J1Qdvn!$y{SUhp-qMbM?lZ4>dJ3fQz&M
zC_azBDE#=*Hlyd0W5p8}7ngpR6haG8k8xB~P`FZGUvE9h0llz9nBieDn?Jn*4W!KQ
zQ{i|fnV4MVgt>2t?6pU~5Zfg#fj5*Bm^v2IEd+29EIO0`qK{a<AY9UDNs06f4Rb$y
zc(kG=lK<%wg}%N%zpgQIbd8df$irLG4#@M`Xjxa0e({f=KjZTAxn4|G-^|e>2C{sK
zpt7ner?HX2wE6|$h|I*=8`rP@#*bQv<|Nyvrl&8hzhOy_Mn>)IxWDbQ*Qkt!>6@59
zN=TAFD^Mw=q^1H|odHfwH8MFREct)2Zys?d7UK0W`ApQ%3gCnMk~8&jYUkSzGStDh
zy+;^vBo9c}7yAlcM%C$CgsjztgMX)M)mmR*+5K-TrwjYB;z>*ty55LlV`pbyURmiL
z|0)n;{o)r)ClZ6v-rL)=6)W$p`fy|E7KbY3?Rv=g3vqz?McY0Wuwz_eaIy1suc0W;
z6*Oi>4c_;`2vf<zc?7sTy?Q&o_J@_etV<fxm(muBtW3-l&RL3Zv>pgA^5xq5NujZx
zQ5vHeS<fsLr58aWQ?t-U|M0fo%V;j|sx)3MFC>TSld_*S730>qp2Iv8#6mesv;YjC
zmB?$4iUn#Tzqq)_P@R_h4#o|*BbCf10#qcKX|Fa}q(W+OBTy2~FZ0{3))@?jdU}Kf
zLugN0VZb%-jJUec+s$84FfsCmsnQ;9chz{HVi`**_7&rEr3m>tB?`inw6vn4qcCWe
zBN^zPsHv%oHmDT3qx*;R7o=B-LWAv86_9pLrF8lg(7&B0^d_Oamh`2+PDzPEky-DC
zQwUU;{F=<u#%C5j^dxn-t)hs6TC&%2o~QKLhjz`k&dgXE$bnuQjXcg?a40v@($fnQ
zb?E208wp4~I>o-qWIP%=A0W#d_rzvIcEGy)%NpK(W0&Uy8GD^K8k)6y3qz*=Vt2TD
zIjLm)i%2T7qPAWDj1WXkEhQzz7JoB7#iq)nVrPGS_lOD}n!7H9==*&X5ECey48c%|
zBW}K|F<lYji3NcZ&2%j>xCb0pXTRp^Jl>Cb?O`j3jS^_;i&b{xcwzum_KqDH=kI7%
z)+vz`t)Df!%|8J$Q(0X-mydX<!ym5}DWb$ii7nel5z14r#IOO<;eh_d0j;`6+t)F_
z{b@o*6JSM>fsB-#yw}gXX0p%eK-x|mp$#M!D5D+TLqB7<LJFlpL1@H($Ed^rY@iIm
zw(MC?r#XtTeef?U1eDs!(~}C=8sf-y<7h)DQ7Ef-)^~f+JwF*zB88v$a8793!U6{u
z7nhK%Y<zjSa9mv63~-~@6=mhLskHU<P@c3XmKL1ga~&E&c}%sw&ijES8=V27igD7K
zNk%nTw80xduURk}|Ih?kUzMaV;H2W><E<SXi4_zS=wf9MU~;{SA?>rTu}&IJZKU!P
z*5oP%#Sg^g+&OMV%aDSW*YNGzx8L**p}c&2b73s6`hi{A@Sa~EulW2f!7k<^qe}`Z
z^%_mNx$M>ZF8}V=2V_t9Gcz--p|kaCr3!|Ih9;K^01XjfvDiX1IvALQ4(r6c5;Y1!
z(82)i)H5)!2K^@wA79US#y3F0z=MBs#IRlP$ckr=x5q6dN|0$lq(D&>SSYjtQu&(9
z2jbNUXAlziq&7()S@Cu;1OdCQG-cwVx=F{Vf4U$?7niQ>`7R7#w~-NpJv_c+>JKo}
zUkBjl9-v#F&rOhR(>Ht?zSx^SpR6gH$a$y;-~bE;zey!As1;*l$dIMbm!(}RFuWq;
zM{Jbd4UEB$2)w+!fWe}J^H36AB8$AzYDob)Bp@?-D22p<rQTIRMs&J)S$ZB_er>I!
z1M@1>+&vYoNTPE~rX@|_X-six{q+I4KLIaHfpEX9TfFlE=;!o2Cp2Vqtt0SYDiZYd
z-wzMkBgrooaw5qXRU0&(0$NQ;`LgJaMlP)^FY~~%AmPBp<|$;f+E?UMR_akR`T@%b
zWbm^%76~-O*|~(ThZwCO$<SGl9hB+rpxI=e5PpN^v%0oA$E{ZI8N>m1FS4Dr_jH@2
z<$YX2LT*C?{r&s*hpGilt4XhsGpR2#EDdCLjg1*~7T_v@Se2B713S|vn1*#y0&b)z
zKRQl;-bi0RFD8sEK-YO?_vn*lYskkv#RFgIB3^bB86-=f#6M+p%`OA^Oi}y0iHG`s
zb#}g;^@Fn6<Y#ARBw6#*{#)T-<_YlA`30o<k6{iwAzG0gx)ll~N?=_8YGS$^s!XU$
zcHSp+Sa%;PXjQVaVDfY{R{3?s5HB>GQoXkd6mPfLB*;X_oo^@j9!&WxZO~FP7RX`)
zY(@Yl^z`<6Sif@<%ZYfL^Res}C-LRepcbd(BRxzcOTkcdbF=KYe^0~I%W8ieGr*D{
z$zbA|tF<8^m-l@OY5^kO!5li3l{w9hfphePFh0)tQMmyI56n@<?pTRw4YH|;ajS8c
z4D{(sXCH05(Eid)hi5@pZZsO{d=4(y)YN2rqz?K_OQE--j0Z?0xjeV#d-Y?khcx@J
z{5s#JX;d$LFI8U$phsym_kVSmLe46g9MG{AxEv@bdzsDcF6OR_cCZE)M2|b)uNjIJ
zk2h0a*6qehS<6DQ$Uv~9(tqSCYAf2=<-JJ01!NAp$Ijvfyap6|Y797uKaKQ>VqL#=
zx$S9l^04H4{Mx9^Qh(N1)pHs@Kfh1UhPc8Wvwk$LAR_oNG7@pJ)go8@=OVHee~w4T
zngbt(w6YwZoM3Rcgv3Nj<B$P-7*p!XS0;_+y7ylf)Yk)Ykw?TKf9XkS>v9|EaLZGO
zn8T7(SMM2?e$~~K2?rLy27^@c-D*1cF+NUbDpy@r=3-J%=kWd&(Z$NdVw$OziOJoQ
z-LJPbQH-?)xBT?-Z#96I6ozO}0)Tnxa@k7wcz9GCTbAG5P~3HcWYNjMb>@df?_=Cn
zP1KfkZvtu_=`5`Zlhx<A1+9BCwdl@U9dc{&Jt#Q_K)4>8^PUiGW8;jxD4tRL-ro0G
zAG^SJ^(K;8us$x&8N?r>y0l=up+k>4CES?qQBX#Z4wo}@!8yw=CMmId2ib$Vkd2GA
zHqdepRj+wMfW|tB=P1{il~zu^iH(hYfP1D))q%p*UX}kgas4&wX0%>$#cCEf8&%qK
zDYfF}vwJ{^Vue41uzdLVk(3+uPUTsVYI1jqL~oP{{~anCn)zPA7IjB>!&LvPX<l9c
zNzl>K2%5*8Y>6Y@>@sTU0GZ&wa|3j<wsJoGKc~zD49)f3=tv_{if8Zf@rhX=g!O^H
zYQz3M(u+`$_0VsvP}k-Y(SPaAhF-%Tzv8aNAVWezP=DqFWi9&Sl{8a<aiFB#wR*st
zXI<*vj)I}Tt)a{f4AN?_rl8dzf%{a9zpJsa>$4XPkj1?_d8?k^=-AA9l+pLAwojZW
zRDRowfkz@kJwI;Y0hZef(U&&rV%Yt$!&FBn$q>7lp6PPaw-}q*;i#fUC?7SsonjX=
zm>9j2TZCdN)1`GdfBabO+ub*vjV-O;YZ`M#l&@&ncbuGAXCOUok*9@xXp8#Sjj)2=
zwVFMiESSWWd%Riu5xvKKmv8h!dF<v#R{tDW6fAt4&-By}&n<UEBG9ld5}vDb4H)7I
zhk?#B32mynh}}Pk=daoW)*h+sSnF`tY224XlUl?p>qBMuAh19HP1Q)`UHb|;AcUKq
zsV{2~Hf05X>)nze&qa6`w;{$m2l0c#Rq7frSdTjlo2CMC^u8zkZAnw@r%yt?iG`+(
z)dK-rE{|3k_Hwj}b%k`jl^!0LPn^Ev!*b#0=B)D+v=|G9q;h>EMz3Z=DZ=R5C*KZ3
z$#jd=jPq5<Fe03W_y(tB$YhcIEy7FU2<Hj$ej6rS-tC8<q!StPWgk@}5OuS<Bta(S
z<{S1lUU&1!=3*q51{Be6k54-9iX?^pB#$goUwxPJ%sZXSjSGJ$5XfWuhcu~um|kd0
zm*ZNUg`{4_u!QqO7{aBQuEA%^078Y$$o%RBc{&ZtMns`UBcNFeLJtx}(a8)80?Oc8
zf-R>a=I}GGpMGm4AUqHZs~CWOfLgY)=Nz)XA11!U@tPd78!OA;?d|O@X?ocx{})Z*
z(enCw%3?qfe`>(x_XwUC-?fsOF_?71^18cA6F#jiae-+1^%9N70>5swRYs=8UbsT3
zNFHe6Jz}SgjPj%<Mr<jxn=yJinoDS{Xd7J_fhpAc=cBw>o5ez=zPzn_UFE6)_5w_Z
zc(c=He%%Z?0|E8b>r9AMH_U3LUa~>y(*n-~4P}8Ki|N;*@D~vG?UT>ycIQTQwk78V
zNgTkz4b%;M`$kOgHLK<!B_JOuuNOsKS#ofu<m6=9yLVN2%a<m+RF}rkqkM>LL~PeD
zlSWm>UXi@bf$tqQ$-KH`kv9GDEg>9Gok2>JCGb^OuU;KL<Y8lD(}4JF{*0p&E$A`P
z(Ol4IDk!*SXc73}`1tr2DFg?gV{L0oNER8|?(}QBgT~@f*{H|;OG$k*Gc1bQac@dl
zR1H1xeTpNuwfYc#Y)F^gU76^MwORFmKK8$#oHU`8i<g&*%~{ykkQsWZ7t6&wULS)D
z(ed$QgrV}ldWwmQ&wUBLQnA@!(?u4Al-$si72Ml7KiRVBh@l2PIFu)5tj?ogkd>Ej
zd~F*Da37B*l4owAJJ~qKD3Hl-nN>_o?2A)X+luF0C%wzpM0VvAGBshe8ToWU{@U{L
zmsCS@5=0+xn{k|KX_lj<PoHI{L!XB4uaAd%t&Lnfujxu)R`&1^H8C~CjE+jI34<nQ
zd21`-Oe*l$^A5W~I%v!IjXx7kRy$u2@}L_DNM6Mghd&<b(R=mk6<51n6>tO0W1p<9
zoF5Iq=gQz`_ZY~oHJ?mvS-ZMwt^A-$T*c1>uEH+|69k=1;^u&TYwco&$6bJ0?rcR9
zgT<y!M|0|AJuj_$a@-*pB<ySoJc}nT@Bo;=a2oT!ii(OpQ=0Ts63S0pM8c}@3EOCH
zaj_ccFx4m*^8sb3hOnrVHSWX=<`h0=8x1``9~}kAt^f(vTw@5(HO%;bJoBkw@;Tmn
zmXe;HTU$$8Qc`mGyPaH=k?)zA5N#N+I6lq0jE!geld6%qd{?eqA$Z-^_BfnfJ5sUi
z+LrEic)L~OPR~7ny|#nqgQm*<4pgZKI1IE1zfaDFs!sxB_YMxaWPa`R3U<W`Hb=Fb
zE(-dd;YY1%CNYD9AvRs{cI>u;Z$Ez)SsyFE;?lTHH2rFc(d^Y?>f!l8OG4nuJ}+Y?
zALs=xQq<fW)Y<MMtGeg+TlT?FxlNa4&7_q$qTCPfv_9QL4*=_Bva~RfC1qXe{R2di
zXw=L@V|^*zB8bk=%<by?pyOxK2R}W=i4(+7)zx=^11`^|zkB!hxI?zp+DOU8Lk8+N
zb;ix+la~xq?u5(%zvZV7MhR}UFg0rSRRVh-u!m8mrK4+|Zt{0K*{GTClfZrbY}czJ
z%bi@`<J)Au><I~bobzn*<m5yf$jA>VLisOAoN7NNClS#UyyOo6#Ic4J`Vi8N5+KI#
z^WE$VAm<bnsjj$ErS}7PTo<AxEi5f1BDh!}XAU}Keebu5u1tay<McZn#gI8URwm>s
z|6ac5^dy5Oxvq~1>*?v)@~QWTG6(KyPp20&Y&FySA8aZa8qzp9Ii-*(yRDdmGO$nL
z;N8GWALf@n{!dm>E)hr{FXtN7d-8&dxNiQGlHUG$`*3eavpn#`o3kat`pJ_gu5(|b
z#|D5^lyqMp292!w^rK%5Ou)`EHy_T$jveBiC#!Sn>+gabNC}uXMqMnBT|^B;F!lI)
z%n7zED155HXTECGJhXi_3h&}pX9oJ^>&oeY(HE8bYkww`-1=x|kw;Ll>u7gryXRh+
zC9XN}a47pcWjcCjGgOlfgTb)s>+3_glA%s7UZlt#&V-J&Jdlu3^O=6-u)gHKS*Ki7
zSoqhTUz2UkWL}yn4eura0YTx#{{p1lL4*1UF2u4zI6!j;rRo^N6_{59h~V(G^YIT+
zX=!O==LxdMg_V}Am%AOsRPV$pnbdot_g0I`_^6xt%=|Wx@ExyO+rNvgZpy8TQOC~C
yZr#t!f1~R2>3g?KqraaYBmS2M694ngDYJucl%M;Py?!ue0;m#9vGlQJ$o~PV&1P``

diff --git a/doc/en/reference/media/modular/arithgroup/pairing.png b/doc/en/reference/media/modular/arithgroup/pairing.png
new file mode 100644
index 0000000000000000000000000000000000000000..262f4f364568271e981e3e93ae68997e26a8b7f3
GIT binary patch
literal 14778
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

diff --git a/doc/en/reference/plotting.rst b/doc/en/reference/plotting.rst
--- a/doc/en/reference/plotting.rst
+++ b/doc/en/reference/plotting.rst
@@ -26,3 +26,5 @@
    sage/plot/scatter_plot
    sage/plot/text
    sage/plot/colors
+   sage/plot/hyperbolic_arc
+   sage/plot/hyperbolic_triangle
diff --git a/module_list.py b/module_list.py
--- a/module_list.py
+++ b/module_list.py
@@ -1024,6 +1024,13 @@
     Extension('sage.modular.arithgroup.congroup_pyx',
               sources = ['sage/modular/arithgroup/congroup_pyx.pyx']),
 
+    Extension('sage.modular.arithgroup.farey_symbol',
+              sources = ['sage/modular/arithgroup/farey_symbol.pyx',
+                         'sage/modular/arithgroup/farey.cpp',
+                         'sage/modular/arithgroup/sl2z.cpp'],
+              libraries = ['gmpxx'],
+              language = 'c++'),
+
     Extension('sage.modular.modform.eis_series_cython',
               sources = ['sage/modular/modform/eis_series_cython.pyx'],
               libraries = ["gmp", "flint"],
@@ -1691,6 +1698,7 @@
     ## sage.tests
     ##
     ################################
+
     Extension('sage.tests.interrupt',
               sources = ['sage/tests/interrupt.pyx', 'sage/tests/c_lib.c']),
     
diff --git a/sage/modular/all.py b/sage/modular/all.py
--- a/sage/modular/all.py
+++ b/sage/modular/all.py
@@ -12,7 +12,7 @@
                        kronecker_character, kronecker_character_upside_down,
                        trivial_character)
 
-from arithgroup.all import (Gamma0, Gamma1, GammaH, Gamma, SL2Z, ArithmeticSubgroup_Permutation)
+from arithgroup.all import (Gamma0, Gamma1, GammaH, Gamma, SL2Z, ArithmeticSubgroup_Permutation, FareySymbol)
 
 from cusps import Cusp, Cusps
 
diff --git a/sage/modular/arithgroup/all.py b/sage/modular/arithgroup/all.py
--- a/sage/modular/arithgroup/all.py
+++ b/sage/modular/arithgroup/all.py
@@ -14,3 +14,5 @@
 from congroup_pyx import (degeneracy_coset_representatives_gamma0, 
                             degeneracy_coset_representatives_gamma1)
 
+from farey_symbol import Farey as FareySymbol
+
diff --git a/sage/modular/arithgroup/farey.cpp b/sage/modular/arithgroup/farey.cpp
new file mode 100644
--- /dev/null
+++ b/sage/modular/arithgroup/farey.cpp
@@ -0,0 +1,610 @@
+//
+//  farey.cpp
+// 
+//  Implementation of FareySymbol
+//
+//****************************************************************************
+//       Copyright (C) 2011 Hartmut Monien <monien@th.physik.uni-bonn.de>
+//
+//  Distributed under the terms of the GNU General Public License (GPL)
+//
+//    This code is distributed in the hope that it will be useful,
+//    but WITHOUT ANY WARRANTY; without even the implied warranty of
+//    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+//    General Public License for more details.
+//
+//  The full text of the GPL is available at:
+//
+//                  http://www.gnu.org/licenses/
+//****************************************************************************
+
+#include <vector>
+#include <fstream>
+#include <sstream>
+#include <algorithm>
+#include <cassert>
+
+#include <gmpxx.h>
+#include <Python.h>
+
+#include "farey.hpp"
+
+using namespace std;
+
+DL_IMPORT(long) convert_to_long(PyObject *);
+DL_IMPORT(PyObject) *convert_to_rational(mpq_class);
+DL_IMPORT(PyObject) *convert_to_cusp(mpq_class);
+DL_IMPORT(PyObject) *convert_to_SL2Z(SL2Z);
+
+template <class T>
+inline 
+ostream& operator<<(ostream& os, const vector<T>& v) {
+  os << "[";
+  if( v.size() == 0 ) {
+    os << "]";
+    return os;
+  }
+  for(size_t i=0; i+1<v.size(); i++) {
+    os << v[i] << ", ";
+  }
+  os << v.back() << "]";
+  return os;
+}
+
+inline
+mpq_class operator/(const mpz_class& a, const mpz_class& b) {
+  return mpq_class(a, b);
+}
+
+inline 
+mpz_class lcm(const mpz_class& a, const mpz_class& b) {
+  mpz_class result;
+  mpz_lcm(result.get_mpz_t(), a.get_mpz_t(), b.get_mpz_t());
+  return result;
+}
+
+inline 
+mpz_class lcm(const vector<mpz_class>& v) {
+  mpz_class q(1);
+  for(size_t i=0; i<v.size(); i++) {
+    q = lcm(q, v[i]);
+  }
+  return q;
+}
+
+//--- Helper class for checking membership of SL2Z matrix in group GammaH ----
+
+is_element_GammaH::is_element_GammaH(int p_, PyObject* gen_list) : p(p_) {
+  typedef vector<long>::const_iterator const_iterator;
+  // list of generators 
+  vector<long> gen;
+  Py_ssize_t ngen = PyList_Size(gen_list);
+  for(Py_ssize_t i=0; i<ngen; i++) {
+    PyObject* item = PyList_GetItem(gen_list, i);
+    gen.push_back(convert_to_long(item));
+  }
+  // generate H from generators
+  H = gen;
+  for(;;) {
+    vector<long> m;
+    for(const_iterator i=gen.begin(); i!=gen.end(); i++) {
+      for(const_iterator j=H.begin(); j!=H.end(); j++) {
+	long q = ((*i)*(*j))%p;
+	if( find(H.begin(), H.end(), q) == H.end() and
+	    find(m.begin(), m.end(), q) == m.end() ) {
+	  m.push_back(q);
+	}
+      }
+    }
+    if( m.size() == 0 ) break;
+    for(const_iterator i=m.begin(); i!=m.end(); i++) H.push_back(*i);
+  }	
+  // sort for binary searches
+  sort(H.begin(), H.end());
+}
+
+is_element_GammaH::~is_element_GammaH() {
+}
+
+bool is_element_GammaH::is_member(const SL2Z& m) const {
+  mpz_class a = m.a()%p; if(a < 0) a+=p;
+  mpz_class d = m.d()%p; if(d < 0) d+=p;
+  if( m.c()%p != 0 ) return false;
+  if( not binary_search(H.begin(), H.end(), a.get_si()) ) return false;
+  if( not binary_search(H.begin(), H.end(), d.get_si()) ) return false;
+  return true;
+}
+
+//--- Helper class for checking membership of SL2Z matrix in group 
+// defined by the python object.
+
+is_element_general::is_element_general(PyObject* group_) : group(group_) {
+  if( PyObject_HasAttrString(group, "__contains__") ) {
+    method = PyObject_GetAttrString(group, "__contains__");
+  } else {
+    cerr << "group has to define __contains__" << endl;
+    throw string(__FUNCTION__) + ": error.";
+  }
+}
+
+is_element_general::~is_element_general() {
+  Py_DECREF(method);
+}
+
+bool is_element_general::is_member(const SL2Z& m) const {
+  PyObject* arg = convert_to_SL2Z(m);
+  PyObject* tuple = PyTuple_New(1);
+  PyTuple_SetItem(tuple, 0, arg);
+  PyObject *result = PyEval_CallObject(method, tuple);
+  Py_DECREF(arg);
+  Py_DECREF(tuple);
+  if( not PyBool_Check(result) ) {
+    cerr << "__contains__ does not return bool." << endl;
+    throw string(__FUNCTION__) + ": error.";
+  }
+  bool value = (result == Py_True);
+  Py_DECREF(result);
+  return value;
+}
+
+//--- FareySymbol ------------------------------------------------------------
+
+// SL2Z 
+
+FareySymbol::FareySymbol() : 
+  group(new is_element_Gamma0(1)) {
+  pairing = vector<int>(2);
+  pairing[0] = EVEN;
+  pairing[1] = ODD;
+  pairing_max = NO;
+  a.push_back(0);
+  a.push_back(1);
+  b.push_back(1);
+  b.push_back(1);
+  cusp_widths.push_back(1);
+  coset.push_back(SL2Z::E);
+  generators.push_back(SL2Z::S);
+  generators.push_back(SL2Z::S*SL2Z::R);
+  cusp_classes.push_back(0);
+  for(size_t i=0; i<a.size(); i++) x.push_back(a[i]/b[i]);
+}
+
+// User defined group
+
+FareySymbol::FareySymbol(PyObject* o) : 
+  group(new is_element_general(o)) {
+
+  init_pairing();
+  
+  cusp_widths  = init_cusp_widths();
+  coset        = init_coset_reps();
+  generators   = init_generators();
+  cusp_classes = init_cusp_classes();
+  for(size_t i=0; i<a.size(); i++) x.push_back(a[i]/b[i]);
+  cusps        = init_cusps();
+}
+
+// Predefined subgroups of SL2Z
+
+FareySymbol::FareySymbol(PyObject* o, const is_element_group* g) : 
+  group(g) {
+
+  init_pairing();
+  
+  cusp_widths  = init_cusp_widths();
+  coset        = init_coset_reps();
+  generators   = init_generators();
+  cusp_classes = init_cusp_classes();
+  for(size_t i=0; i<a.size(); i++) x.push_back(a[i]/b[i]);
+  cusps        = init_cusps();
+}
+
+FareySymbol::~FareySymbol() {
+  delete group;
+}
+
+void FareySymbol::init_pairing() {
+  pairing = vector<int>(3, NO);
+  const mpq_class infinity(10000000);
+  pairing_max = NO;
+  a.push_back(0); 
+  a.push_back(1);
+  b.push_back(1);
+  b.push_back(1);
+  check_pair(2);
+  check_pair(0);
+  check_pair(1);
+  for(;;) {
+    int missing_pair(-1);
+    mpq_class largest_diameter(0);
+    for(size_t i=1; i<pairing.size(); i++) {
+      if( pairing[i] == NO ) {
+	if( i+1 != pairing.size() ) { 
+	  mpq_class d = a[i]/b[i] - a[i-1]/b[i-1];
+	  if( d > largest_diameter ) {
+	    largest_diameter = d;
+	    missing_pair = (int)(i);
+	  }   
+	} else {
+	  largest_diameter = infinity;
+	  missing_pair = (int)(pairing.size()-1);
+	  break;
+	}
+      }
+    }
+    if( missing_pair == -1 ) {
+      break;
+    } else {
+      mpz_class A, B;
+      if( missing_pair+1 == pairing.size() ) {
+	A = a[missing_pair-1]+1;
+	B = b[missing_pair-1]+0;
+      } else {
+	A = a[missing_pair-1]+a[missing_pair];
+	B = b[missing_pair-1]+b[missing_pair];
+      }
+      add_term(missing_pair, A/B);
+    }
+    check_pair(missing_pair);
+    check_pair(missing_pair+1);
+  }
+}
+
+void FareySymbol::add_term(const int i, const mpq_class& r) {
+  a.insert(a.begin()+i, r.get_num());
+  b.insert(b.begin()+i, r.get_den());
+  pairing.insert(pairing.begin()+i, NO);
+}
+
+void FareySymbol::check_pair(const int i) {
+  if( pairing[i] == NO ) {
+    std::vector<int> even(pairing), odd(pairing); 
+    even[i] = EVEN;
+    odd [i] = ODD;
+    SL2Z A = pairing_matrix(even, i);
+    SL2Z B = pairing_matrix(odd , i);
+    if( group->is_member(A) or group->is_member(-A) ) {
+      pairing[i] = EVEN;
+      return;
+    } else if( group->is_member(B) or group->is_member(-B) ) {
+      pairing[i] = ODD;
+      return;
+    }
+  }
+  if( pairing[i] == NO ) {
+    for(size_t j=0; j<pairing.size(); j++) {
+      if( pairing[j] == NO and i != j ) {
+	vector<int> p(pairing);
+	p[i] = pairing_max+1;
+	p[j] = pairing_max+1;
+	SL2Z C = pairing_matrix(p, i);
+	if( group->is_member(C) or group->is_member(-C) ) {
+	  pairing_max++;
+	  pairing[i] = pairing_max;
+	  pairing[j] = pairing_max;
+	  return;
+	}
+      }
+    }
+  }
+}
+
+SL2Z FareySymbol::pairing_matrix(const vector<int>& p, const size_t i) const {
+  mpz_class ai, ai1, bi, bi1, aj, aj1, bj, bj1;
+  if( i == 0 ) {
+    ai = -1; bi = 0; ai1 = a[0], bi1 = b[0];
+  } else if( i+1 == p.size() ) {
+    ai = a[i-1]; bi = b[i-1]; ai1 = 1; bi1 = 0;
+  } else {
+    ai = a[i-1]; bi = b[i-1]; ai1 = a[i]; bi1 = b[i];
+  }
+  if( p[i] == NO ) {
+    throw(string(__FUNCTION__)+string(": error"));
+  } else if( p[i] == EVEN ) {
+    return SL2Z(ai1*bi1+ai*bi, -ai*ai-ai1*ai1, 
+		bi*bi+bi1*bi1, -ai1*bi1-ai*bi);
+  } else if( p[i] == ODD ) {
+    return SL2Z(ai1*bi1+ai*bi1+ai*bi, -ai*ai-ai*ai1-ai1*ai1, 
+		bi*bi+bi*bi1+bi1*bi1, -ai1*bi1-ai1*bi-ai*bi);
+  } else if( p[i] > NO ) {
+    const size_t j = paired_side(p, i);
+    if( j == 0 ) {
+      aj = -1; bj = 0; aj1 = a[0]; bj1 = b[0];
+    } else if( j == a.size() ) {
+      aj = a[j-1]; bj = b[j-1]; aj1 = 1; bj1 = 0;
+    } else {
+      aj = a[j-1]; bj = b[j-1]; aj1 = a[j]; bj1 = b[j];
+    }
+    return SL2Z(aj1*bi1+aj*bi, -aj*ai-aj1*ai1,
+		bj*bi+bj1*bi1, -ai1*bj1-ai*bj);
+  }
+  return SL2Z::E;
+}
+
+SL2Z FareySymbol::pairing_matrix(const size_t i) const {
+  return pairing_matrix(pairing, i);
+}
+
+size_t FareySymbol::paired_side(const vector<int>& p, const size_t n) const {
+  if( p[n] == EVEN or p[n] == ODD ) {
+    return n;
+  } else if( p[n] > NO ) {
+    vector<int>::const_iterator i = find(p.begin(), p.end(), p[n]);
+    if( i-p.begin() != n ) {
+      return i-p.begin();
+    } else {
+      vector<int>::const_iterator j = find(i+1, p.end(), p[n]);
+      return j-p.begin();
+    }
+  }
+  throw(string(__FUNCTION__)+string(": error"));
+  return 0;
+}
+
+vector<SL2Z> FareySymbol::init_generators() const {
+  vector<SL2Z> gen;
+  vector<int> p;
+  for(size_t i=0; i<pairing.size(); i++) {
+    if( find(p.begin(), p.end(), pairing[i]) == p.end() ) {
+      gen.push_back(pairing_matrix(i));
+      if( pairing[i] > NO ) p.push_back(pairing[i]);
+    }
+  }
+  return gen;
+}
+
+vector<mpq_class> FareySymbol::init_cusp_widths() const {
+  static const mpq_class one_half(1, 2);
+  vector<mpz_class> A(a), B(b);
+  A.push_back(1);
+  B.push_back(0);
+  vector<mpq_class> w(A.size(), 0);
+  for(size_t i=0; i<w.size(); i++) {
+    size_t im = (i==0 ? A.size()-1 : i-1);
+    size_t ip = (i+1==A.size() ? 0 : i+1);
+    w[i] = abs(A[im]*B[ip]-A[ip]*B[im]);
+    if( pairing[i ] == ODD ) w[i] += one_half;
+    if( pairing[ip] == ODD ) w[i] += one_half;
+  }
+  return w;
+}
+
+vector<SL2Z> FareySymbol::init_coset_reps() const {
+  static const mpq_class one_half(1, 2);
+  vector<mpz_class> A(a), B(b);
+  A.insert(A.begin(), -1);
+  B.insert(B.begin(),  0);
+  vector<mpq_class> cw(cusp_widths);
+  rotate(cw.begin(), cw.end()-1, cw.end());
+  vector<int> p(pairing);
+  rotate(p.begin(), p.end()-1, p.end());
+  vector<SL2Z> reps;
+  for(size_t i=0; i<p.size(); i++) {
+    size_t j = (i+1) % p.size();
+    mpz_class c(A[j]), d(B[j]);
+    if( d == 0 ) c = 1;
+    mpq_class upper_bound(cw[i]);
+    if( p[i] == ODD ) upper_bound += one_half;
+    if( p[j] == ODD ) upper_bound -= one_half;
+    for(size_t k=0; k<upper_bound; k++) {
+      reps.push_back(SL2Z(1, -(int)(k), 0, 1)/SL2Z(-A[i], c, -B[i], d));
+    }
+  }
+  return reps;
+}
+
+// init cusp classes is a class of the pairing alone !!!
+
+vector<int> FareySymbol::init_cusp_classes() const {
+  vector<int> c(pairing.size(), 0);
+  int cusp_class(1);
+  for(size_t m=0; m<c.size(); m++) {
+    if( c[m] != 0 ) {
+      continue;
+    }
+    c[m] = cusp_class;
+    size_t i(m), I, J;
+    for(;;) {
+      if( pairing[i] == NO ) {
+	I = i;
+	J = (i==0? pairing.size()-1 : (i-1)%c.size());
+      } else {
+	I = (i+1)%c.size();
+	J = I;
+      }
+      if( pairing[I] == ODD or pairing[I] == EVEN ) {
+	if( c[I] == cusp_class ) {
+	  cusp_class++;
+	  break;
+	}
+	c[J] = cusp_class;
+	i = J;
+	continue;
+      } else if( pairing[I] > NO ) {
+	size_t j;
+	for(size_t k=0; k<c.size(); k++) {
+	  if( pairing[k] == pairing[I] and k != I ) j = k;
+	}
+	if( I != i ) {
+	  if( c[j] == cusp_class ) {
+	    cusp_class++;
+	    break;
+	  }
+	  c[j] = cusp_class;
+	  i = j;
+	  continue;
+	} else {
+	  if( c[j-1] == cusp_class ) {
+	    cusp_class++;
+	    break;
+	  }
+	  c[j-1] = cusp_class;
+	  i = j-1;
+	  continue;
+	}
+      } 
+    }
+  }
+  return c;
+}
+
+vector<mpq_class> FareySymbol::init_cusps() const {
+  vector<mpq_class> c;
+  for(size_t i=0; i<number_of_cusps(); i++) {
+    mpq_class cusp_width(0);
+    int k(0);
+    for(size_t j=0; j<cusp_widths.size(); j++) {
+      if( cusp_classes[j] == i ) {
+	cusp_width += cusp_widths[j];
+	k = j;
+      }
+    }
+    c.push_back(x[k]);
+  }
+  sort(c.begin(), c.end());
+  return c;
+}
+
+size_t FareySymbol::nu2() const {
+  return count(pairing.begin(), pairing.end(), EVEN);
+}
+
+size_t FareySymbol::nu3() const {
+  return count(pairing.begin(), pairing.end(), ODD);
+}
+
+size_t FareySymbol::rank_pi() const {
+  return count_if(pairing.begin(), pairing.end(), 
+		  bind2nd(greater<int>(), 0))/2;
+}
+
+size_t FareySymbol::number_of_cusps() const {
+  return size_t(*max_element(cusp_classes.begin(), cusp_classes.end()));
+}
+
+size_t FareySymbol::genus() const {
+  return (rank_pi()-number_of_cusps()+1)/2;
+}
+
+size_t FareySymbol::level() const {
+  vector<mpz_class> A(a), B(b);
+  A.push_back(1);
+  B.push_back(0);
+  vector<mpz_class> width;
+  for(size_t i=1; i<=number_of_cusps(); i++) {
+    mpq_class cusp_width(0);
+    for(size_t j=0; j<cusp_widths.size(); j++) {
+      if( cusp_classes[j] == i ) {
+	cusp_width += cusp_widths[j];
+      }
+    }
+    width.push_back(cusp_width.get_num());
+  }
+  return lcm(width).get_ui();
+}
+
+void FareySymbol::dump(ostream& os, const char* name, const int line) const {
+  os << "FareySymbol" << endl;
+  if( line > 0 ) {
+    os << "\tcalled in: " << name << ":" << line << endl;
+  }
+  os <<  endl
+     << "\tpairing: " << pairing << endl
+     << "\ta: " << a << endl
+     << "\tb: " << b << endl
+     << "\tcups classes: " << cusp_classes << endl
+     << endl;
+}
+
+
+//--- communication with sage ------------------------------------------------
+
+size_t FareySymbol::index() const {
+  return coset.size();
+}
+
+PyObject* FareySymbol::get_coset() const {
+  PyObject* coset_list = PyList_New(coset.size());
+  for(size_t i=0; i<coset.size(); i++) {
+    PyObject* m = convert_to_SL2Z(coset[i]);
+    PyList_SetItem(coset_list, i, m);
+  }
+  return coset_list;
+}
+
+PyObject* FareySymbol::get_generators() const {
+  PyObject* generators_list = PyList_New(generators.size());
+  for(size_t i=0; i<generators.size(); i++) {
+    PyObject* m = convert_to_SL2Z(generators[i]);
+    PyList_SetItem(generators_list, i, m);
+  }
+  return generators_list;
+}
+
+PyObject* FareySymbol::get_cusp_widths() const {
+  PyObject* cusp_widths_list = PyList_New(cusp_widths.size());
+  for(size_t i=0; i<cusp_widths.size(); i++) {
+    PyObject* m = convert_to_rational(cusp_widths[i]);
+    PyList_SetItem(cusp_widths_list, i, m);
+  }
+  return cusp_widths_list;
+}
+
+PyObject* FareySymbol::get_cusps() const {
+  PyObject* cusps_list = PyList_New(cusps.size());
+  for(size_t i=0; i<cusps.size(); i++) {
+    PyObject* m = convert_to_cusp(cusps[i]);
+    PyList_SetItem(cusps_list, i, m);
+  }
+  return cusps_list;
+}
+
+PyObject* FareySymbol::get_fractions() const {
+  PyObject* x_list = PyList_New(x.size());
+  for(size_t i=0; i<x.size(); i++) {
+    PyObject* m = convert_to_rational(x[i]);
+    PyList_SetItem(x_list, i, m);
+  }
+  return x_list;
+}
+
+PyObject* FareySymbol::get_pairings() const {
+  PyObject* pairing_list = PyList_New(pairing.size());
+  for(size_t i=0; i<pairing.size(); i++) {
+    PyObject* m = PyInt_FromLong(long(pairing[i]));
+    PyList_SetItem(pairing_list, i, m);
+  }
+  return pairing_list;
+}
+
+PyObject* FareySymbol::get_paired_sides() const {
+  vector<int> p;
+  for(size_t i=0; i<pairing.size(); i++) {
+    if( pairing[i] > NO and 
+	p.end() == find(p.begin(), p.end(), pairing[i]) ) {
+      p.push_back(pairing[i]);
+    }
+  }
+  sort(p.begin(), p.end());
+  PyObject* pairing_list = PyList_New(p.size());
+  for(vector<int>::const_iterator i=p.begin(); i!=p.end(); i++) {
+    vector<int>::const_iterator j = find(pairing.begin(), pairing.end(), *i);
+    vector<int>::const_iterator k = find(j+1, pairing.end(), *i);
+    PyObject* J = PyInt_FromLong(long(j-pairing.begin()));
+    PyObject* K = PyInt_FromLong(long(k-pairing.begin()));
+    PyObject* tuple = PyTuple_New(2);    
+    PyTuple_SetItem(tuple, 0, J);
+    PyTuple_SetItem(tuple, 1, K);
+    PyList_SetItem(pairing_list, i-p.begin(), tuple);
+  }
+  return pairing_list;
+}
+
+PyObject* FareySymbol::get_pairing_matrices() const {
+  PyObject* pairing_matrix_list = PyList_New(pairing.size());
+  for(size_t i=0; i<pairing.size(); i++) {
+    PyObject* pm = convert_to_SL2Z(pairing_matrix(i));
+    PyList_SetItem(pairing_matrix_list, i, pm);
+  }
+  return pairing_matrix_list;
+}
diff --git a/sage/modular/arithgroup/farey.hpp b/sage/modular/arithgroup/farey.hpp
new file mode 100644
--- /dev/null
+++ b/sage/modular/arithgroup/farey.hpp
@@ -0,0 +1,141 @@
+//
+//  farey.hpp
+//  FareySymbol
+//
+//****************************************************************************
+//       Copyright (C) 2011 Hartmut Monien <monien@th.physik.uni-bonn.de>
+//
+//  Distributed under the terms of the GNU General Public License (GPL)
+//
+//    This code is distributed in the hope that it will be useful,
+//    but WITHOUT ANY WARRANTY; without even the implied warranty of
+//    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+//    General Public License for more details.
+//
+//  The full text of the GPL is available at:
+//
+//                  http://www.gnu.org/licenses/
+//****************************************************************************
+
+
+#ifndef FAREY_SYMBOL_HPP_
+#define FAREY_SYMBOL_HPP_
+
+#include <iostream>
+#include <vector>
+#include <string>
+
+#include <Python.h>
+#include <gmpxx.h>
+#include "sl2z.hpp"
+
+//--- pure virtual base class for helper class for membership test -----------
+
+class is_element_group {
+public:
+  virtual bool is_member(const SL2Z&) const = 0;
+};
+
+class is_element_Gamma0 : public is_element_group {
+  const int p;
+public:
+  is_element_Gamma0(int p_) : p(p_) {
+  }
+  bool is_member(const SL2Z& V) const {
+    return (V.c() % p == 0);
+  }
+};
+
+class is_element_Gamma1 : public is_element_group {
+  const int p;
+public:
+  is_element_Gamma1(int p_) : p(p_) {
+  }
+  bool is_member(const SL2Z& V) const {
+    return ((V.a()-1) % p == 0 && 
+	    V.c() % p == 0 &&
+	    (V.d()-1) % p == 0);
+  }
+};
+
+class is_element_Gamma : public is_element_group {
+  const int p;
+public:
+  is_element_Gamma(int p_) : p(p_) {
+  }
+  bool is_member(const SL2Z& V) const {
+    return ((V.a()-1) % p == 0 && 
+	    V.b() % p == 0 &&
+	    V.c() % p == 0 &&
+	    (V.d()-1) % p == 0);
+  }
+};
+
+class is_element_GammaH : public is_element_group {
+  const int p;
+  std::vector<long> H;
+public:
+  is_element_GammaH(int p_, PyObject*);
+  ~is_element_GammaH();
+  bool is_member(const SL2Z&) const;
+};
+
+class is_element_general : public is_element_group {
+protected:
+  PyObject* group;
+  PyObject* method;
+public:
+  is_element_general(PyObject*);
+  ~is_element_general();
+  bool is_member(const SL2Z&) const; 
+};
+
+class FareySymbol {
+  enum PAIRING { EVEN=-2, ODD=-3, NO=0, FREE=1 };
+  const is_element_group* group;
+  size_t pairing_max;
+  std::vector<int> pairing;
+  std::vector<int> cusp_classes;
+  std::vector<mpz_class> a, b;
+  std::vector<mpq_class> x;
+  std::vector<SL2Z> coset;
+  std::vector<SL2Z> generators;
+  std::vector<mpq_class> cusps;
+  std::vector<mpq_class> cusp_widths;
+  void add_term(const int, const mpq_class&);
+  void check_pair(const int);
+  size_t paired_side(const std::vector<int>& p, const size_t i) const;
+  SL2Z pairing_matrix(const std::vector<int>&, const size_t i) const;
+  void init_pairing();
+  std::vector<SL2Z> init_generators() const;
+  std::vector<SL2Z> init_coset_reps() const;
+  std::vector<int> init_cusp_classes() const;
+  std::vector<mpq_class> init_cusps() const;
+  std::vector<mpq_class> init_cusp_widths() const;
+  SL2Z pairing_matrix(const size_t) const;
+  size_t rank_pi() const;
+public:
+  FareySymbol();
+  FareySymbol(PyObject*);
+  FareySymbol(PyObject*, const is_element_group*);
+  ~FareySymbol();
+  const size_t size() const;
+  size_t nu2() const;
+  size_t nu3() const;
+  size_t index() const;
+  size_t number_of_cusps() const;
+  size_t level() const;
+  size_t genus() const;
+  void dump(std::ostream&, const char* name="", const int line=-1) const;
+  //--- communication with sage ----------------------------------------------
+  PyObject* get_cusps() const;
+  PyObject* get_fractions() const;
+  PyObject* get_cusp_widths() const;
+  PyObject* get_coset() const;
+  PyObject* get_generators() const;
+  PyObject* get_pairings() const;
+  PyObject* get_paired_sides() const;
+  PyObject* get_pairing_matrices() const;
+};
+
+#endif // FAREY_SYMBOL_HPP_
diff --git a/sage/modular/arithgroup/farey.pxd b/sage/modular/arithgroup/farey.pxd
new file mode 100644
--- /dev/null
+++ b/sage/modular/arithgroup/farey.pxd
@@ -0,0 +1,68 @@
+#*****************************************************************************
+#       Copyright (C) 2011 Hartmut Monien <monien@th.physik.uni-bonn.de>
+#
+#  Distributed under the terms of the GNU General Public License (GPL)
+#
+#    This code is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+#    General Public License for more details.
+#
+#  The full text of the GPL is available at:
+#
+#                  http://www.gnu.org/licenses/
+#*****************************************************************************
+
+cdef extern from 'gmpxx.h':
+    cdef cppclass mpz_class:
+        mpz_class()
+        mpz_class(int i)
+        mpz_class(mpz_t z)
+        mpz_class(mpz_class)
+        mpz_t* get_mpz_t()
+        mpz_class operator%(mpz_class, mpz_class)
+    cdef cppclass mpq_class:
+        mpq_class()
+        mpz_t* get_num_mpz_t()
+        mpz_t* get_den_mpz_t()
+
+cdef extern from 'sl2z.hpp':
+    cppclass cpp_SL2Z "SL2Z":
+        mpz_class a, b, c, d
+        cpp_SL2Z(int, int, int, int)
+        mpz_class a()
+        mpz_class b()
+        mpz_class c()
+        mpz_class d()
+
+cdef extern from 'farey.hpp':
+    cppclass is_element_Gamma0:
+        is_element_Gamma0(int)
+    cppclass is_element_Gamma1:
+        is_element_Gamma1(int)
+    cppclass is_element_Gamma:
+        is_element_Gamma(int)
+    cppclass is_element_GammaH:
+        is_element_GammaH(int, object)
+    
+cdef extern from "farey.hpp":
+    cppclass cpp_farey "FareySymbol":
+        cpp_farey()
+        cpp_farey(object)
+        cpp_farey(object, is_element_Gamma*)
+        cpp_farey(object, is_element_Gamma0*)
+        cpp_farey(object, is_element_Gamma1*)
+        cpp_farey(object, is_element_GammaH*)
+        size_t genus()
+        size_t index()
+        size_t level()
+        size_t nu2()
+        size_t nu3()
+        get_cusps()
+        get_fractions()
+        get_coset()
+        get_generators()
+        get_pairings()
+        get_paired_sides()
+        get_pairing_matrices()
+
diff --git a/sage/modular/arithgroup/farey_symbol.h b/sage/modular/arithgroup/farey_symbol.h
new file mode 100644
--- /dev/null
+++ b/sage/modular/arithgroup/farey_symbol.h
@@ -0,0 +1,21 @@
+#ifndef __PYX_HAVE__sage__modular__arithgroup__farey_symbol
+#define __PYX_HAVE__sage__modular__arithgroup__farey_symbol
+#ifdef __cplusplus
+#define __PYX_EXTERN_C extern "C"
+#else
+#define __PYX_EXTERN_C extern
+#endif
+
+#ifndef __PYX_HAVE_API__sage__modular__arithgroup__farey_symbol
+
+__PYX_EXTERN_C DL_IMPORT(long) convert_to_long(PyObject *);
+__PYX_EXTERN_C DL_IMPORT(PyObject) *convert_to_Integer(mpz_class);
+__PYX_EXTERN_C DL_IMPORT(PyObject) *convert_to_rational(mpq_class);
+__PYX_EXTERN_C DL_IMPORT(PyObject) *convert_to_cusp(mpq_class);
+__PYX_EXTERN_C DL_IMPORT(PyObject) *convert_to_SL2Z(SL2Z);
+
+#endif
+
+PyMODINIT_FUNC initfarey_symbol(void);
+
+#endif
diff --git a/sage/modular/arithgroup/farey_symbol.pyx b/sage/modular/arithgroup/farey_symbol.pyx
new file mode 100644
--- /dev/null
+++ b/sage/modular/arithgroup/farey_symbol.pyx
@@ -0,0 +1,514 @@
+r"""
+Farey Symbol for arithmetic subgroups of `{\rm PSL}_2(\ZZ)`
+
+AUTHORS:
+
+- Hartmut Monien (08 - 2011)
+
+based on the *KFarey* package by Chris Kurth. Implemented as C++ module
+for speed.  
+"""
+#*****************************************************************************
+#       Copyright (C) 2011 Hartmut Monien <monien@th.physik.uni-bonn.de>
+#
+#  Distributed under the terms of the GNU General Public License (GPL)
+#
+#    This code is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+#    General Public License for more details.
+#
+#  The full text of the GPL is available at:
+#
+#                  http://www.gnu.org/licenses/
+#*****************************************************************************
+
+include '../../ext/interrupt.pxi'
+include '../../ext/stdsage.pxi'
+include '../../ext/cdefs.pxi'
+
+include "farey.pxd"
+
+import sage.rings.arith
+from sage.rings.all import CC, RR
+from sage.rings.integer cimport Integer
+from sage.rings.infinity import infinity
+from congroup_gammaH import is_GammaH
+from congroup_gamma1 import is_Gamma1
+from congroup_gamma0 import is_Gamma0
+from congroup_gamma  import is_Gamma
+from congroup_sl2z import SL2Z
+from sage.modular.cusps import Cusp
+from sage.modular.arithgroup.noncongruence_example import GPrime
+
+from sage.plot.plot import Graphics
+from sage.plot.colors import to_mpl_color
+from sage.plot.misc import options, rename_keyword
+from sage.plot.all import hyperbolic_arc, hyperbolic_triangle, text
+
+cdef class Farey:
+    r"""
+    REFERENCES:
+
+    - Ravi S. Kulkarni, ''An arithmetic-geometric method in the study of the
+      subgroups of the modular group'', `Amer. J. Math., 113(6):1053--1133,
+      1991. <http://www.jstor.org/stable/2374900>`_
+   
+    INPUTS:
+    
+    - `G` - an arithmetic subgroup of `{\rm PSL}_2(\ZZ)`
+
+    EXAMPLES:
+
+    Create a Farey symbol for the group `\Gamma_0(11)`::
+
+        sage: F = FareySymbol(Gamma0(11)); F
+        FareySymbol(Congruence Subgroup Gamma0(11))
+
+    Calculate the generators::
+
+         sage: Sequence(F.generators(), cr=True)
+         [
+         [1 1]
+         [0 1],
+         [ 7 -2]
+         [11 -3],
+         [ 8 -3]
+         [11 -4]
+         ]
+
+    Calculate the index of `\Gamma_H(33, [2, 5])` in
+    `{\rm PSL}_2(\ZZ)` via FareySymbol::
+
+         sage: FareySymbol(GammaH(33, [2, 5])).index()
+         48
+         
+    Calculate the generators of `\Gamma_1(4)`::
+    
+         sage: Sequence(FareySymbol(Gamma1(4)).generators(), cr=True)
+         [
+         [1 1]
+         [0 1],
+         [ 3 -1]
+         [ 4 -1]
+         ]
+
+    Calculate the generators of the noncongruence group `\Gamma' =
+    \Gamma_0(8)\cap\Gamma_1(4)`. Implementing helper classes for
+    noncongruence groups is fairly easy. This example can be imported
+    from ``sage.modular.arithgroup.noncongruence_example``.::
+
+         sage: from sage.modular.arithgroup.noncongruence_example import GPrime
+         
+         sage: Sequence(FareySymbol(GPrime()).generators(), cr=True)
+         [
+         [1 1]
+         [0 1],
+         [ 5 -1]
+         [16 -3],
+         [ 5 -2]
+         [ 8 -3]
+         ]
+         
+    Calculate the left coset representation of `\Gamma_H(8, [3])`::
+
+         sage: Sequence(FareySymbol(GammaH(8, [3])).coset_reps(), cr=True)
+         [
+         [1 0]
+         [0 1],
+         [ 4 -1]
+         [ 1  0],
+         [ 3 -1]
+         [ 1  0],
+         [ 2 -1]
+         [ 1  0],
+         [ 1 -1]
+         [ 1  0],
+         [ 3 -1]
+         [ 4 -1],
+         [ 2 -1]
+         [ 3 -1],
+         [-1  0]
+         [ 3 -1],
+         [ 1 -1]
+         [ 2 -1],
+         [-1  0]
+         [ 2 -1],
+         [ 0 -1]
+         [ 1 -1],
+         [-1  0]
+         [ 1 -1]
+         ]
+    """
+    cdef cpp_farey *this_ptr
+    cdef object group
+    
+    def __cinit__(self, group):
+        self.group = group
+        ## to accelerate the calculation of the FareySymbol
+        ## we implement the tests for the standard congruence groups
+        ## in the c++ module. For a general group the test if an element
+        ## of SL2Z is in the group the python __contains__ attribute
+        ## of the group is called
+        cdef int p
+        if hasattr(group, "level"): p=group.level()
+        sig_on()
+        if group == SL2Z:
+            self.this_ptr = new cpp_farey()
+        elif is_Gamma0(group):
+            self.this_ptr = new cpp_farey(group, new is_element_Gamma0(p))
+        elif is_Gamma1(group):
+            self.this_ptr = new cpp_farey(group, new is_element_Gamma1(p))
+        elif is_Gamma(group):
+            self.this_ptr = new cpp_farey(group, new is_element_Gamma(p))
+        elif is_GammaH(group):
+            l = group._GammaH_class__H
+            self.this_ptr = new cpp_farey(group, new is_element_GammaH(p, l))
+        else:
+            self.this_ptr = new cpp_farey(group)
+        sig_off()
+
+    def __deallocpp__(self):
+        del self.this_ptr
+
+    def __repr__(self):
+        r"""
+        Return the string representation of self.
+
+        EXAMPLES::
+
+            sage: FareySymbol(Gamma0(23)).__repr__()
+            'FareySymbol(Congruence Subgroup Gamma0(23))'
+        """
+        if hasattr(self.group, "_repr_"): 
+            return "FareySymbol(%s)" % self.group._repr_()
+        elif hasattr(self.group, "__repr__"):
+            return "FareySymbol(%s)" % self.group.__repr__()
+        else:
+            return "FareySymbol(?)"
+
+    def _latex_(self):
+        r"""
+        Return the LaTeX representation of self.
+
+        EXAMPLES::
+
+            sage: FareySymbol(Gamma0(23))._latex_()
+            '\\mathcal{F}(\\Gamma_0(23))'
+        """
+        if hasattr(self.group, "_latex_"):
+            return "\mathcal{F}(%s)" % self.group._latex_()
+        else:
+            return "\mathcal{F}(%s)" % "unknonwn"
+
+    def index(self):
+        r"""
+        Return the index of the arithmetic group of the FareySymbol
+        in `{\rm PSL}_2(\ZZ)`.
+        
+        EXAMPLES::
+        
+            sage: [FareySymbol(Gamma0(n)).index() for n in range(1, 16)]
+            [1, 3, 4, 6, 6, 12, 8, 12, 12, 18, 12, 24, 14, 24, 24]
+        """
+        return self.this_ptr.index()
+
+    def genus(self):
+        r"""
+        Return the genus of the arithmetic group of the FareySymbol.
+
+        EXAMPLES::
+        
+            sage: [FareySymbol(Gamma0(n)).genus() for n in range(16, 32)]
+            [0, 1, 0, 1, 1, 1, 2, 2, 1, 0, 2, 1, 2, 2, 3, 2]
+        """
+        return self.this_ptr.genus()
+
+    def level(self):
+        r"""
+        Return the level of the arithmetic group of the FareySymbol.
+
+        EXAMPLES::
+
+            sage: [FareySymbol(Gamma0(n)).level() for n in range(1, 16)]
+            [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
+        """
+        return self.this_ptr.level();
+
+    def nu2(self):
+        r"""
+        Return the number of elliptic points of order two.
+
+        EXAMPLES::
+        
+            sage: [FareySymbol(Gamma0(n)).nu2() for n in range(1, 16)]
+            [1, 1, 0, 0, 2, 0, 0, 0, 0, 2, 0, 0, 2, 0, 0]
+        """
+        return self.this_ptr.nu2()
+
+    def nu3(self):
+        r"""
+        Return the number of elliptic points of order three.
+
+        EXAMPLES::
+        
+            sage: [FareySymbol(Gamma0(n)).nu3() for n in range(1, 16)]
+            [1, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 2, 0, 0]
+        """
+        return self.this_ptr.nu3()
+
+    def coset_reps(self):
+        r"""
+        Left coset of the arithmetic group of the FareySymbol.
+
+        EXAMPLES:
+
+        Calculate the left coset of `\Gamma_0(6)`::
+        
+            sage: Sequence(FareySymbol(Gamma0(6)).coset_reps(), cr=True)
+            [
+            [1 0]
+            [0 1],
+            [ 3 -1]
+            [ 1  0],
+            [ 2 -1]
+            [ 1  0],
+            [ 1 -1]
+            [ 1  0],
+            [ 2 -1]
+            [ 3 -1],
+            [ 3 -2]
+            [ 2 -1],
+            [ 1 -1]
+            [ 2 -1],
+            [-1  0]
+            [ 2 -1],
+            [ 1 -1]
+            [ 3 -2],
+            [ 0 -1]
+            [ 1 -1],
+            [-1  0]
+            [ 1 -1],
+            [-2  1]
+            [ 1 -1]
+            ]
+        """
+        return self.this_ptr.get_coset()
+
+    def generators(self):
+        r"""
+        Minmal set of generators of the group of the FareySymbol.
+
+        EXAMPLES:
+
+        Calculate the generators of `\Gamma_0(6)`::
+        
+            sage: Sequence(FareySymbol(Gamma0(6)).generators(), cr=True)
+            [
+            [1 1]
+            [0 1],
+            [ 5 -1]
+            [ 6 -1],
+            [ 7 -3]
+            [12 -5]
+            ]
+
+        Calculate the generators of `{\rm SL}_2(\ZZ)`::
+
+            sage: Sequence(FareySymbol(SL2Z).generators(), cr=True)
+            [
+            [ 0 -1]
+            [ 1  0],
+            [ 0 -1]
+            [ 1 -1]
+            ]
+        """
+        return self.this_ptr.get_generators()
+
+    def fractions(self):
+        r"""
+        Fractions of the FareySymbol.
+
+        EXAMPLES::
+        
+            sage: FareySymbol(Gamma(4)).fractions()
+            [0, 1/2, 1, 3/2, 2, 5/2, 3, 7/2, 4]
+        """
+        return self.this_ptr.get_fractions()
+
+
+    def pairings(self):
+        r"""
+        Pairings of the sides of the fundamental domain of the Farey symbol
+        of the arithmetic group. The sides of the hyperbolic polygon are
+        numbered 0, 1, ... from left to right.
+
+        EXAMPLES::
+        
+            sage: FareySymbol(Gamma0(23)).pairings()
+            [1, 2, 3, 5, 3, 4, 2, 4, 5, 1]
+        """
+        return self.this_ptr.get_pairings()
+
+    def paired_sides(self):
+        r"""
+        Pairs of index of the sides of the fundamental domain of the
+        Farey symbol of the arithmetic group. The sides of the
+        hyperbolic polygon are numbered 0, 1, ... from left to right.
+
+        .. image:: ../../../media/modular/arithgroup/pairing.png
+
+        EXAMPLES::
+        
+            sage: FareySymbol(Gamma0(11)).paired_sides()
+            [(0, 5), (1, 3), (2, 4)]
+
+        indicating that the side 0 is paired with 5, 1 with 3 and 2 with 4.
+        """
+        return self.this_ptr.get_paired_sides()
+    
+    def pairing_matrices(self):
+        r"""
+        Pairing matrices of the sides of the fundamental domain. The sides
+        of the hyperbolic polygon are numbered 0, 1, ... from left to right.
+
+        EXAMPLES::
+        
+            sage: Sequence(FareySymbol(Gamma0(6)).pairing_matrices(), cr=True)
+            [
+            [1 1]
+            [0 1],
+            [ 5 -1]
+            [ 6 -1],
+            [ 7 -3]
+            [12 -5],
+            [ 5 -3]
+            [12 -7],
+            [ 1 -1]
+            [ 6 -5],
+            [-1  1]
+            [ 0 -1]
+            ]
+        """
+        
+        return self.this_ptr.get_pairing_matrices()
+
+    def cusps(self):
+        r"""
+        Cusps of the FareySymbol.
+
+        EXAMPLES::
+        
+            sage: FareySymbol(Gamma0(6)).cusps()
+            [0, 1/2, 2/3, 1, Infinity]
+        """
+        return self.this_ptr.get_cusps()+[Cusp(infinity)]
+
+    @rename_keyword(color='rgbcolor')
+    @options(alpha=1, fill=True, thickness=1, rgbcolor="lightgray", \
+             zorder=2, linestyle='solid', show_pairing=True, \
+             show_tesselation=False)
+    
+    def fundamental_domain(self, **options):
+        r"""
+        Plot a fundamental domain of an arithmetic subgroup of
+        `{\rm PSL}_2(\ZZ)` corresponding to the Farey symbol.
+
+        OPTIONS:
+
+        - ``fill`` - fill the fundamental domain (default True)
+
+        - ``rgbcolor`` - fill color (default 'lightgray')
+
+        - ``show_pairing`` - flag for pairing (default True)
+
+        - ``show_tesselation`` - flag for the hyperbolic tesselation
+          (default False)
+
+        EXAMPLES:
+
+        For example to plot the fundamental domain of `\Gamma_0(11)`
+        with pairings
+
+        .. image:: ../../../media/modular/arithgroup/fun_gamma0_11.png
+
+        use the following command::
+        
+            sage: FareySymbol(Gamma0(11)).fundamental_domain()
+
+        indicating that side 1 is paired with side 3 and side 2 is
+        paired with side 4, see also :meth:`.paired_sides`.
+
+        To plot the fundamental domain of `\Gamma(3)` without pairings
+
+        .. image:: ../../../media/modular/arithgroup/fun_gamma_3.png
+
+        use the following command::
+        
+            sage: FareySymbol(Gamma(3)).fundamental_domain(show_pairing=False)
+
+        Plot the fundamental domain of `\Gamma_0(23)` showing the left
+        coset representatives.
+
+        .. image:: ../../../media/modular/arithgroup/fun_gamma0_23.png
+
+        :: 
+
+            sage: FareySymbol(Gamma0(23)).fundamental_domain(show_tesselation=True)         
+        """
+        from sage.plot.colors import rainbow
+        g = Graphics()
+        ## show coset
+        for x in self.coset_reps():
+            a, b, c, d = x[1,1], -x[0,1], -x[1,0], x[0,0]
+            A, B = CC(0, 1000), CC(0, 1000)
+            if d!=0: A = b/d
+            if c!=0: B = a/c
+            C = (a*c+b*d+(a*d+b*c)/2+CC(0, 1)*RR(3).sqrt()/2)/(c*c+c*d+d*d)
+            g += hyperbolic_triangle(A, B, C, \
+                                     color=options['rgbcolor'], \
+                                     fill=options['fill'], \
+                                     alpha=options['alpha'])
+            if options['show_tesselation']:
+                g += hyperbolic_triangle(A, B, C, color="gray")
+        ## show pairings
+        p = self.pairings()
+        x = self.fractions()
+        if options['show_pairing']:
+            rc = rainbow(max(p)-min(p)+1)
+            for i in range(len(x)-1):
+                if p[i+1] > 1:
+                    rcolor = rc[p[i+1]-min(p)]
+                    g += hyperbolic_arc(x[i], x[i+1], \
+                                        color=rcolor, \
+                                        thickness=1)
+        g.set_axes_range(x[0], x[-1], 0, 1)
+        return g
+
+#--- conversions -------------------------------------------------------------
+
+cdef public long convert_to_long(n):
+    cdef long m = n
+    return m
+
+cdef public object convert_to_Integer(mpz_class a):
+    A = Integer()
+    A.set_from_mpz(a.get_mpz_t())
+    return A
+    
+cdef public object convert_to_rational(mpq_class r):
+    a = Integer(); a.set_from_mpz(r.get_num_mpz_t())
+    b = Integer(); b.set_from_mpz(r.get_den_mpz_t())
+    return a/b
+
+cdef public object convert_to_cusp(mpq_class r):
+    a = Integer(); a.set_from_mpz(r.get_num_mpz_t())
+    b = Integer(); b.set_from_mpz(r.get_den_mpz_t())
+    return Cusp(a/b)
+
+cdef public object convert_to_SL2Z(cpp_SL2Z M):
+   a = convert_to_Integer(M.a())
+   b = convert_to_Integer(M.b())
+   c = convert_to_Integer(M.c())
+   d = convert_to_Integer(M.d())
+   return SL2Z([a, b, c, d])
diff --git a/sage/modular/arithgroup/noncongruence_example.py b/sage/modular/arithgroup/noncongruence_example.py
new file mode 100644
--- /dev/null
+++ b/sage/modular/arithgroup/noncongruence_example.py
@@ -0,0 +1,46 @@
+# g_prime.py
+"""
+Simple example how to implement noncongruence groups.
+
+AUTHORS: 
+
+- Hartmut Monien (08 - 2011)
+
+"""
+#*****************************************************************************
+#       Copyright (C) 2011 Hartmut Monien <monien@th.physik.uni-bonn.de>
+#
+#  Distributed under the terms of the GNU General Public License (GPL)
+#
+#    This code is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+#    General Public License for more details.
+#
+#  The full text of the GPL is available at:
+#
+#                  http://www.gnu.org/licenses/
+#*****************************************************************************
+
+from sage.structure.sage_object import SageObject
+
+class GPrime(SageObject):
+    r"""
+    Simple example how to implement noncongruence groups for the
+    FareySymbol class. The group is `\Gamma' =
+    \Gamma_0(8)\cap\Gamma_1(4)` which has been studied in detail by
+    Liqun Fang, J. William Hoffman, Benjamin Linowitz, Andrew
+    Rupinski, Helena Verrill, ''Modular Forms on Noncongruence
+    Subgroups and Atkin-Swinnerton-Dyer Relations'',
+    Experiment. Math. 19 (2010), no. 1, 1–27. MR2649983 (2011g:11082)
+    """
+    def __contains__(self, m):
+        r"""
+        Test for membership in `\Gamma_0(8)\cap\Gamma_1(4)`
+        """
+        return (m.a()%4==1 and m.d()%4==1 and m.c()%8==0)
+    def _repr_(self):
+        return "Gamma\': example of non-congruence subgroup"
+    def _latex_(self):
+        return "\Gamma^\prime"
+    
diff --git a/sage/modular/arithgroup/sl2z.cpp b/sage/modular/arithgroup/sl2z.cpp
new file mode 100644
--- /dev/null
+++ b/sage/modular/arithgroup/sl2z.cpp
@@ -0,0 +1,21 @@
+//****************************************************************************
+//       Copyright (C) 2011 Hartmut Monien <monien@th.physik.uni-bonn.de>
+//
+//  Distributed under the terms of the GNU General Public License (GPL)
+//
+//    This code is distributed in the hope that it will be useful,
+//    but WITHOUT ANY WARRANTY; without even the implied warranty of
+//    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+//    General Public License for more details.
+//
+//  The full text of the GPL is available at:
+//
+//                  http://www.gnu.org/licenses/
+//****************************************************************************
+#include "sl2z.hpp"
+
+const SL2Z SL2Z::S(0, -1, 1, 0);
+const SL2Z SL2Z::U(0,  1,-1, 0);
+const SL2Z SL2Z::R(1, -1, 0, 1);
+const SL2Z SL2Z::T(1,  1, 0, 1);
+const SL2Z SL2Z::E(1,  0, 0, 1);
diff --git a/sage/modular/arithgroup/sl2z.hpp b/sage/modular/arithgroup/sl2z.hpp
new file mode 100644
--- /dev/null
+++ b/sage/modular/arithgroup/sl2z.hpp
@@ -0,0 +1,149 @@
+//****************************************************************************
+//       Copyright (C) 2011 Hartmut Monien <monien@th.physik.uni-bonn.de>
+//
+//  Distributed under the terms of the GNU General Public License (GPL)
+//
+//    This code is distributed in the hope that it will be useful,
+//    but WITHOUT ANY WARRANTY; without even the implied warranty of
+//    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+//    General Public License for more details.
+//
+//  The full text of the GPL is available at:
+//
+//                  http://www.gnu.org/licenses/
+//****************************************************************************
+
+#ifndef SL2Z_HPP_
+#define SL2Z_HPP_
+
+#include <iostream>
+#include <iomanip>
+#include <cassert>
+#include <gmpxx.h>
+
+class SL2Z {
+public:
+  typedef mpz_class ElementType;
+protected:
+  ElementType M[2][2];
+public:
+  const static SL2Z E, R, T, S, U;
+  SL2Z(int a_, int b_, int c_, int d_);
+  SL2Z(const ElementType& a_, const ElementType& b_, 
+       const ElementType& c_, const ElementType& d_);
+  SL2Z(const SL2Z&);
+  ElementType a() const { return M[0][0]; };
+  ElementType b() const { return M[0][1]; };
+  ElementType c() const { return M[1][0]; };
+  ElementType d() const { return M[1][1]; };
+  SL2Z inverse() const;
+  SL2Z operator-() const;
+  SL2Z operator*=(const SL2Z& x);
+  SL2Z operator/=(const SL2Z& x);
+  SL2Z mod(const size_t) const;
+  friend bool operator==(const SL2Z&, const SL2Z&);
+  friend bool operator!=(const SL2Z&, const SL2Z&);
+  friend SL2Z operator*(const SL2Z&, const SL2Z&);
+  friend SL2Z operator/(const SL2Z&, const SL2Z&);
+  friend std::ostream& operator<<(std::ostream&, const SL2Z&);
+};
+
+inline
+SL2Z::SL2Z(const SL2Z::ElementType& a_, const SL2Z::ElementType& b_, 
+	   const SL2Z::ElementType& c_, const SL2Z::ElementType& d_) {
+  M[0][0] = a_;
+  M[0][1] = b_;
+  M[1][0] = c_;
+  M[1][1] = d_;
+  assert(M[0][0]*M[1][1] - M[0][1]*M[1][0] == 1);
+}
+
+inline 
+SL2Z::SL2Z(int a_, int b_, int c_, int d_) {
+  M[0][0] = a_;
+  M[0][1] = b_;
+  M[1][0] = c_;
+  M[1][1] = d_;
+  assert(M[0][0]*M[1][1] - M[0][1]*M[1][0] == 1);
+}
+
+inline
+SL2Z::SL2Z(const SL2Z& x) {
+  M[0][0] = x.M[0][0];
+  M[0][1] = x.M[0][1];
+  M[1][0] = x.M[1][0];
+  M[1][1] = x.M[1][1];  
+}
+
+inline 
+SL2Z SL2Z::operator-() const {
+  return SL2Z(-M[0][0],-M[0][1],-M[1][0],-M[1][1]);
+}
+
+inline 
+SL2Z SL2Z::operator*=(const SL2Z& x) {
+  return SL2Z(M[0][0]*x.M[0][0] + M[0][1]*x.M[1][0],
+	      M[0][0]*x.M[0][1] + M[0][1]*x.M[1][1],
+	      M[1][0]*x.M[0][0] + M[1][1]*x.M[1][0],
+	      M[1][0]*x.M[0][1] + M[1][1]*x.M[1][1]);
+}
+
+inline 
+SL2Z SL2Z::operator/=(const SL2Z& x) {
+  return SL2Z( M[0][0]*x.M[1][1] - M[0][1]*x.M[1][0],
+	      -M[0][0]*x.M[0][1] + M[0][1]*x.M[0][0],
+	       M[1][0]*x.M[1][1] - M[1][1]*x.M[1][0],
+	      -M[1][0]*x.M[0][1] + M[1][1]*x.M[0][0]);
+}
+
+inline 
+SL2Z SL2Z::inverse() const {
+  return SL2Z(M[1][1], -M[0][1], -M[1][0], M[0][0]);
+}
+
+inline 
+SL2Z SL2Z::mod(const size_t n) const {
+  return SL2Z(M[0][0]%n, M[0][1]%n, M[1][0]%n, M[1][1]%n);
+}
+
+inline 
+SL2Z operator*(const SL2Z& x, const SL2Z& y) {
+  return SL2Z(x.M[0][0]*y.M[0][0] + x.M[0][1]*y.M[1][0],
+	      x.M[0][0]*y.M[0][1] + x.M[0][1]*y.M[1][1],
+	      x.M[1][0]*y.M[0][0] + x.M[1][1]*y.M[1][0],
+	      x.M[1][0]*y.M[0][1] + x.M[1][1]*y.M[1][1]);
+}
+ 
+inline 
+SL2Z operator/(const SL2Z& x, const SL2Z& y) {
+  return SL2Z( x.M[0][0]*y.M[1][1] - x.M[0][1]*y.M[1][0],
+	      -x.M[0][0]*y.M[0][1] + x.M[0][1]*y.M[0][0],
+	       x.M[1][0]*y.M[1][1] - x.M[1][1]*y.M[1][0],
+	      -x.M[1][0]*y.M[0][1] + x.M[1][1]*y.M[0][0]);
+}
+ 
+inline 
+bool operator==(const SL2Z& x, const SL2Z& y) {
+  return (x.M[0][0] == y.M[0][0] and 
+	  x.M[0][1] == y.M[0][1] and 
+	  x.M[1][0] == y.M[1][0] and 
+	  x.M[1][1] == y.M[1][1]);
+}
+
+inline 
+bool operator!=(const SL2Z& x, const SL2Z& y) {
+  return not (x == y);
+}
+
+inline 
+std::ostream& operator<<(std::ostream& os, const SL2Z& x) {
+  os << "[" 
+     << x.M[0][0] << "," 
+     << x.M[0][1] << "; " 
+     << x.M[1][0] << ", " 
+     << x.M[1][1] 
+     << "]";
+  return os;
+}
+
+#endif // SL2Z_HPP_
diff --git a/sage/plot/all.py b/sage/plot/all.py
--- a/sage/plot/all.py
+++ b/sage/plot/all.py
@@ -30,3 +30,6 @@
 from colors import Color, hue, rainbow, colors, colormaps
 
 from step import plot_step_function
+
+from hyperbolic_arc import hyperbolic_arc
+from hyperbolic_triangle import hyperbolic_triangle
diff --git a/sage/plot/hyperbolic_arc.py b/sage/plot/hyperbolic_arc.py
new file mode 100644
--- /dev/null
+++ b/sage/plot/hyperbolic_arc.py
@@ -0,0 +1,136 @@
+"""
+Arcs in hyperbolic geometry
+
+AUTHORS:
+
+- Hartmut Monien (2011 - 08)
+"""
+#*****************************************************************************
+#       Copyright (C) 2011 Hartmut Monien <monien@th.physik.uni-bonn.de>,
+#
+#  Distributed under the terms of the GNU General Public License (GPL)
+#
+#    This code is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+#    General Public License for more details.
+#
+#  The full text of the GPL is available at:
+#
+#                  http://www.gnu.org/licenses/
+#*****************************************************************************
+from sage.plot.bezier_path import BezierPath
+from sage.plot.colors import to_mpl_color
+from sage.plot.misc import options, rename_keyword
+from sage.rings.all import CC
+
+class HyperbolicArc(BezierPath):
+    """
+    Primitive class for hyberbolic arc type. See ``hyperbolic_arc?`` for
+    information about plotting a hyperbolic arc in the complex plane.
+
+    INPUT:
+
+    - ``a, b`` - coordinates of the hyperbolic arc in the complex plane
+    - ``options`` - dict of valid plot options to pass to constructor
+
+    EXAMPLES:
+
+    Note that constructions should use ``hyperbolic_arc``::
+
+         sage: from sage.plot.hyperbolic_arc import HyperbolicArc
+        
+         sage: print HyperbolicArc(0, 1/2+I*sqrt(3)/2, {})
+         Hyperbolic arc (0, 0.500000000000000 + 0.866025403784439*I)
+    """
+    
+    def __init__(self, A, B, options):
+        A, B = (CC(A), CC(B))
+        self.path = []
+        self._hyperbolic_arc(A, B, True);
+        BezierPath.__init__(self, self.path, options)
+        self.A, self.B = (A, B)
+
+    def _repr_(self):
+        """
+        String representation of HyperbolicArc.
+        """
+        return "Hyperbolic arc (%s, %s)" % (self.A, self.B)
+    
+    def _hyperbolic_arc(self, z0, z3, first=False):
+        """
+        Function to construct Bezier path as an approximation to
+        the hyperbolic arc between the complex numbers z0 and z3 in the
+        hyperbolic plane.
+        """
+        if (z0-z3).real() == 0:
+            self.path.append([(z0.real(),z0.imag()), (z3.real(),z3.imag())])
+            return
+        z0, z3 = (CC(z0), CC(z3))
+        if z0.imag() == 0 and z3.imag() == 0:
+            p = (z0.real()+z3.real())/2
+            r = abs(z0-p)
+            zm = CC(p, r)
+            self._hyperbolic_arc(z0, zm, first)
+            self._hyperbolic_arc(zm, z3)
+            return
+        else:
+            p = (abs(z0)*abs(z0)-abs(z3)*abs(z3))/(z0-z3).real()/2
+            r = abs(z0-p)
+            zm = ((z0+z3)/2-p)/abs((z0+z3)/2-p)*r+p
+            t = (8*zm-4*(z0+z3)).imag()/3/(z3-z0).real()
+            z1 = z0 + t*CC(z0.imag(), (p-z0.real()))
+            z2 = z3 - t*CC(z3.imag(), (p-z3.real()))
+        if first:
+            self.path.append([(z0.real(), z0.imag()),
+                              (z1.real(), z1.imag()),
+                              (z2.real(), z2.imag()),
+                              (z3.real(), z3.imag())]);
+            first = False
+        else:
+            self.path.append([(z1.real(), z1.imag()),
+                              (z2.real(), z2.imag()),
+                              (z3.real(), z3.imag())]);
+     
+@rename_keyword(color='rgbcolor')
+@options(alpha=1, fill=False, thickness=1, rgbcolor="blue", zorder=2, linestyle='solid')
+def hyperbolic_arc(a, b, **options):
+    """
+    Plot an arc from a to b in hyperbolic geometry in the complex upper
+    half plane.
+
+    INPUT:
+
+    - ``a, b`` - complex numbers in the upper half complex plane
+      connected bye the arc
+
+    OPTIONS:
+    
+    - ``alpha`` - default: 1
+       
+    - ``thickness`` - default: 1
+
+    - ``rgbcolor`` - default: 'blue'
+
+    - ``linestyle`` - default: 'solid' 
+
+    Examples:
+
+    Show a hyperbolic arc from 0 to 1::
+    
+         sage: hyperbolic_arc(0, 1)
+
+    Show a hyperbolic arc from 1/2 to `i` with a red thick line::
+    
+         sage: hyperbolic_arc(1/2, I, color='red', thickness=2)
+
+    Show a hyperbolic arc form `i` to `2 i` with dashed line::
+    
+         sage: hyperbolic_arc(I, 2*I, linestyle='dashed')
+    """
+    from sage.plot.plot import Graphics
+    g = Graphics()
+    g._set_extra_kwds(g._extract_kwds_for_show(options))
+    g.add_primitive(HyperbolicArc(a, b, options))
+    g.set_aspect_ratio(1)
+    return g
diff --git a/sage/plot/hyperbolic_triangle.py b/sage/plot/hyperbolic_triangle.py
new file mode 100644
--- /dev/null
+++ b/sage/plot/hyperbolic_triangle.py
@@ -0,0 +1,146 @@
+"""
+Triangles in hyperbolic geometry
+
+AUTHORS:
+
+- Hartmut Monien (2011 - 08)
+"""
+#*****************************************************************************
+#       Copyright (C) 2011 Hartmut Monien <monien@th.physik.uni-bonn.de>,
+#
+#  Distributed under the terms of the GNU General Public License (GPL)
+#
+#    This code is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+#    General Public License for more details.
+#
+#  The full text of the GPL is available at:
+#
+#                  http://www.gnu.org/licenses/
+#*****************************************************************************
+from sage.plot.bezier_path import BezierPath
+from sage.plot.colors import to_mpl_color
+from sage.plot.misc import options, rename_keyword
+from sage.rings.all import CC
+
+class HyperbolicTriangle(BezierPath):
+    """
+    Primitive class for hyberbolic triangle type. See ``hyperbolic_triangle?``
+    for information about plotting a hyperbolic triangle in the complex plane.
+
+    INPUT:
+
+    - ``a,b,c`` - coordinates of the hyperbolic triangle in the upper
+      complex plane
+    
+    - ``options`` - dict of valid plot options to pass to constructor
+
+    EXAMPLES:
+
+    Note that constructions should use ``hyperbolic_triangle``::
+
+         sage: from sage.plot.hyperbolic_triangle import HyperbolicTriangle
+         sage: print HyperbolicTriangle(0, 1/2, I, {})
+         Hyperbolic triangle (0, 0.500000000000000, 1.00000000000000*I)
+    """
+    def __init__(self, A, B, C, options):
+        """
+        Initialize HyperbolicTriangle:
+
+        Examples::
+        
+            sage: from sage.plot.hyperbolic_triangle import HyperbolicTriangle
+            sage: print HyperbolicTriangle(0, 1/2, I, {})
+            Hyperbolic triangle (0, 0.500000000000000, 1.00000000000000*I)
+        """
+        A, B, C = (CC(A), CC(B), CC(C))
+        self.path = []
+        self._hyperbolic_arc(A, B, True);
+        self._hyperbolic_arc(B, C);
+        self._hyperbolic_arc(C, A);
+        BezierPath.__init__(self, self.path, options)
+        self.A, self.B, self.C = (A, B, C)
+
+    def _repr_(self):
+        """
+        String representation of HyperbolicTriangle.
+        """
+        return "Hyperbolic triangle (%s, %s, %s)" % (self.A, self.B, self.C)
+    
+    def _hyperbolic_arc(self, z0, z3, first=False):
+        """
+        Function to construct Bezier path as an approximation to
+        the hyperbolic arc between the complex numbers z0 and z3 in the
+        hyperbolic plane.
+        """
+        if (z0-z3).real() == 0:
+            self.path.append([(z0.real(),z0.imag()), (z3.real(),z3.imag())])
+            return
+        z0, z3 = (CC(z0), CC(z3))
+        if z0.imag() == 0 and z3.imag() == 0:
+            p = (z0.real()+z3.real())/2
+            r = abs(z0-p)
+            zm = CC(p, r)
+            self._hyperbolic_arc(z0, zm, first)
+            self._hyperbolic_arc(zm, z3)
+            return
+        else:
+            p = (abs(z0)*abs(z0)-abs(z3)*abs(z3))/(z0-z3).real()/2
+            r = abs(z0-p)
+            zm = ((z0+z3)/2-p)/abs((z0+z3)/2-p)*r+p
+            t = (8*zm-4*(z0+z3)).imag()/3/(z3-z0).real()
+            z1 = z0 + t*CC(z0.imag(), (p-z0.real()))
+            z2 = z3 - t*CC(z3.imag(), (p-z3.real()))
+        if first:
+            self.path.append([(z0.real(), z0.imag()),
+                              (z1.real(), z1.imag()),
+                              (z2.real(), z2.imag()),
+                              (z3.real(), z3.imag())]);
+            first = False
+        else:
+            self.path.append([(z1.real(), z1.imag()),
+                              (z2.real(), z2.imag()),
+                              (z3.real(), z3.imag())]);
+     
+@rename_keyword(color='rgbcolor')
+@options(alpha=1, fill=False, thickness=1, rgbcolor="blue", zorder=2, linestyle='solid')
+
+def hyperbolic_triangle(a, b, c, **options):
+    """
+    Return a hyperbolic triangle in the complex hyperbolic plane with points
+    (a, b, c). Type ``?hyperbolic_triangle`` to see all options.
+
+    INPUT:
+
+    - ``a, b, c`` - complex numbers in the upper half complex plane
+
+    OPTIONS:
+    
+    - ``alpha`` - default: 1
+       
+    - ``fill`` - default: False
+
+    - ``thickness`` - default: 1
+
+    - ``rgbcolor`` - default: 'blue'
+
+    - ``linestyle`` - default: 'solid' 
+
+    EXAMPLES:
+
+    Show a hyperbolic triangle with coordinates 0, `1/2+i\sqrt{3}/2` and
+    `-1/2+i\sqrt{3}/2`::
+    
+         sage: hyperbolic_triangle(0, -1/2+I*sqrt(3)/2, 1/2+I*sqrt(3)/2)
+
+    A hyperbolic triangle with coordinates 0, 1 and 2+i::
+    
+         sage: hyperbolic_triangle(0, 1, 2+i, fill=true, rgbcolor='red')
+    """
+    from sage.plot.plot import Graphics
+    g = Graphics()
+    g._set_extra_kwds(g._extract_kwds_for_show(options))
+    g.add_primitive(HyperbolicTriangle(a, b, c, options))
+    g.set_aspect_ratio(1)
+    return g
