Google ClassroomGoogle Classroom
GeoGebraGeoGebra Classroom

フックス群でポアンカレ円盤を敷き詰めよう

前回はモジュラー群を使って格子の基底比に作用させることで、 変わるものと変わらないものを探りましたね。 今回は、モジュラー群の仲間である「フックス群」であそぼう。 フックス群も複素平面上に基本領域を持ち、平面上の点に作用します。 フックス群が作用した結果として、テセレーション(敷き詰め)のアートができるのです。 その仕組みを探りながら、アートであそんでみましょう。

1.ポアンカレ円盤

<フックス群が作るテセレーションのアートのイメージ> さて、フックス群が作るテセレーションのアートは、 エッシャーがだまし絵を作るときにも利用されたといわれていますね。 イメージとしては次のように作用します。 まず、無限に広い平面を、「外側の円周すべてが無限の彼方(無限遠点)」となるように、 丸い円盤(ポアンカレ円盤)の中にギュッと閉じ込めます。 この世界では、中心から外側の円周(境界)に近づけば近づくほど、「私たちの目には、空間の物差しが無限に細かく縮んでいく」という特殊なルールがあります。 言い換えると、中心から遠くにある領域ほど、外から見る私たちには小さく縮小されて映るのです。 そのため、1つの基本領域をフックス群の作用で周囲に変形コピーしていくと、双曲世界の住人にとっては「すべて同じ大きさの部屋」なのに、外から見る私たちの目には、円周に向かって無限に小さく縮みながら、万華鏡のように敷き詰められていくように見えます。 さらに、この世界での「まっすぐな直線(最短経路)」は、私たちの目には「外側の円周に直角に交わる円弧」として映ります。この、無限遠に向かって幾何学模様がどこまでも凝縮していく構造と、美しくカーブする円弧のネットワークが重なりあい、圧倒的な対称性を持つテセレーション・アートが完成するのです。 <ポアンカレ円盤の作り方> 空間に計量のルールを入れたものを位相空間といいますね。 ポアンカレ円盤という位相空間では、どんな特殊ルールでできているのでしょうか。 非ユークリッド幾何に双曲幾何というのがあるという話は聞いたことがありますよね。 ユークリッド空間が曲率0なのに対して、曲率が負の空間だという言い方もできます。 平行線は交わらないのですが、平行でない2直線は1点で交わるか交わらないかです。 また、直線はすべて双曲線になります。 ボールの表面にかいた三角形の3辺が中からおされて内角の和が180度を超えるのと反対になります。 三角形の3辺が中に吸い寄せられたくぼんで内角の和が180度を下まわるのです。 ポアンカレ円盤は双曲幾何を視覚化する道具にもなっています。 無限に広がる双曲平面全体が単位円の中に収まります。 をポアンカレ円盤に移す写像は等角写像になっています。 という1次分数です。 このモデルでは、双曲線状の直線は境界に直交する円弧として現れる。 課題:geogebraで。ポアンカレ円盤をかいてみよう。 p(z)=(z-i)/(z+i) #これがユークリッド平面をポアンカレ円盤に移す写像は等角写像です。 #うすいピンク色でガイドラインのような不思議な1+0i をブラックホール、無限遠点とする、 4つの円が縮小写像を繰り返す円集合が浮かびあがります。 #水平線の代わりに上半平面の高さ0,1,2の点集合をつくる。 edge=Sequence(0 i +k,k,-5,5} hori1=Sequence(1 i +k,k,-5,5} hori2=Sequence(2 i上半平面 +k,k,-5,5} #垂直線の代わりに虚軸から右に1,2の点集合を作る。 vert1=Sequence(1+k i, k, 0,5} vert2=Sequence(2+k i, k, 0,5} #これらの5つの点集合を5本の直線とみなして、ポアンカレ円盤にうつす。 pedge=zip(p(k),k,edge) #原点0+0iを中心とする半径1の円周上で点1+0iに集まる途中の11点 phori1=zip(p(k),k,hori1) #1/2+0iを中心とする半径1/2の円周上で点1+0iに集まる途中の11点 phori2=zip(p(k),k,hori2) #2/3+0iくらいを中心とする半径1/3くらいの同様の円周上の11点 pvert1=zip(p(k),k,vert1) #1-1iを中心としてpedge円内の弧で点1+0iに集まる途中の6点 pvert2=zip(p(k),k,vert2)#1-1/2iを中心としてpedge円内の弧で点1+0iに集まる途中の6点 この結果を観察すると、上半平面が原点中心の単位円にきれいに入ることがわかるでしょう。 水平線は1+0iに接する円周となり、水平線の高さniになると、円の半径は1/nになります。 垂直線は1+0iに交わる円弧となり、垂直線が虚軸から右にnズレると、円の半径は|1/n|になります。 円の中心の実部はすべて1です。 円の中心の虚部は、nが正のときは負になっているので、nが負のときは正になると予想できるね。 課題:geogebraで。ポアンカレ円盤の点を細かくして円弧らしさをあげよう。 さっきの課題で作った点数を増やし、点の距離間隔を小さくしよう。 そのためには、たとえば次のようにしましょう。 Sequence(☆,k,0,5}をSequence(☆,k,0,50,0.1}に Sequence(☆,k,-5,5}をSequence(☆,k,-50,50,0.1}にして半平面のもとの点リストを非表示にしましょう。 そして、p☆というポアンカレ円内の点リストを選択して、設定アイコン集の スタイル(サイズ)を5から3くらいに小さくします。 また、今後のために、上半平面のたて線と横線がどこに動くかを意識しておきたいですね。 だから、水平線グループを赤、垂直線グループを青とします。 そして、点の模様のプロパティが輪郭ありの中をうすくするがデフォルトなので、 それを輪郭なしで塗りつぶすアイコン●に選び直します。 すると、点が重なると色だけがきれいにつながりますね。 そして、きれいにブラックホール、無限遠点だけポツンと穴があいた円弧のあつまり、 それがポアンカレ円盤だという真相がせまってきますね。

ポアンカレ円盤で双曲幾何の見える化をする

ポアンカレ円盤の改造版

2.フックス群

さっきまで、ポアンカレ円盤のルール(ケイリー変換とも言います)によるgeogebraの実験から、 上半平面の垂直・水平部分が単位円の中にどう変形してうつるかを具体的に実験・観察して推論しましたね。 次はフックス群を見てみよう。 今度は、群論的な視点から理屈で考えてみましょう。 <フックス群って何?> フックス群は、 PSL(2,R)の離散部分群で、上半平面の 等距離変換(isometry) です。メビウス変換ともいわれますね。 等距離変換は距離、角度を保存し、測地線を測地線のまま移します。 PSL(2,ℤ) は PSL(2,R) の中の離散部分群で、その代表例がモジュラー群です。 かんたんに言い換えると、 PSL(2,R)は、モジュラー群の拡張と言えるから、 S=z+1,T=-1/zというモジュラー群の生成元も使えるね。 反転Tはそのままで、スライドSの自由度が増える。 一般的にはSn=z+nで、nに1も含む実数を入れることができる。 たとえば、n=2としてプラス2のシフトや、n=√2のヘッケ群シフトなどが有名。 <フックス群の基本領域D> 群が作用する空間は上半平面です。この中の1部分を基本領域Dとしましょう。 基本領域Dはフックス群gの作用で境界が“ちょうどぴったり”貼り合わさるように、 基本領域の境界∂Dが測地線(=等距離写像で不変な曲線)でなければなりません。 ・上半平面の境界Im(z)=0に直交する曲線が「最短経路」、なので、測地線になります。 上半平面モデルの計量はds2=(dx2+dy2)/y2 です。この計量は 境界(実軸)に対して反転対称性を持つため、 なぜならば、「境界が無限遠点」になっている実軸は「無限遠」に押しやられているので、 境界に近づくほど距離が伸びます。境界に斜めに近づく曲線は「境界に近づくほど余計に距離が伸びる」ため、最短経路になれません。だから、境界に直交する曲線だけが「境界に近づく角度が最小」で、最短経路(測地線)になるのです。 境界(実軸)に直交する曲線は 垂直線x=constと 半円(x−a)^2+y^2=R^2だけです。 だから、フックス群の基本領域Dは「縦線+円弧」です。 左右の境界はRe(z)=-1/2, Re(z)=1/2。 上下の境界は半円∣z∣=1と∞。 ∞と実軸はフックス群の作用で、定点か移りあうだけなので安定してます。 左右の境界はスライドz+1でぴったり重なります。 半円の境界は反転-1/zでぴったり重なります。 ということで、 左の境界と半円の交点をA(-1/2+√3/2 i=ω)とし、 右の境界と半円の交点をB(1/2+√3/2 i =ω+1)とします。 それに、無限遠をCとします。 上半平面の三角形ABCの境界は左右は虚軸に平行な直線Re(z)=±1/2。 辺ABは原点を中心とする半径1の円弧の偏角がπ/3から2π/3までの部分です。 さあ、あとはこの三角形ABCをケーリー変換p(z)=(z-i)/(z+i)でどうなるかを計算するだけです。 垂直線は1+0iに交わる円弧となり、垂直線が虚軸から右にnズレると、円の半径は|1/n|になります。 A、Bともに虚部の絶対値が1/2だから、円の半径は逆数で2です。円の中心の実部は1です。 円の中心の虚部は、A(-1/2)のとき正、B(1/2)から負となりますね。 つまり、Aは半径2で中心(1,2)の円周上、Bは半径2で中心(1,-2)の円周上にあります。 水平線は1+0iに接する円周となり、水平線の高さniなると、円の半径は1/nになります。 だから、上半平面の線分ABはn=√3/2だから、A,Bは半径1/n=2/√3で1+0iで接する円周上にあります。 これら3つの円の交点からA'B'が決まりますね。 CはC'1+0i(無限遠点)にうつります。 とうことは、三角形A'B'C'はA'C',B'C'が、半径2で実軸のCで接する上下の弧になりますね。 問題は辺ABが弧でしたが、A'B'はどうなるかです。 これは意外と簡単にわかります。弧ABの中点Mはiでした。iにケーリーをかませよう。 p(i)=(i-i)/(i+i)=0/2i=0 何と原点ピッタですね。 半円弧の左端P(1), 右端Q(-1)はどこに移るでしょうか? p(1)=(1-i)/(1+i)=(1-i)^2/(1+1)=-iだから、実部ゼロですね。 p(-1)=(-1-i)/(-1+i)=(-1-i)^2/(1+1)=iだから、実部ゼロですね。 つまり、半円弧PMQの途中で線が波打つはずがないから、すべて実部0で虚軸上にならぶと予想できるね。 課題:geogebraでフックス群の基本領域の三角形ABCをポアンカレ円盤にうつそう。 タイトルは「フックス群の基本領域」 p(z)=(z-i)/(z+i) w1=-1/2+sqrt(3)/2 i w2=w1+1 edge=Sequence(k+0 i ,k, -50, 50, 0.1) #グレー、●、サイズ1 AC=Sequence(w1+k i ,k, 0, 50, 0.1) #赤、●、サイズ3 BC=Sequence(w2+k i ,k, 0, 50, 0.1) #緑、●、サイズ3 AB=Sequence((1; π/180 k ,k, 60, 120) #青、●、サイズ3 pedge=Zip(p(k),k,edge) #グレー、●、サイズ1 pAC=Zip(p(k),k,AC) #赤、●、サイズ3 pBC=Zip(p(k),k,BC) #緑、●、サイズ3 pAB=Zip(p(k),k,AB) #青、●、サイズ3 三角形ABCが 直線・直線・円弧から円弧・円弧・直線にうつりましたね。

フックス群の基本領域

2.数学からアートへ

ここまでは数学でした。 ここからはアートです。 geogebraのコマンドで、図形を変形したりコピーしたりするのす。 フラクタル図形を作るときのことを思い出してください。 シェルピンスキーのギャスケットを作るときに、MidPointとDilateコマンドが大活躍しました。 中点と相似縮小の繰り返しでした。 A=(0,0) B=(1,0) Polygon(A,B,3)で決まる点がC H={A,B,C} D=Midpoint(B,C) E=Midpoint(C,A) F=Midpoint(A,B) 中点はよいとしてもDilateという相似縮小コマンドを探して、対称性を利用して、縮小の視点を リストから探して、順次縮小三角形を作っていくことになる。 変数は重複したり、For文が使えないので、 定数のような順次縮小の命令を並べるのがせいぜいだ。 S1=SequencePolygon(Dilate(D,((1)/(2)),Element(H,k)),Dilate(E,((1)/(2)),Element(H,k)),Dilate(F,((1)/(2)),Element(H,k))),k,1,3) S2=Sequence(Dilate(S1,((1)/(2)),Element(H,k)),k,1,3)) S3=Sequence(Dilate(S2,((1)/(2)),Element(H,k)),k,1,3)) S4=Sequence(Dilate(S3,((1)/(2)),Element(H,k)),k,1,3)) S5=Sequence(Dilate(S4,((1)/(2)),Element(H,k)),k,1,3)) S6=Sequence(Dilate(S5,((1)/(2)),Element(H,k)),k,1,3)) ではフックス群で深さ1でコピーするにはどうしたらよいでしょうか。 課題:geogebraで基本領域を反復コピーするにはどうしますか。 1つの方法は、右半平面の段階で増殖させる方法です。 # 1. 上半平面でのモジュラー群の動き(関数)を定義 S(z) = -1 / z #Symmetry R(z) = z + 1 #Right L(z) = z - 1 #Left # 上半平面で変形させてから、最後にポアンカレ写像 p(z) で円盤に送りましょう。 # 2. 【Sを作用させた部屋】(池にうつる部屋) pSAC = Zip(p(S(k)), k, AC) # 色:オレンジ、●、サイズ3 pSBC = Zip(p(S(k)), k, BC) # 色:オレンジ、●、サイズ3 pSAB = Zip(p(S(k)), k, AB) # 色:オレンジ、●、サイズ3 # 3. 【Tを作用させた部屋】(右隣となりの部屋) pRAC = Zip(p(R(k)), k, AC) # 色:紫、●、サイズ3 pRBC = Zip(p(R(k)), k, BC) # 色:紫、●、サイズ3 pRAB = Zip(p(R(k)), k, AB) # 色:紫、●、サイズ3 # 4. 【T⁻¹を作用させた部屋】(左隣となりの部屋) pLAC = Zip(p(L(k)), k, AC) # 色:ピンク、●、サイズ3 pLBC = Zip(p(L(k)), k, BC) # 色:ピンク、●、サイズ3 pLAB = Zip(p(L(k)), k, AB) # 色:ピンク、●、サイズ3 ただし、これだと問題があります。 geogebraの極形式は実数平面の点でしかないので、 ABの移動先が単位円の弧になってしまうようです。 なので、ABの定義を素直に複素数とわかる形式に上書きしましょう。 # 角度kを60度から120度まで0.1刻みで動かし、複素数の円弧を作ります AB = Sequence(cos(k° ) + sin(k° ) ί, k, 60, 120, 0.1)

フックス群の基本領域から深さ1

もう1つの方法をためしてみましょう。 フックス群というよりも図形としてのReflectコマンドですまそうという作戦です。 課題:Reflectコマンドを使って、ポアンカレ円盤の中で対称コピーを深さ1でやろう。 #M☆は鏡(対称軸です) MBlue = Line((0,0), (0,1)) MRed = Circle((1,2), 2) MGreen = Circle((1,-2), 2) #Reflect(対象、対称軸)で鏡映図形を作る。 pAC_b = Reflect(pAC, MBlue) pBC_b = Reflect(pBC, MBlue) pAB_b = Reflect(pAB, MBlue) pAC_r = Reflect(pAC, MRed) pBC_r = Reflect(pBC, MRed) pAB_r = Reflect(pAB, MRed) pAC_g = Reflect(pAC, MGreen) pBC_g = Reflect(pBC, MGreen) pAB_g = Reflect(pAB, MGreen) さてどうでしょうか。Reflectを使うと、色まで受け継いでくれるので、色分け不要です。 点のサイズも受け継いでますね。すばらしい。標準コマンドの威力ですね。 こうなってくると、geogebraではfor文がないので、 iteratorとか使いたくなりますが、それはそれで大変ですよね。 それと深さ2では、 深さ1で移った図形全体の外周の辺を式にしないと、対称軸として再利用できないからです。 そこで、pAC,pBC,pABをスタートにして、実平面での図形としての数式にしてみます。 複素平面での話題であることを捨ててしまいます。 しかし、いざ弧Arcを書こうとすると、中心点、半径、円周上の点など前提情報が必要になっています。

フックス群の基本領域のreflect

境界を実数の数式にしてreflectの途中

そこで、 ♯ベースの3辺 p1=Segment((0, 0.27), (0, -0.27)) #AB p2=CircularArc((1,-2),(1,0),(0, -0.27)) #BC p3=CircularArc((1,2),(0, 0.27),(1,0)) #BC ♯深さ1の3×2=6辺 p21=Reflect(p2,p1) ;p31=Reflect(p3,p1) p12=Reflect(p1,p2) ;p32=Reflect(p3,p2) p23=Reflect(p2,p3) ;p13=Reflect(p1,p3) ♯深さ2の6×2=12辺 #p23,p13,p3の次の世代を4本 p313=Reflect(p3,p13) ;p323=Reflect(p3,p23) ; p2313=Reflect(p23,p13) ;p1323=Reflect(p13,p23) #p31,p21,p1の次の世代を4本 p131=Reflect(p1,p31) ;p121=Reflect(p1,p21) ;p3121=Reflect(p31,p21) ;p2131=Reflect(p31,p21) #p32,p12,p2の次の世代を4本 p232=Reflect(p2,p32) ;p212=Reflect(p2,p12) ;p3212=Reflect(p32,p12) ;p1232=Reflect(p12,p32) 気が遠くなりそうですが、 リストとzipを使ってもうまくいかなかったので手作業はこのくらいにしておきます。 時間があれば次の深さ3の24辺の追加も同じ論理で作れそうですね。。。。 実際やってみると、p2313=Reflect(p23,p13)の弧が円の補集合で大きい方の弧になりポアンカレ円盤をはみ出してしまいます。 Reflectの計算の限界のようですね。残念です。 どうしてもテセレーションの美しさを感じて、 美しさに到達できるまでの努力を想像したい人は、こちらをどうぞ。

https://wdv.com/Fuchsian/

https://wdv.com/Fuchsian/