合成と分解と表現
S3の2項演算を行列で実行する
1.群の積
このワークシートはMath by Codeの一部です。
集合と集合を九九の表のように組み合わせた要素の集合を直積(direct Product)といいます。
たとえば、
A={0,1}, B={0,1,2}としたら、たてにA、よこにBをかいた表を作るとします。
すると、2行3列の表ができるので、AとBとのすべての要素の組み合わせを全体として
とらえることができます。これが直積の例です。
この表をA×Bとかき直積といいます。Aの成分とBの成分を順に並べただけのものです。
Aの成分が0のときが1行目で(0,0),(0,1),(0,2)がならびます。
Aの成分が1のときが2行目で(1,0),(1,1),(1,2)の3列です。
ぜんぶで、タプルが2行3列できますから、A×Bの要素数は2×3になりますね。
だから、直積そのものは何も計算しているわけではなく、座標のように成分を順序よく入れるのが基本です。成分ごと操作(componts-wize operation)です。
なぜ、直積なんて考えるのでしょうか。
それは、直積があると、2項演算、関数、グラフを記号化、明確化がしやすいというのがあるでしょう。
(例)
2項演算c=a*b=a×b(mod 2)は、a∈A, b∈Bならば、A×Bの表にcの値をならべた行列で表示できますね。
この2項演算をfとすると、fはA×B→{0,1}という関数として表現できますね。
(例)
y=2xの関数fはx={0,1,2,3}に対してy={0,3,4,6}ですから,fのグラフは{(x,y)| y=2x}={(0,0),(1,2),(2,4),(3,6)}と
順序対、タプルのリストになります。この集合は直積R×Rの部分集合になりますね。
一般に、
・2つの集合AとBの直積A×Bの要素数は|A||B|と2つの要素数の積になる。
・関数f:直積A×A→Aの関数fをA上の2項演算と言う。
・関数f:R→Rに対する集合F={(x,y)|y=f(x)}は関数fのグラフといい、直積R×Rの部分集合と言えるね。
<群の直積>
n個の群の集合{G1,G2,..Gi.,Gn}があるとき、直積集合G=G1×G2×..Gi.×Gnを考えてみよう。
g1x,g2y∈G1, g2x,g2y∈G2, ....Gix,giy∈Gi,... Gnx,Gny∈Gnと各群からの適当に2要素をとりだして、
直積集合の2項演算gpx★gpyを
(g1x,g2x,...gix,...gnx)★(g1y,g2y...giy....gny)=(g1x*g1y, g2x*g2y, .....,gix*giy....gnx*gny)
と定めてみる。Gの単位元Ge=(g1e, g2e,....gie...gne)としよう。
GはGeを単位元として、各Gi成分、因子が演算*で群をなしているから
Gの演算★でも群をなすことは明らかだね。
(例)
群Z2={0,1}と群Z3={0,1,2}の直積Z2×Z3=Z23とすると、
この集合は位数が2×3=6の巡回群になりZ6同型だ。
なぜなら、x2,y2∈Z2、x3,y3∈Z3とするとき、x2+y2∈Z2, x3+x3∈Z3。
Z2の単位元は0,Z3の単位元も0。
Z23=Z2×Z3の要素に対して、2項演算x23★y23を
(x1,x2)★(y1,y2)=(x1+y1,x2+y2)と定めよう。
Z23の単位元をe=(0,0)とする。
Z23の★算はZ2成分、Z3成分の場所でそれぞれ演算しているだけだから、
閉じているしそれぞれの成分での加算が群をなすから、★算でZ23も群になる。
Z23={(0,0),(1,1),(0,2),(1,0),(0,1),(1,2)}がZ6の{0,1,2,3,4,5}に対応する。
(1,1)=1を加算の生成元とする。1をたすごとにZ2成分は0,1を繰り返し、Z3成分は0,1,2を繰り返す。
だから、このようにZ6にきれいに対応することがわかる。
<直積から成分への分解>
G1,G2が群ならG1,G2は直積G1×G2の部分群とみなせる。
これは、たとえば、G1×G2のうち、g1∈G1に対してG2成分だけeにした(g1,e)への対応は単射だから、
G1はG1×G2の部分群とみなせる。G2も同様だね。
しかも、G1、G2はG1×G2の正規部分群だ。(この説明は省略。)
<直積が巡回群になる条件>
「直積Zm×Znが巡回群になるのはmとnが互いに素であるときにかぎる。(中国剰余定理)」
互いに素であるときは、単位元0=(0,0), 生成元1=(1,1)として、Zm成分が0,..m-1を繰り返し、
Zn成分が0,...n-1を繰り返すので、最大元mnー1=(m-1,n-1)の次が0=(0,0)に戻るから位数mnの巡回群
になる。
もしmとnに公約数dがあるなら、p=m/d, q=n/dとなる整数がある。
Zm×Znの適当な元(x,y)に対して(1,1)をpdq回加える。(x+pdq, y+pdq)=(x+mq, y+mp)≡(x(mod m), y (mod n))となるから、(x,y)の位数はpdq=mn/d以下となり、群の位数がmnより小さくなる。
位数mnの元を含まないから、巡回群ではない。
(例)
Z2×Z2は巡回群ではなくクライン群になる。
Z2={0,1}とすると、Z2×Z2の元は(0,0),(0,1),(1,0),(1,1)の4つある。しかし2と2は互いに素ではないから巡回群にはならない。単位元を0=(0,0)として、1=(0,1)すると、1+1=(0,2)≡(0,0)となり1の位数が2になる。2=(1,0)としても、2+2=(2,0)≡(0,0)となり2の位数も2になる。3=(1,1)にしても2個たすと(0,0)になってしまうから、位数が2。1+2=(0,1)+(1,0)=(1,1)=3だから閉じてはいる。しかし、群の位数は4だが、要素の位数はどれも2以下で、位数4の元を含まないから巡回群ではない。
(例)
Z3×Z5は巡回群Z15になる。
<2つの部分群H,Kの直積と等しくなる群G>
「H、KがGの正規部分群でHK=G、H∩K={e}なら、H×KとGは同型になる。」
h∈H、k∈Gに対してf(h,k)=hkとすると、fは単射でHK=Gだから、H×KからGへの単射となるから。
2.群の位数と群の構造について
ラグランジュの定理というのがあったね。
群Gを部分群Hで剰余類に分けると、G=|H|+a|H|+b|H|+....と剰余類分解ができることから、
部分群Hの位数は群Gの約数であるというのがラグランジュの定理だったね。
さらに、元の位数はその元を生成元とする部分群の位数に等しいので、
群Gのどの元の位数も、Gの位数の約数だということが言えたね。
この逆のような内容がある。それがコーシーの定理だ。
<コーシーの定理>
pが有限群Gの位数の素因数ならGに位数pの元がある。
(例)
位数が2の倍数の群Gには位数2の元があることになるね。
位数2の群ではZ2={0,1}の1は位数が2だ。
位数4の群では巡回群Z4={0,1,2,3}の2は位数が2だ。クライン群Z2×Z2{(0,0),(1,0),(0,1),(1,1)}の単位元以外はみな位数が2だったね。
位数2nの巡回群Z2n={0,1,...n,...n-1}のnの位数は2だ。
位数2nの2面体群Dn={0,r^1,...r^(n-1),t, tr, tr^2,...,tr^(n-1)}のtの位数は2だ。
位数3!=6の対称群S3={e,r=(1 2 3),s=(1 3 2), a=(2 3), b=(1 2), c=(1 3)}のa,b,cの位数は2だ。
位数4!/2=12の交代群A4={e, {(a b c)| a,b,c ∈{1,2,3,4}}, {(a b)(c d)| a,b,c,d}}の(a b)(c d)型の3個の位数は2だ。
位数4!=24の対称群S4は互換の位数は2だ。
位数n!の対称群Snの互換の位数は2だ。
<シロ―の定理>
(p群とは)
素数pのべきの位数をもつ|G|=qr (q=pm、rはpの倍数でない)の群をp群という。
素数pのべきの位数をもつ|G|=p2なら、Gは可換群。
(例)位数が4の群
4=22,|G|=2×1(1は2の倍数でない)の群は2群である。Z4(C4)とV4がある。巡回群Z4={0,1,2,3}の2は位数が2だ。クライン群Z2×Z2{(0,0),(1,0),(0,1),(1,1)}の単位元以外はみな位数が2だった。
(シロ―p部分群の性質)
位数がq=pmの部分群をGのシロ―p部分群という。S(p)などとかいたりする。
1・S(p)を筆頭に、qの約数位数の部分群がある。
2・S(p)は互いに共役だから、共役作用の軌道になる。
3・S(p)の個数は1(mod p)で、r=|G|/qの約数だ。
もし、S(p)が1個だけなら、自分自身と共役だから、この1個はGの正規部分群となる。
<有限アーベル群の構造定理>
可換群なら位数が素数のべきの巡回群の直積群と同型になる。
この巡回群の種類と個数は、同型の取り方と関係なく一定で、有限アーベル群の不変量と言えるね。
(例)pが素数のときのp4の可換群
4=3+1=2+2=2+1+1=1+1+1+1の位数の和分解5個から、
p4の指数4の和分解した指数乗の巡回群の直積に分解できる。
Cp4, Cp3×Cp, Cp2×Cp2,Cp2×Cp×Cp,Cp×Cp×Cp×Cp
(例)位数72のアーベル群72=23*22だから、構造定理から次の6個が代表元となるね。
C8×C9, C8×C3×C3,C4×C2×C9, C4×C2×C3×C3, C2×C2×C2×C9,C2×C2×C2×C3×C3
<分類問題の例>
・位数が2p(pが奇素数)の群はC2pかDpと同型
(例)位数6の群Z6かD3と同型だ。
(例)位数10の群Z10かD5と同型だ。
(例)位数14の群Z14かD7と同型だ。
・位数が8の群
アーベル群ではC8,C4×C2,C2×C2×C2
非アーベル群ではD4,Q8
・位数が9の群
アーベル群だけで、C9,C3×C3
質問:さらに多くの分類問題を解くためには、どうしたらよいでしょうか。
半直積、フロベニウス群などを学ぼう。
また、インストールの手間を惜しまなければ、GAPやSageなどの群論が使える言語も調べてみよう。
実験しながら、思考を深めたり検証することができるでしょう。
視覚化の必要がなければ、インストールなしでwebでsage,gapが使えるSage Cell Serverもあります。
languageを変えて、コードを入れ、evaluateで実行できるplaygroundになっていますよ。
tutorialをコピペしたりしながら、いろいろ試して、学びを深めよう。
3.単純群と可解群
<単純群>
単純群の定義は単純だ。
群Gが素数みたいに、eとG以外の正規部分群をもたない群だ。
かといって、位数が素数というわけではない。
(例)
5次交代群A5は単純群だ。
位数は5!/2=60。
互換の積になる巡回置換の積に分解できる共役類の型とそれに対応する要素の数は、
5=3+1+1=2+2+1=2+1+1+1=1+1+1+1+1
(abcde), (abc)(d)(e), (ab)(cd)(e),(ab)(c)(d)(e),e
(5-1)!=24, 5C2*2=20, 5C2/2=5,5C2=10,1
60=24+20+5+10+1が類等式。
・正規部分群の位数は1以外の類24,20,5,10のいくつかの合計に1をたしたものだね。
・正規部分群の位数は、もとの群は割り切れるので60の約数になる。
これにあてはまるのは1か60しかない。
<一般に5次以上の交代群Anは単純群>
・交代群の置換は要素を1つ増やした交代群の置換に単射で移せる。
・5次以上の交代群は3次の巡回置換で生成される。3次の巡回置換は2つの互換の積で表せる。
(ab)(cd)=(abc)(bcd)だから、互換を2つ増やすために3次の巡回置換2つを増やせばよい。
互換の偶数個の積は3次の巡回置換の積だけで実現できる。
これらの事実を組み合わせて、帰納的に解決できるでしょう。詳細は省略。
<可解群>
アーベル正規群をもつ群が可解群
群Gの正規列(つぎつぎと連鎖的に正規部分群を並べたもの)
G=G0▷G1▷G2▷…▷Gn=1がすべての剰余群Gi-1/Giが可換なとき可換正規列、
アーベル正規列(Abelian normal series)といい、アーベル正規列をもつ群Gを可解群(Solable Group)
という。
(例)
Cn▷1だから、Cnは可解群
Dn▷Cn▷1だから、Dnは可解群
S3▷D3▷1だから、S3は可解群
S4▷A4▷V4▷1だから、S4,A4,V4は可解群
素数pで、D(G)◁G。
この交換子群の列(導来列)がn番目に1になるときに限り、Gが可解群。
4.群の表現
有限な位数の群はケーリーの定理によると、対称群の部分群として表すことができた。
だから、対称群は置換だから、辞書というデータ構造で群の2項演算を辞書の合成としてコード化することができたね。
可換群については、アーベルの構造定理が役立ったね。非可換群は、結構調べにくい。
そこで、群の置換表現だけでなく、一般線形群GLで表すことで、表現の道具を増やしてみよう。
たとえば、対称群S3の置換表現を辞書データで表してみよう。
辞書{1:x, 2:y, 3:z}を簡単のために、xyzとかくことする。すると、互換、巡回置換は数値列で表現できる。
S3={e=(1)=123, r=(123)=231, s=(132)=312, a=(12)=213, b=(23)=132, c=(13)=321}
行列で表してみよう。
e=[[1,0,0],[0,1,0],[0,0,1]], r=[[0,0,1],[1,0,0],[0,1,0]], s=[[0,1,0],[0,0,1],[1,0,0]],
a=[[0,1,0],[1,0,0],[0,0,1]], b=[[1,0,0],[0,0,1],[0,1,0]], c=[[0,0,1],[0,1,0],[1,0,0]]
質問:群S3を行列で表して、2項演算をコードで作るにはどうしたらよいでしょうか。
geogebraで作れます。
e=Identity(3)は3次の単位行列です。
何度も同じ行ベクトルをかくのが手間なので、
p1={1,0,0},p2={0,1,0},p3={0,0,1}とすることで、
Ags={e, r={p3,p1,p2},s={p2,p3,p1},a={p2,p1,p3},b={p1,p3,p2},c={p3,p2,p1}}
と簡単に指定できるし、p1,p2,p3の3要素の順列と考えると3!=6要素ができることにも合致するね。
行列の積は行列を並べてかくだけです。
行列の積がq=(1,2,3)のインデックスがどう入れ替わったかを知るためにapplymatrix(積行列、q)
をしましょう。
積(1,2,3)=(x,y,z)になることが、辞書{1:x, 2:y, 3:z}を表すので、置換表現と行列表現を行き来することができるね。3次元ベクトル空間Xから基底を選んだ数体K上のベクトル空間KXから、
G=S3の表現f:G→GL(KX);g→Agが定まる。fは準同型写像。
Pgの集まりをPとしている。
<基底の変換>
群Gの作用する線形変換fでの基底での表現がAからBに変わったとする。
つまり、
基底ベクトルをe1=,e2=,e3=としてfの表現行列をAとする。
基底を変えても群を表現することはできる。
新基底x1=e1+e2+e3=, x2=e1=, x3=e1+e2=のときのfの表現行列をBとする。
基底x=(e1,e2,e3)から新基底X=(x1,x2,x3)に変換する基底変換行列がPなら、
X=Pxだから、(x1,x2,x3)=(e1,e2,e3)P
(, , )=(,,) P
=P
P=
可換図式は次のようになるね。
A
x⇒⇒⇒f(x)
↓ ↑
↓P ↑P-1
↓ ↑
X⇒⇒⇒f(X)
B
質問:可換図式をコードでかくにはどうしたらよいでしょうか。
[IN]Python
import japanize_matplotlib
import numpy as np
from matplotlib import pyplot as plt
import networkx as nx
def kakanzushiki(f,n,funcs,E):
# グラフの作成
G = nx.DiGraph()
G.add_nodes_from(f, bipartite=0)
G.add_nodes_from(n, bipartite=1)
G.add_edges_from(E)
# グラフを描画
pos = nx.bipartite_layout(G, f)
colorList = ['white']*(len(f) + len(n))
labels = nx.get_edge_attributes(G, 'label')
nx.draw_networkx_edge_labels(G, pos, edge_labels=labels,
font_family='IPAexGothic',font_size=20,rotate = False,verticalalignment='baseline')
nx.draw_networkx(G,pos,node_color=colorList,edge_color ='green',font_size=20,
verticalalignment='baseline',arrowsize=30)
plt.show()
# グラフの設定と実行==========================================================================
f = ["x","X"]
n = ["f(x)","f(X)"]
funcs=["A", "P", "B", "1/P"]
f.reverse()
n.reverse()
E = [(f[1],n[1], {'label':funcs[0]}),(f[1],f[0], {'label': funcs[1]}),(f[0],n[0], {'label':funcs[2]}),(n[0],n[1], {'label':funcs[3]})]
kakanzushiki(f,n,funcs,E)
xからf(x)への表現Aは、表現Bを経由するとB=P-1APになる。
この表現AにAgを入れて計算すると、対応する、Bgが求められる。
つまり、群の行列表現は基底に連動して変わるということがわかるね。
ということは、計算しやすいように、基底を選ぶことで表現行列が扱いやすくなるということだね。そうすると、群の2項演算が表現行列どうしの積になるので、群の計算が線形代数の計算や
写像の問題に置き換えて議論できるということになることがわかる。
質問:新旧の基底からPとinvPを求めて可換図式に反映し、AからBを求める関数を作るコードはどうしたらよいでしょう。
pythonでは行ベクトルを多列につみあげたものが行列というデータの入力方法なので、
Pのデータを行ベクトルのリストという形式で渡しましょう。
渡されたデータから、numpyで、行列Pと逆行列inv(P)を求めて、行列を返す関数makePsを作ります。
そして、Aのデータは対称群なので、行ベクトルp1,p2,p3の順列をnumpyの行列リストとして作り出す関数
makeS3を作ります。返される行列群をAとして受け取りましょう。
そして、makePsからP,inv(P)を取得して、Aの各要素にinv(P)APをしてあげて、Bを作ればよいですね。
import japanize_matplotlib
import numpy as np
from matplotlib import pyplot as plt
import networkx as nx
from numpy.linalg import inv
from itertools import permutations
def makeS3():
p1 = np.array([1,0,0])
p2 = np.array([0,1,0])
p3 = np.array([0,0,1])
source = [p1,p2,p3]
return [np.array(x) for x in permutations(source)]
def makePs(newbase):
X = np.array(newbase)
x = np.identity(3)
P = np.dot(X,inv(x))
invP=inv(P)
return x,X,P,invP
def makeB(P,invP,A):
return [np.dot(invP,np.dot(x,P)) for x in A]
def kakanzushiki(f,n,funcs,E):
# グラフの作成
G = nx.DiGraph()
G.add_nodes_from(f, bipartite=0)
G.add_nodes_from(n, bipartite=1)
G.add_edges_from(E)
# グラフを描画
pos = nx.bipartite_layout(G, f)
colorList = ['white']*(len(f) + len(n))
labels = nx.get_edge_attributes(G, 'label')
nx.draw_networkx_edge_labels(G, pos, edge_labels=labels,
font_family='IPAexGothic',font_size=10,rotate = False,verticalalignment='baseline')
nx.draw_networkx(G,pos,node_color=colorList,edge_color ='green',font_size=10,
verticalalignment='center',arrowsize=15)
plt.show()
# グラフの設定と実行===============================================================
x,X,P,invP=makePs([[1, 1, 1],[1, 0, 1],[1, 0, 0]])
Ag=makeS3()
Bg=makeB(P,invP,Ag)
print("Ag:")
for item in Ag:
print(item)
print("Bg:")
for item in Bg:
print(item)
f = [f"x{x}",f"X{X}"]
n = ["f(x)","f(X)"]
funcs=["A", f"P{P}", "B", f"1/P{invP}"]
f.reverse()
n.reverse()
E = [(f[1],n[1], {'label':funcs[0]}),(f[1],f[0], {'label': funcs[1]}),(f[0],n[0], {'label':funcs[2]}),(n[0],n[1], {'label':funcs[3]})]
kakanzushiki(f,n,funcs,E)
Ag:
[[1 0 0]
[0 1 0]
[0 0 1]]
[[1 0 0]
[0 0 1]
[0 1 0]]
[[0 1 0]
[1 0 0]
[0 0 1]]
[[0 1 0]
[0 0 1]
[1 0 0]]
[[0 0 1]
[1 0 0]
[0 1 0]]
[[0 0 1]
[0 1 0]
[1 0 0]]
Bg:
[[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]]
[[ 1. 0. 1.]
[ 0. 1. 1.]
[ 0. 0. -1.]]
[[ 1. 0. 0.]
[ 0. -1. 0.]
[ 0. 1. 1.]]
[[ 1. 1. 1.]
[ 0. 0. 1.]
[ 0. -1. -1.]]
[[ 1. 0. 1.]
[ 0. -1. -1.]
[ 0. 1. 0.]]
[[ 1. 1. 1.]
[ 0. 0. -1.]
[ 0. -1. 0.]]
表現行列Bは、1行1列目がすべて1になっているのは、新基底x1=e1+e2+e3は、旧基底e1,e2,e3の置換には左右されないからだね。
geogebraでもやってみよう。