曲面のホモロジー群
このワークシートはMath by Codeの一部です。
前回は、図形を単純な単体からできたものと考えたり、
単体を基底にしてつないだ鎖としての自由なたし算の群、鎖群を考えたり、
鎖群の境界を求めたりしたね。
図形のつながり方が同じときに同相といった。
同相ならば、オイラー指標が一致することは単体にして数えたり、規則性から推理できる。
同相ならば、変わらない量を不変量と呼ぶ。
同相ならば、同型になるものがある。それが、ホモロジー群だ。
※これは同相の条件ではなく、性質なので注意したい。
<ホモロジー群>
鎖の複体では、どの段階でも鎖K=Cn+1の境界の境界はゼロ、dn(dn+a(K))=0となる。
言い換えると、前回B1がZ1の部分で、Z1がC1の部分だった。
Z1の部分群B1にとよる商群(同値類群)を
1次のホモロジー群といい、H1とかく。H1=Z1/B1
一般に、n+1複体では、BnがZnの部分でZnがCnの部分となる。
n次のホモロジー群はHnとかき、
Hn=Zn/Bn
さらに、Hnを行列にしたときのランク、線形独立の階数をn次のベッチ数βnという。
HnがZと同型ならばベッチ数は1
HnがZ×Zと同型ならばベッチ数は2
Hnがゼロ写像と同型ならばベッチ数は0。
ホモロジー群がベクトル空間であるとみなしたときの次元数です。
βn=rank(Hn)
H0は、点の連結したかたまり数。
H1は、面上の独立なループ数。
H2は、面に囲われた閉じた空洞の数。
1.長方形のホモロジー群H1
<穴のない長方形>
穴のない長方形K=ABCDの対角線ACをつけた図形のH1を求めてみよう。
K={A,B,C,D,AB,BC,CD,DA,AC,ABC,ACD}
2鎖C2(K)=sABC+tACD,
1鎖C1(K)=sAB+tBC+uCD+vDA+wAC
・輪体Z1=m(AB+BC+CA)+n(AC+CD+DA)=<AB+BC+CA, AC+CD+DA>
・境界B1=d2(C2(K))=d2(sABC+tACD)=s(BC-AC+AB)+t(CD-AD+AC)
=s(AB+BC+CA)+t(AC+CD+DA)=<AB+BC+CA, AC+CD+DA>
・Z1とB1で基底は一致しているから、H1=Z1/B1={0}
基点に回収できないループはない。H1の自由度は0次元だから、ベッチ数は0だね。
穴のない図形ABCD
<穴のある長方形>
長方形ABCDに穴ABCをあけた図形のH1を求めてみよう。
K={A,B,C,D,AB,BC,CD,DA,AC,ACD}
2鎖C2(K)=tACD
1鎖C1(K)=sAB+tBC+uCD+vDA+wAC
・輪体Z1=m(AB+BC+CA)+n(AC+CD+DA)=<AB+BC+CA, AC+CD+DA>
・境界B1=d2(C2(K))=d2(tACD)=t(CD-AD+AC)=<AC+CD+DA>
・Z1はB1に対して、m(AB+BC+CA)の自由度を多く持っている。
mは整数だから、H1=Z1/B1=Zとなる。
三角形ABCに穴のあいたループが1つある。H1の自由度は1次元だから、ベッチ数は1だね。
穴のある図形ABCD
2.曲面の展開図のホモロジー群
長方形の分析と同じ要領で、
ユークリッド3次元空間内の曲面での穴、ループについての情報を得たい。
曲面の展開図を使ってみよう。
計算の量を減らすために、2次元単体としては3角形ではなく2角形もありにしよう。
面を細分したり、その逆に統合しても同相であるかどうかは変わらないということを前提とする。
<球面の展開図>
Aが北極、Bが南極とする。2本の経線をC、Dとする。日本の東半球をE、西半球をWとする。
球の展開図のH1を求めてみよう。
K={A,B,C,D,E,W}
2鎖C2(K)=tE+sW
1鎖C1(K)=sC+tD
・d1(C1(K)=d1(sC+tD)=s(B-A)+t(B-A)=(s+t)(B-A)=0となるのはs=-tとして、
輪体Z1=sC-sD=s(C-D)=<C-D>
・境界B1=d2(C2(K))=d2(tE+sW)=t(C-D)+s(C-D)=<C-D>
・Z1とB1で基底は一致しているから、H1=Z1/B1={0}
基点に回収できないループはない。H1の自由度は0次元だから、ベッチ数は0だね。
球の展開図
<トーラスの展開図>
トーラス面をループvで切ってループuが直線になるように変形すると、
トーラス面は円柱の側面の形になるね。Aは2つの円周にあり、uの両端にある。
次にループuに沿って切って広げると長方形になる。
このとき、Aは2つの円周ループvが直線AAになり、ループuも2直線AAになる。
ということは、展開図の長方形はAAAAとなるね。
トーラスの展開図AAAAのH1を求めてみよう。
K={A,u,v,T}
2鎖C2(K)=tT
1鎖C1(K)=su+tv
・d1(C1(K)=d1(su+tv)=s(A-A)+t(A-A)=(s+t)(A-A)=(s+t)O=0となるのはs,tは任意。
輪体Z1=su+tv=Z<u, v>
・境界B1=d2(C2(K))=d2(tT)=t(u-v-u+v)=(t-t)(u-v)={0}
{0}は要素数としては1だから、/B1は/0ではないので、意味がある。
・H1=Z1/B1=Z<u,v>
1次元のループは2種類あり、H1の自由度はuとvの2次元だから、ベッチ数は2だね。
剰余類としては、Z1のu,vのあるなしで22=4がH1のコセット数になるね。
このように、見た目で穴数がすぐわかるような図形のホモロジー群を計算するのは
それほど意味を感じられないかもしれない。
しかし、複雑な曲面や図形でも、根本のロジックは単純だ。
それが行列、ベクトルを使った代数計算でできるというところに可能性を感じられるね。
質問:ホモロジー群のベッチ数を求めるコードはどうかけばよいでしょうか。
行列の階数計算のために、sympyを「pip install sympy」などを実行して環境に入れましょう。
・基底ベクトルの名前ではなく、0次から2次の鎖の基底の次元を入れます。
・境界写像d3は0->C3への写像だから、いつも0写像です。
境界写像d0はC0->0の写像だから、いつも0写像です。だから、ともにランクは0ですね。
残りの境界写像d1,d2は曲面と用意した点、辺、面の数で変わるので読み取らせましょう。
・Znの自由度はC1の自由度からd1、つまりBn-1の自由度を引いた残りです。
Bnの自由度は、境界写像dn+1の自由度を入れます。
Hn=Zn-Bnから、残った自由度がn次のホモロジー群のベッチ数になりますね。
[In]Python
#=============================================
#複体の点、辺、面の単体次元dimC0,dimC1,dimC2
#境界写像d1:C1->C0, d2:C2->C1を引数にして、複体の0次、1次、2次のベッチ数を
#ホモロジー群のランクから求める。
import numpy as np
from sympy import Matrix
def homology_rank(dimC0,dimC1,dimC2,d1,d2):
#d3,d0はゼロ写像だから、ランクは0
Z0 = dimC0
B0 = d1.rank()
Z1 = dimC1 - B0
B1 = d2.rank()
Z2 = dimC2 - B1
B2 = 0
print(f"H0,H1,H2 = (Z0 - B0, Z1 - B1, Z2 - B2 )={Z0 - B0, Z1 - B1, Z2 - B2}")
# トーラス=====================================================
# K={A,u,v,T}
# 基底の次元 # {A},{u,v},{T}
# 境界写像d1: C1 -> C0 (d1(u)=d1(v) = A - A = 0だからゼロ写像です)
# 境界写像d2: C2 -> C1 (Tの境界は u-v-u+v=0 だからゼロ写像です)
homology_rank(1,2,1,Matrix([[0, 0]]),Matrix([[0],[0]]))
#==============================================
[OUT]
H0,H1,H2 = (Z0 - B0, Z1 - B1, Z2 - B2 )=(1, 2, 1)
上の図をみて、球面のホモロジー群のランクを求めてみよう。
# 球面=====================================================
# K={A,B,C,D,E,W}
# 基底の次元 # {A,B},{C,D},{E,W}
# 境界写像d1: C1 -> C0 (d1(C)=d1(D) = B - A)
# 境界写像d2: C2 -> C1 (d2(E)=d2(W) = C - D)
homology_rank(2,2,2,Matrix([[1, -1],[1, -1]]),Matrix([[1, -1],[1, -1]]))
#==============================================
[OUT]
H0,H1,H2 = (Z0 - B0, Z1 - B1, Z2 - B2 )=(1, 0, 1)
ホモロジー群のランクは前後のBの残差の自由度
3.メビウスの帯など
メビウスの帯の展開図をかいて、
ホモロジー群のランクがどうなるかをさぐってみよう。
その前に円柱の側面(アニュラス)で練習しておこう。
トーラスをループvで切ってのばしたのがアニュラスだ。
開くことで、Aの点がAとBに分かれるね。それに伴って辺も1本wが増えるね。
# アニュラス(円柱の側面)=====================================================
# G={A,B,u,v,w,T}
# 基底の次元 # {A,B},{u,v,w},{T}
# 境界写像d1: C1 -> C0 (d1(u)= B - A ,d1(v) = A - A = 0, d1(w)= B - B = 0)
# 行列のu列だけB行とA行で係数1,-1が入り、v列、w列は0にする。
# 境界写像d2: C2 -> C1 (Gの境界は u-w-u+v = v-w )
# 行列のu行、v行、w行の順にT列の値に係数をかける。
homology_rank(2,3,1,Matrix([[1, 0, 0],[-1, 0, 0]]),Matrix([[0],[1],[-1]]))
#===============================================
[OUT]
H0,H1,H2 = (Z0 - B0, Z1 - B1, Z2 - B2 )=(1, 1, 0)
メビウスの帯は同じ辺uどうしを逆向きにして貼り合わせる。
# メビウスの帯=====================================================
# G={A,B,u,v,w,T}
# 基底の次元 # {A,B},{u,v,w},{T}
# 境界写像d1: C1 -> C0 (d1(u)= B - A ,d1(v) = A - B , d1(w)= B - A)
# 行列のu列、v列、w列の順にB係数行は1,-1,1、A係数行は-1,1,-1
# 境界写像d2: C2 -> C1 (Gの境界は u-w+u+v =2u+v-w )
# 行列のu行、v行、w行の順にT列の値に係数をかける。
homology_rank(2,3,1,Matrix([[1, -1, 1],[-1, 1, -1]]),Matrix([[2],[1],[-1]]))
#===============================================
H0,H1,H2 = (Z0 - B0, Z1 - B1, Z2 - B2 )=(1, 1, 0)
1回ひねっているのに円柱の側面と同じランクになってしまった。
H0=1なのは、1つながりだから。
H1=1なのは、くだにまきつけたループが1種類だけ可能で、あとは0に回収できる。
H2=0なのは、曲面の空洞はトーラスや球面のように囲われた空洞がないから。
同相な図形はホモロジー群が同型になるという性質が間違っているわけではない。
ホモロジー群が同型であることが、同相な図形の条件にはならないということだね。
面の向きや、ループの向きの情報までは、ホモロジー群でとらえることは難しそうだね。