Variable compleja y Grupos de Klein.

1. Construcción de mosaicos con Classpad300 y Maple.
En el recuadro se muestra el programa “hex3”para construir mosaicos con hexágonos
usando un grupo con dos generadores: una traslación horizontal y una diagonal1. El
programa usa la subrutina “hex2” que se muestra en la figura 1. El resultado de aplicar
el programa se muestra en la figura 2.
DelVar hX,hY,gT,gS,tran,i,j,k
{3/2,0,-3/2,-3/2,0,3/2} ⇒ hX
{ 3 , 3 , 3 , − 3 , − 3 , − 3 } ⇒ hY
2
2
2
2
{3,0} ⇒ gT
{3/2, 3 × 3 } ⇒ gS
2
ViewWindow -10,10,1,-5,5,1
For -2 ⇒ i To 2
For -2 ⇒ j To 2
i × gT+j × gS ⇒ tran

Figura 1

Programa “Hex3”

Figura 2
El programa “hex4” mostrado en el siguiente recuadro considera tres generadores: una
π
traslación horizontal, una diagonal y una rotación en ángulos enteros de . La
3
combinación de estos generadores cuando se repiten de cierta forma, produce figuras
interesantes como las mostradas en las figuras 3,4, 5. Las letras (a) fueron hechas con
maple y las letras (b) con classpad300.

1

Del libro “Indra’s Pearls, The vision of Felix Klein”, D. Mumford, Caroline Series, David Wright.

Figura 3(a) Figura 4(a) Figura 5(a) Figura 3(b) Figura 4(b) Figura 5(b) .

gS.0.gT.[x. <sin(a) | cos(a)>>: trans:=k*genT+l*genS: newhexX:=map(x->x+trans[1]. > RTS:=proc(k.DelVar hX. − 3 .genS.-3/2. El programa para el empleo simultáneo de la rotación (R).-15.0).RTS(1.hexY): plots[polygonplot](zip((x.axes= none.i.newhexY: hexX:=[3/2.0.0.nY) Next Next Next Programa “Hex4” El programa “hex4” emplea los parámetros “l.hY. − 3 .y]).-3/2.0.rand()/10^12.rand()/10^12.s {3/2.1 For 0 ⇒ j To l For 0 ⇒ To p For 0 ⇒ To m i × gT+j × gS ⇒ tran cos(s × π /3) × (hX+tran[1])-sin(s × π /3) × (hY+tran[2]) ⇒ nX sin(s × π /3) × (hX+tran[1])+cos(s × π /3) × (hY+tran[2]) ⇒ nY hex2(nX.newhexX.-3/2.a) local hexX.sqrt(3)/2.3/2]: hexY:=[sqrt(3)/2.-sqrt(3). − 3 } ⇒ hY 2 2 2 2 {3.color=COLOR(RGB.rand()/10^12)).Pi/3)).3/2} ⇒ hX { 3 .-sqrt(3)/2]: genT:=[3. traslación horizontal (T) y diagonal (S) para la construcción de las figuras (3a).j.1.m” indicados en el recuadro. p.-sqrt(3)/2.hexY.0.y)>linalg[multiply](M. 3 .M.0]: genS:=[3/2.newhexY).-3/2.sqrt(3). .15.tran.0} ⇒ gT {3/2.30.genT.scaling=constrained. 3 × 3 } ⇒ gS 2 ViewWindow -30. end proc: Al aplicar el siguiente comando se obtiene el hexágono original.k.hexX): newhexY:=map(x->x+trans[2].3/2*sqrt(3)]: M:=<<cos(a) |-sin(a)> . uno trasladado horizontalmente y después rotado en un ángulo π 3 > plots[display](RTS(0. 3 .l.trans. (4a) y (5a) con Maple se muestra en el siguiente recuadro.newhexX.0.

. scaling=constrained.-3/2.i.10).l]:=plots[polygonplot](zip((x. newhexX.6).-3/2. K := 2 L := 2 > hexX:=[3/2.El siguiente comando produce la figura (3a): >plots[display](seq(seq(seq(RTS(n.-sqrt(3)/2.y].0. Un mosaico hecho de hexágonos subdivididos por triángulos equiláteros.3/2*sqrt(3)]: for k from -K to K do for l from -L to L do trans:=k*genT+l*genS: newhexX:=map(x->x+trans[1].i=0.6).hexX): newhexY:=map(x->x+trans[2].0]: genS:=[3/2.rand()/10^12.-sqrt(3).L).j*Pi/3).sqrt(3)/2]: genT:=[3.j=0.rand()/10^12))..i=0. axes=none.K).10)).i.6)).sqrt(3)/2. El código de Maple para los hexágonos: > K:=2.j*Pi/3).. 2.j=0.10). El siguiente comando produce la figura (5a): >plots[display](seq(seq(seq(RTS(n.10).3/2]: hexY:=[sqrt(3)/2. L:=2.6)..n=0.newhexY).j].y)->[x.j=0.hexY): h[k.. . od: od: > a1:=plots[display](seq(seq(h[i..0.thickness=2): .j=-L.rand()/10^12. El siguiente comando produce la figura (4a): >plots[display](seq(seq(seq(RTS(n..i.i=0. .i=-K. .sqrt(3).j*Pi/3).n=0.20)).. color=COLOR(RGB.n=0.

0]: genS:=[3/2.trans[1].rand()/10^12)).y]).El código de Maple para crear hexágonos mediante la rotación de un triángulo equilátero: > TriX:=[0.j]. se aplica el siguiente comando de Maple > plots[display]({a1. od: od: > b1:=plots[display](seq(seq(p[i.3/2*sqrt(3)]: for k from -K to K do for l from -L to L do trans:=k*genT+l*genS: p[k.sqrt(3)/2..rand()/10^12..3/2.color=COLOR(RGB. La figura obtenida es la siguiente: . axes=none.i=-K.axes=none): > genT:=[3.l]:=plottools[translate](h.-sqrt(3)/2]: > for r from 0 to 6 do M:=<<cos(Pi/3*r) |-sin(Pi/3*r)> . od: > h:=plots[display](seq(p[i]. <sin(Pi/3*r) | cos(Pi/3*r)>>: p[r]:=plots[polygonplot](zip((x.6).TriX. simultáneamente en una sola gráfica.i=1.b1}).rand() /10^12.3/2]: TriY:=[0. scaling=constrained): Para ver ambos.j=-L.L).[x.trans[2])..K).TriY).y)>linalg[multiply](M.

Algunos ejemplos se muestran en las figuras 6-13 Figura 6.3.5.-3.-5.10. z ⇒ z 3 .g.{re(m(t+ i × k × h))}) ⇒ f2 augment(g2.{re(m(k × h+ i × t))}) ⇒ f1 augment(g1. z ⇒ z 2 Amplificando el rectángulo rojo de la figura 8 tenemos: Figura 8.1.1.m InputFunc m(z). Transformaciones conformes. La idea es estudiar como se transforma un retículo formado por rectas verticales y horizontales al aplicar la transformación conforme.{im(m(t+ i × k × h))}) ⇒ g2 Next ClrGraph ClearSheet 1 SetSimulGraph Off ViewWindow -10.3 GTSelOn 1 GraphType "xt=" Define xt1(t)=f1 Define yt1(t)=g1 Define xt2(t)=f2 Define yt2(t)=g2 DrawGraph Figura 7. En el recuadro se muestra el programa “Complex1” que permite representar las transformaciones conformes.f."Función de z" {} ⇒ f1 {} ⇒ g1 {} ⇒ f2 {} ⇒ g2 0.k.{im(m(k × h+ i × t))}) ⇒ g1 augment(f2. z ⇒ z SetComplex SetDecimal DelVar h.5 ⇒ h For -2 ⇒ k To 2 augment(f1.z.

z ⇒ 1 z Figura 12.z ⇒ z3 ⇒ Figura 10 Figura 9 Figura 11. z ⇒ sin ( z ) Figura 13. z ⇒ 2z −1 2− z .

4.NhY) Next 5.2.gT.k. generando la “órbita” representada en la figura 16. 0 ) . .j. Figura 16 El recuadro muestra el programa empleado.09 .05 × t) × modu[i] × sin(argu[i]+t × gS)}) ⇒ NhY Next tria1(NhX.3.0}+2 ⇒ hX 4.-0.hY. La transformación (1 − 5i ) z + 1 T ( z) = z + 1 − 5i se aplica de manera iterada sobre un círculo de radio r = 0.1.4. Transformación T ( z ) = az con a .{gT^(0. Doble espiral sobre círculos con Maple. Figura 14 Figura 15 DelVar hX.√(3)/2 × 0.-2.05 × t) × modu[i] × cos(argu[i]+t × gS)}) ⇒ NhX augment(NhY.hY) {} ⇒ modu {} ⇒ argu For 1 ⇒ j To 3 augment(modu.1 tria1(hX.{ tan −1 (hY[j]/hX[j])}) ⇒ argu Next For 1 ⇒ t To 80 {} ⇒ NhX {} ⇒ NhY For 1 ⇒ i To 3 augment(NhX.i.3 × {0.{gT^(0.3.0}+2 ⇒ hY 1/2 ⇒ gT π /10 ⇒ gS ViewWindow -3.{√ (hX[j]^2+hY[j]^2)}) ⇒ modu augment(argu.t SetComplex SetDecimal 4. z ∈ ] (loxodromia)sobre un triángulo equilátero.2.3 × {-0.2.1. con centro en C ( −1.gS.

thickness=1): P:=[q1.b}.2]): s1:=Q-(T[1.2])/(T[2. Figura 17 Figura 18 .0-5.1]*z+T[1. El resultado para 5 niveles se muestra en la figura 18.2]): S:=sqrt(conjugate(s1)*s1): q1:=Re(Q): q2:=Im(Q): f[k]:=plottools[disk]([q1.1]+P1): Q:=(T[1.P[2]): z:=P1-r**2/conjugate(T[2.2]/T[2.0| 1.q2].thickness=2): > for k from 0 to K do P1:=Complex(P[1].1]*(P1+r)+T[2.0*I>>: > a:=plottools[disk](P. <1. Ejemplo 1: Los siguientes recuadros muestran los programas en Maple que permiten obtener una representación de la acción de dos generadores dados por las matrices “a” y “b” sobre cuatro discos dados en la figura 17.color=COLOR(RGB.1]*z+T[2.S.rand()/10^12).09: K:=50:T:=<<1.K)): > plots[display]({a. Grupos de Shottky.0]: r:=0.0*I| 1.0> ..color=black.k=0.q2]: r:=S: od: > b:=plots[display](seq(f[k].2])/(T[2.0-5.4. 6.rand()/10 ^12.1]*(P1+r)+T[1.axes=none).r.> restart: > P:=[-1.rand()/10^12.

P2.s1.r.-sec(theta)]:r:=tan(theta): > centros:=[P1.T) local P1.Im(Q)].g rupo[j]): tag[inew]:=j: inew:=inew+1: end if: od: od: num[lev+1]:=inew: od: > plots[display](seq(seq(mobius_on_circle(centros[k].axes=none).r.1]*z+T[1.num[levmax]-1).4).radios[k].2])/(T[2. color=green)}): > with(plottools): mobius_on_circle:=proc(P.disk(P4.P3.g rupo[l]).sec(theta)]: P4:=[-sec(theta).P4]: radios:=[r.k=1.0]: P3:=[0. r.color=COLOR(RGB. <I*cos(theta)/sin(theta) | 1/sin(theta)>>: > b:=<<1/sin(theta) | cos(theta)/sin(theta)> . .2]/T[2.z. color=yellow).S: P1:=Complex(P[1].1]*(P1+r)+T[2.Q.r]: > H:=plots[display]({disk(P1.l=1.S.1]+P1): Q:=(T[1.2])/(T[2..rand()/10^12)).P[2]): z:=P1-r**2/conjugate(T[2.1]*(P1+r)+T[1.1): > levmax:=5: > inv[1]:=3: inv[2]:=4: inv[3]:=1: inv[4]:=2: > a:=<<1/sin(theta) | I*cos(theta)/sin(theta)> . r.disk(P2.2]): s1:=Q-(T[1.0]: P1:=[0. r.r. r.r and()/10^12.2]): S:=sqrt(conjugate(s1)*s1): plottools[disk]([Re(Q). color=blue).> restart: > with(plottools): > theta:=evalf(Pi/4.1]*z+T[2. <cos(theta)/sin(theta) | 1/sin(theta)>>: > A:=LinearAlgebra[MatrixInverse](a): > B:=LinearAlgebra[MatrixInverse](b): > tag[1]:=1 :tag[2]:=2: tag[3]:=3: tag[4]:=4: > num[1]:=1: num[2]:=5: > grupo[1]:=a: grupo[2]:=b: grupo[3]:=A: grupo[4]:=B: > P2:=[sec(theta).disk(P3. color=red).rand()/10^12. end proc: > for lev from 2 to levmax-1 do inew:=num[lev]: for iold from num[lev-1] to num[lev]-1 do for j from 1 to 4 do if (j=inv[tag[iold]]) then next else grupo[inew]:=LinearAlgebra[MatrixMatrixMultiply](grupo[iold]..

Figura 19 Figura 20 Amplificando el recuadro mostrado obtenemos la figura 21. .Ejemplo 2 Para los círculos dados en la figura 19 aplicamos en programa dado más abajo en el recuadro. El resultado se muestra en las figuras 20 y 21.

r.2]/T[2. radios[1].2])/(T[2. radios[2].S: P1:=Complex(P[1]. color=green)}): > plots[display](H.1]+P1))): Q:=evalf(simplify((T[1.1]*z+T[1.1]*(P1+r)+T[2. color=blue). < 2*s*t| s+t>>/(s-t)**2: > A:=LinearAlgebra[MatrixInverse](a): > B:=LinearAlgebra[MatrixInverse](b): > tag[1]:=1 :tag[2]:=2: tag[3]:=3: tag[4]:=4: > num[1]:=1: num[2]:=5: > grupo[1]:=a: grupo[2]:=b: grupo[3]:=A: grupo[4]:=B: > P2:=[(1/s+1/t)/2.z. < -2| s+t>>/(s-t)**2: > b:=<< s+t| 2> .99:t:=0.Figura 21 > restart: > s:=0.blue.T. color=yellow).S.abs((s-t)/2).evalf(Im(Q))].circle(P4.0]: P1:=[-(s+t)/2.circle(P3. color=red).P2. radios[3].2]))): s1:=evalf(simplify(Q(T[1. radios[4].circle(P2.0]: P3:=[(s+t)/2.abs((1/s-1/t)/2)]: > H:=plots[display]({circle(P1.k) local P1.abs((1/s1/t)/2).P4]: radios:=[abs((s-t)/2). scaling=constrained): > with(plottools): mobius_on_circle:=proc(P.color=colores[ k].2])/(T[2.1]*(P1+r)+T[1.1]*z+T[2.green}: > with(plottools): > levmax:=5: > inv[1]:=3: inv[2]:=4: inv[3]:=1: inv[4]:=2: > a:=<<s+t | -2*s*t> .2]))): S:=evalf(sqrt(conjugate(s1)*s1)): plottools[circle]([evalf(Re(Q)).Q. end proc: .P[2]): z:=evalf(simplify(P1-r**2/conjugate(T[2.0]: P4:=[-(1/s+1/t)/2.s1.0]: > centros:=[P1.P3.1: > colores:={red.yellow.thickness=1).

3)): >p5:=plots[display](seq(mobius_on_circle(centros[3].4)): >p8:=plots[display](mobius_on_circle(centros[4].p7.l=5.radios[4].y=-1.1)): >p4:=plots[display](seq(mobius_on_circle(centros[2].H.p6.4)):> p9:=plot(-4.grupo [2].1)): >p3:=plots[display](mobius_on_circle(centros[1].1): >plots[display]({m.. .p8}.3..grupo [1].p2.k).grupo [1].radios[4].4)): >p7:=plots[display](mobius_on_circle(centros[4].p4.radios[3].radios[k ].radios[1].2).grupo [3].k=2.radios[1].4).num[levmax]-1).x=-3.p1.scaling=constrain ed).k=1.axes=none): >p1:=plots[display](mobius_on_circle(centros[1]..radios[1]...g rupo[k].1)): >p2:=plots[display](mobius_on_circle(centros[1].radios[4].grupo [4].grupo [4].gr upo[j]): tag[inew]:=j: inew:=inew+1: end if: od: od: num[lev+1]:=inew: od: >m:=plots[display](seq(seq(mobius_on_circle(centros[k]..p5.grupo[l].radios[2].p3.4)): >p6:=plots[display](mobius_on_circle(centros[4].3).> for lev from 2 to levmax-1 do inew:=num[lev]: for iold from num[lev-1] to num[lev]-1 do for j from 1 to 4 do if (j=inv[tag[iold]]) then next else grupo[inew]:=LinearAlgebra[MatrixMatrixMultiply](grupo[iold].k=1.g rupo[k].

7: > ec:=1/2*(k+1/k)=1/(y*v): > sol:=solve(ec.P4]: radios:=[1/(y*v).1/y]: . Figura 22 Figura 23 El programa empleado se muestra en los siguientes recuadros: > restart: > y:=1: v:=0.Ejemplo 3 Consideramos la disposición de los círculos dada en la figura 22.k): > k:=sol[1]: > x:=sqrt(1+y**2): u:=sqrt(1+v**2): > with(plottools): > levmax:=5: > inv[1]:=3: inv[2]:=4: inv[3]:=1: inv[4]:=2: > a:=<<u | I*k*v> . El resultado se muestra en la figura 23. <y| x>>: > A:=LinearAlgebra[MatrixInverse](a): > B:=LinearAlgebra[MatrixInverse](b): > tag[1]:=1 :tag[2]:=2: tag[3]:=3: tag[4]:=4: > num[1]:=1: num[2]:=5: > grupo[1]:=a: grupo[2]:=b: grupo[3]:=A: grupo[4]:=B: > P2:=[x/y.0]: P1:=[0. <-I*v/k |u>>: > b:=<<x | y> .1/(y*v).P2.1/y.0]: P3:=[0.-k*u/v]: > centros:=[P1.k*u/v]: P4:=[-x/y.P3.

v = 1 al principio del programa anterior los círculos se tocan tangencialmente (figura 24) y se obtiene la imagen mostrada en la figura 25 .i]:=mobius_on_circle(centros[j].Q.1]*z+T[1.scaling=constrained).color=black)..2])/(T[2.2])/(T[2.l=1.grupo[j ]): tag[inew]:=j: inew:=inew+1: end if: od: od: num[lev+1]:=inew: od: > k:=0: > for i from 1 to num[levmax]-1 do for j from 1 to 4 do if (j=inv[tag[i]]) then next else p[j.s1.2]): s1:=Q-(T[1.Im(Q)]. Ejemplo 4 Tomando y = 1. end proc: > for lev from 2 to levmax-1 do inew:=num[lev]: for iold from num[lev-1] to num[lev]-1 do for j from 1 to 4 do if (j=inv[tag[iold]]) then next else grupo[inew]:=LinearAlgebra[MatrixMatrixMultiply](grupo[iold].axes=none.i]: end if: od: od: >plots[display](seq(g[l].1]*(P1+r)+T[1.radios[j].T) local P1.1]+P1): Q:=(T[1.258).2]/T[2.P[2]): z:=P1-r**2/conjugate(T[2.S.2]): S:=sqrt(conjugate(s1)*s1): plottools[circle]([Re(Q).1]*z+T[2.r.S: P1:=Complex(P[1].grupo[i]): k:=k+1: g[k]:=p[j.z.1]*(P1+r)+T[2.> with(plottools): mobius_on_circle:=proc(P.

Figura 24 Figura 25 .

Detalle de Maple 11 .

Sign up to vote on this title
UsefulNot useful