# Many functions related to the hyperbolic family treat the parameter a_H # as a symbol. One might also want to work with a numeric value of a_H. # For that, we can invoke set_a_H0(4/5) (for example). This will set # a_H0 to the exact rational value 4/5, and a_H1 to the approximate value # 0.8. It will also set a long list of other global variables. Typically, # there is an existing global variable, say foo, whose value involves # a_H, and the function set_a_H0(4/5) will set foo0 and foo1 to the # values obtained by substituting a_H = 4/5 or a_H = 0.8 in foo. set_a_H0 := proc(a) global a_H0,a_H1,ap_H0,ap_H1,am_H0,am_H1,v_H0,v_H1, v_H0xy,v_H1xy,v_H_label,beta0,beta1,beta_SL2R0,beta_SL2R1, beta_matrix,beta0_matrix,beta1_matrix,c_H0,c_H1,c_H_label, c_H_p0,c_colour,s_H0,c_H_speed0, lambda_H0,lambda_inv_H0,lambda_sq_H0,mu_H0,nu_H0, lambda_H1,lambda_inv_H1,lambda_sq_H1,mu_H1,nu_H1, act_H0,act_H1,T,min_centre_a0, corner_shift_H0,corner_unshift_H0, square_diffeo_H_ca0,square_diffeo_H_ra0,square_diffeo_H_ma0,square_diffeo_H_pa0, square_diffeo_H_cb0,square_diffeo_H_rb0,square_diffeo_H_mb0,square_diffeo_H_pb0; local ii,i,j,k,c_H_eqs,alpha,lambda,s; a_H0 := a; #@ a_H0 a_H1 := evalf(a); #@ a_H1 ap_H0 := sqrt(1+a_H0^2); #@ ap_H0 am_H0 := sqrt(1-a_H0^2); #@ am_H0 ap_H1 := sqrt(1+a_H1^2); #@ ap_H1 am_H1 := sqrt(1-a_H1^2); #@ am_H1 for ii in indices(v_H) do i := op(ii); v_H0[i] := simplify(subs(a_H=a_H0,v_H[i])); #@ v_H0 v_H0xy[i] := [Re(v_H0[i]),Im(v_H0[i])]; #@ v_H0xy v_H1[i] := evalf(v_H0[i]); #@ v_H1 v_H1xy[i] := [Re(v_H1[i]),Im(v_H1[i])]; #@ v_H1xy v_H_label[i] := TEXT(v_H1xy[i],i); #@ v_H_label od: for k from 0 to 7 do beta0[k] := unapply(evalf(subs(a_H=a_H0,beta[k](z))),z): #@ beta0 beta1[k] := unapply(evalf(subs(a_H=a_H1,beta[k](z))),z): #@ beta1 beta_SL2R0[k] := map(evalf,map2(subs,a_H=a_H0,beta_SL2R[k])); #@ beta_SL2R0 beta_SL2R1[k] := map(evalf,map2(subs,a_H=a_H1,beta_SL2R[k])); #@ beta_SL2R1 beta_matrix[k] := map(simplify,mobius_matrix(beta[k](z),z)); #@ beta_matrix beta0_matrix[k] := mobius_matrix(beta0[k](z),z); #@ beta0_matrix beta1_matrix[k] := mobius_matrix(beta1[k](z),z); #@ beta1_matrix od: for i from 0 to 8 do c_H0[i] := unapply(simplify((subs(a_H=a_H0,c_H[i](s)))),s): #@ c_H0 c_H1[i] := unapply(evalf((subs(a_H=a_H0,c_H0[i](s)))),s): #@ c_H1 c_H_label[i] := ctext(c_H0[i](0),i,colour = c_colour[i]): #@ c_H_label od: c_H_eqs := [abs(v_H0[1])^2 + 1 - 2*Re(v_H0[1])*x - 2*Im(v_H0[1])*y, abs(v_H0[3])^2 + 1 - 2*Re(v_H0[3])*x - 2*Im(v_H0[3])*y]: c_H_p0[17] := subs(solve(c_H_eqs,{x,y}),x+I*y); for k from 1 to 3 do c_H_p0[17+k] := I^k * c_H_p0[17]: od: for i from 17 to 20 do c_colour[i] := "DarkGreen"; c_H0[i] := unapply(xi_curve(c_H_p0[i],s),s); c_H_label[i] := ctext(c_H0[i](0),i,colour = c_colour[i]): od: lambda_H0 := lambda_H; #@ lambda_H0 lambda_inv_H0 := lambda_inv_H; #@ lambda_inv_H0 lambda_sq_H0 := lambda_sq_H; #@ lambda_sq_H0 mu_H0 := unapply(subs(a_H=a_H0,mu_H(z)),z); #@ mu_H0 nu_H0 := nu_H: #@ nu_H0 lambda_H1 := lambda_H; #@ lambda_H1 lambda_inv_H1 := lambda_inv_H; #@ lambda_inv_H1 lambda_sq_H1 := lambda_sq_H; #@ lambda_sq_H1 mu_H1 := unapply(evalf(subs(a_H=a_H0,mu_H(z))),z); #@ mu_H1 nu_H1 := nu_H: #@ nu_H1 for T in G16 do act_H0[T] := unapply(simplify(subs(a_H=a_H0,act_H[T](z))),z): #@ act_H0 act_H1[T] := unapply(evalf(subs(a_H=a_H1,act_H[T](z))),z): #@ act_H1 od: for i from 0 to 4 do s_H0[i] := evalf(subs({a_H=a_H0},s_H[i])); #@ s_H0 od; for i from 0 to 8 do c_H_speed0[i] := evalf(subs({a_H=a_H0},c_H_speed[i])); #@ c_H_speed0 od; for i in [0,3,4,7,8] do c_H_p0[i] := evalf(subs(a_H=a_H0,c_H_p[i])); #@ c_H_p0 od; min_centre_a0 := evalf(subs(a_H=a_H0,min_centre_a)); #@ min_centre_a0 #@ corner_shift_H0 #@ corner_unshift_H0 for i from 1 to 3 do j := [11,3,6,0][i]; k := [11,3,6,0][i+1]; alpha := v_H0[j]; lambda := conjugate((v_H0[k] - v_H0[j])/(1 - conjugate(v_H0[j])*v_H0[k])); lambda := lambda/abs(lambda): corner_shift_H0[j] := unapply((lambda*z - lambda*alpha)/(1 - conjugate(alpha)*z),z); corner_unshift_H0[j] := unapply((z + alpha*lambda)/(conjugate(alpha)*z + lambda),z); od: square_diffeo_H_ca0 := evalf(subs(a_H=a_H0,square_diffeo_H_ca)); #@ square_diffeo_H_ca0 square_diffeo_H_ra0 := evalf(subs(a_H=a_H0,square_diffeo_H_ra)); #@ square_diffeo_H_ra0 square_diffeo_H_cb0 := evalf(subs(a_H=a_H0,square_diffeo_H_cb)); #@ square_diffeo_H_cb0 square_diffeo_H_rb0 := evalf(subs(a_H=a_H0,square_diffeo_H_rb)); #@ square_diffeo_H_rb0 square_diffeo_H_ma0 := unapply(evalf(subs(a_H=a_H0,square_diffeo_H_ma(z))),z); #@ square_diffeo_H_ma0 square_diffeo_H_pa0 := unapply(evalf(subs(a_H=a_H0,square_diffeo_H_pa(z))),z); #@ square_diffeo_H_pa0 square_diffeo_H_mb0 := unapply(evalf(subs(a_H=a_H0,square_diffeo_H_mb(z))),z); #@ square_diffeo_H_mb0 square_diffeo_H_pb0 := unapply(evalf(subs(a_H=a_H0,square_diffeo_H_pb(z))),z); #@ square_diffeo_H_pb0 end: #@ c_check_H0 c_check_H0[0] := (z) -> abs(z - xi(c_H_p0[0],z)); c_check_H0[1] := (z) -> abs(z - I*conjugate(z)); c_check_H0[2] := (z) -> abs(z + I*conjugate(z)); c_check_H0[3] := (z) -> abs(z - xi(c_H_p0[3],z)); c_check_H0[4] := (z) -> abs(z - xi(c_H_p0[4],z)); c_check_H0[5] := (z) -> abs(z - conjugate(z)); c_check_H0[6] := (z) -> abs(z + conjugate(z)); c_check_H0[7] := (z) -> abs(z - xi(c_H_p0[7],z)); c_check_H0[8] := (z) -> abs(z - xi(c_H_p0[8],z)); #@ is_in_F1_H0 is_in_F1_H0 := proc(z) local T,w,r; for T in [[0],[2],[4],[6],[0,7],[1,2],[2,1],[3,4],[4,3],[5,6],[6,5],[7,0]] do w := evalf(act_Pi0(T,z)); r := evalf(z * conjugate(z) - w * conjugate(w)); if r > 0 then return false; fi; od; return true; end; #@ is_in_F4_H0 is_in_F4_H0 := proc(z) local z0; z0 := evalf(z); is_in_F1_H0(z0) and (Re(z0) >= 0) and (Im(z0) >= 0); end; #@ is_in_F16_H0 is_in_F16_H0 := proc(z) local m,d; if not is_in_F4_H0(z) then return false; fi; if evalf(Im(z) - Re(z)) > 0 then return false; fi; m := c_H_p0[0]; d := evalf((z-m)*conjugate(z-m) - m*conjugate(m) + 1); if d < 0 then return false; fi; return true; end; # Given z in Delta, this returns [T0,z0] where T0 is in Pi # and the point T0 z = z0 lies in F1. #@ retract_F1_H0_aux retract_F1_H0_aux := proc(z) local z0,z1,T0,T1,T; z0 := evalf(z); T0 := []: for T in [[0],[2],[4],[6],[0,7],[1,2],[2,1],[3,4],[4,3],[5,6],[6,5],[7,0]] do z1 := evalf(act_Pi1_map(T)(z)); if abs(z1) < abs(z0) then T0 := T; z0 := z1; fi: od: if T0 = [] then return([[],z0]); else T1,z1 := op(retract_F1_H0_aux(z0)); return([Pi_mult(T1,T0),z1]); fi; end: #@ retract_F1_H0 retract_F1_H0 := (z) -> retract_F1_H0_aux(z)[2]: # Given z in Delta, this returns [T1,T0,z0] where T1 is in G and T0 is in Pi # and the point T1 T0 z = z0 lies in F16. #@ retract_F16_H0_aux retract_F16_H0_aux := proc(z) local T0,T1,z0,m,d; T0,z0 := op(retract_F1_H0_aux(z)); if Re(z0) < 0 then if Im(z0) < 0 then T1 := LL; else T1 := LLL; fi: else if Im(z0) < 0 then T1 := L; else T1 := 1; fi: fi: z0 := act_H1[T1](z0); if Re(z0) < Im(z0) then T1 := G_mult(LN,T1); z0 := act_H1[LN](z0); fi; m := c_H_p0[0]; d := evalf((z0-m)*conjugate(z0-m) - m*conjugate(m) + 1); if d < 0 then z0 := act_H1[MN](act_Pi1([6],z0)); T1,T0 := op(Pi_tilde_mult([MN,[6]],[T1,T0])); fi; return [T1,T0,z0]; end: # This is a continuous retraction of the unit disc onto HF16 which # sends the complement of HF16 to the boundary of HF16 (and so # has no interesting equivariance). #@ squash_F16_H0 squash_F16_H0 := proc(z) local w,i; w := z; for i in [3,6,11] do w := corner_shift_H0[i](w); w := max(0,Re(w)) + max(0,Im(w))*I; w := corner_unshift_H0[i](w); od; if Im(w) <= 0 then if Re(w) >= 0 then w := Re(w); else w := 0; fi; elif Im(w) >= Re(w) then if Im(w) + Re(w) >= 0 then w := (Re(w)+Im(w)) * (1+I)/2; else w := 0; fi; fi; return w; end: #@ square_diffeo_H0 square_diffeo_H0 := (z) -> [1-square_diffeo_H_pa0(z),square_diffeo_H_pb0(z)]; #@ square_diffeo_H0_inverse square_diffeo_H0_inverse := proc(t0) local ca,sa,sb,pa,pb,aa,bb,zz,mm; sa := square_diffeo_H_ra0^(1-t0[1]); sb := square_diffeo_H_rb0^t0[2]; if trim(sa) = 1 then if trim(sb) = 1 then return(0); else return evalf( (1/sqrt(2)*a_H0*square_diffeo_H_rb0*sb^2-(sqrt(1+a_H0^2)-sqrt(1-a_H0^2))/2- sqrt(((sqrt(1-a_H0^4)-1)*sb^4+(4-2*a_H0^2)*sb^2-(sqrt(1-a_H0^4)+1))/2))/(sb^2-1)); fi; fi; if trim(sb) = 1 then ca := square_diffeo_H_ca0; mm := evalf(sqrt(2)*(ca-1/ca)/I/(sa^2-1)); zz := evalf((1/ca+I*ca)/2 - (1+I)*sqrt(2)*mm/4 - sqrt((1/ca^2-ca^2)/4-I*(2-mm^2)/4+((1-I)*ca-(1+I)/ca)*sqrt(2)*mm/4)); return zz; fi; pa := (conjugate(square_diffeo_H_ca0)*sa^2- square_diffeo_H_ca0)/(sa^2-1); pb := (conjugate(square_diffeo_H_cb0)*sb^2-I*square_diffeo_H_cb0)/(sb^2-1); aa := Re(pa*conjugate(pa-pb))/abs(pa-pb)^2; bb := sqrt((abs(pa)^2-1)/abs(pa-pb)^2-aa^2); return (1-aa+I*bb)*pa+(aa-I*bb)*pb; end: # set_a_H0(4/5); # The value below is obtained as follows: # # 1) Find an approximation to the function f such that exp(2f) times # the euclidean metric on EX^* has curvature -1. # 2) Find the lengths of the sides of F16 with respect to this # rescaled metric. # 3) Find the value of a_H that makes the sides of F16 in HX # have the same lengths as in (2). We get a different answer # for each side, but the differences are around 10^(-5.5). # The value below is the average. # # I think that the error in the value below is probably < 10^(-9). set_a_H0(0.8005319048923638104265325104767778171017180985241883922169730841584541075292965796346466097572031440);