Subversion Repositories wimsdev

Rev

Rev 18400 | Blame | Compare with Previous | Last modification | View Log | RSS feed

!set slib_header_coxhyp=\
\\ Action du groupe de Moebius etendu\
\\ Homographie ou antihomographie selon que g[3] vaut 0 ou 1.\
mob(g,z)=if(g[3],z=conj(z));(g[1]*z+g[2])/(conj(g[2])*z+conj(g[1]));\
\\ Produit et inverse dans le groupe de Moebius etendu\
mobx(g)=[g[1],g[2];conj(g[2]),conj(g[1])];\
mob_mul(g1,g2)=my(m=mobx(g1)*mobx(if(g1[3],conj(g2),g2)));[m[1,1],m[1,2],g1[3]!=g2[3]];\
mob_inv(g)=if(g[3],[g[1],-conj(g[2]),1],[conj(g[1]),-g[2],0]);\
\
hyp3(p,q,r,eps,depl)={\
  my(m=[1,p,q;p,1,r;q,r,1],nf0,nf1,nf2,f1,f2,nbs,snb,\
  ff1,s,t,u,g,gg,ggg,g1,x,y,z,res1,res2,ses1,r2,l,\
  ep=exp(I*(Pi/p)),\
  eq=exp(I*(Pi/q)),\
  er=exp(I*(Pi/r)),\
  a=0,\
  b=sqrt((cos(Pi/r)+cos(Pi/p+Pi/q))/(cos(Pi/r)+cos(Pi/p-Pi/q))),\
  c=ep*sqrt((cos(Pi/q)+cos(Pi/p+Pi/r))/(cos(Pi/q)+cos(Pi/p-Pi/r))),\
  mm=(b*c*conj(b-c)+c-b)/(conj(b)*c-conj(c)*b));\
  my(N=20); if(eps<1,\
    r2=(1-eps)^2;l=N*round(4*r2/(1-r2)/(1-1/p-1/q-1/r)),\
    l=eps; eps=4*N/(l*(1-1/p-1/q-1/r)+4*N));\
  my(cd0=vector(l), \\ pour chaque f, les numeros des 3 aretes du bord de la chambre f\
  ce0=vector(l), \\ et l'element g du groupe qui envoie la chambre 1 sur la chambre f\
  cd1=vector(2*l+1),\\ pour chaque a, les numeros des extremites de a\
  ce1=vector(2*l+1),\\ et le numero de la premiere chambre qu'elle borde\
  cd2=vector(l+2),\\ pour chaque s, le nombre d'aretes manquantes,\
  ce2=vector(l+2),\\ les deux aretes qui bordent le secteur restant\
  cf2=vector(l+2),\\ coordonnees du sommet\
  cg2=vector(l+2) \\ le sommet est dans la zone centrale\
  );\
\\ Les trois reflexions qui engendrent W\
  g=[[1,0,1],[ep,0,1],[I*mm,-I,1]];\
  if(depl,\
    a=mob(depl,a); b=mob(depl,b); c=mob(depl,c);\
    g=vector(3,i,mob_mul(depl,mob_mul(g[i],mob_inv(depl)))),\
    depl=[1,0,0]);\
\
  \\ Creation de la premiere chambre et de son squelette\
  cd0[nf0=1]=vector(3,s,s);\
  ce0[nf0]=[1,0,0]; \\ Identite\
  for (s = 1, 3,\
    cd1[nf1+=1] = vector(4, t, if(t>3,s,-1));\
    ce1[nf1]=1;\
    for (t=1, s-1,\
      cd2[nf2+=1] = 2*m[s,t]-2;\
      ce2[nf2] = [s,t];\
      snb=6-s-t;\
      cf2[nf2]=if(snb==1,c,if(snb==2,b,a));\
      cg2[nf2]=(sqrt(norm(cf2[nf2]))+eps)<1;\
      cd1[t][s] = cd1[s][t] = nf2));\
  while(f1<nf1 && nf0<l, f1+=1; v1=cd1[f1];\
   if((s=v1[4]) && (cg2[v1[s%3+1]] || cg2[v1[5-s-s%3]]), \\ arete a traiter\
\\ element du groupe associe au triangle precedent\
   gg=ce0[ce1[f1]];\
\\ Nouveau triangle et ses aretes, manquantes ou pas\
   ce0[nf0+=1]=ggg=mob_mul(gg,g[s]);\
  w0=vector(3); w0[s]=f1; new=vector(3,t,if(t!=s,cd2[v1[t]]));\
    for(t=1, 3, if(t!=s, f2=v1[t]; if(new[t],\
    w1=vector(4); w1[4]=t; w1[s]=f2; w1[t]=-1;\
    cd1[nf1+=1]=w1; ce1[nf1]=nf0; cd2[f2]=new[t]-1; ce2[f2]=w0[t]=nf1,\
    g1=w0[t]=ce2[f2]; cd1[g1][4]=0)));\
\\ Mise a jour (et creation si necessaire) des sommets non encore traites\
    for(t=1,3,if(new[t], g1=w0[t];\
      for(u=1,3,if((u!=t) && (u!=s),\
        if(new[u],\
      if(w0[u]<g1, cd2[nf2+=1]=2*m[t,u]-2; ce2[nf2]=g1;\
      snb=6-t-u;\
      cf2[nf2]=mob(ggg,if(snb==1,c,if(snb==2,b,a)));\
      cg2[nf2]=(sqrt(norm(cf2[nf2]))+eps)<1;\
      cd1[w0[u]][t]=cd1[g1][u]=nf2),\
      cd1[g1][u]=f2=cd1[w0[u]][t]; cd2[f2]-=1; ce2[f2]=g1)))));\
      cd0[nf0]=w0;\
      )\
  );\
  [matrix(nf2,2,i,j,if(j==1,real(cf2[i]),imag(cf2[i]))),\
   matrix(nf0,4,i,j,if(j<4,cd1[cd0[i][j%3+1]][5-j-j%3],ce0[i][3]))]\
}