[size=150][b]このワークシートは[url=https://www.geogebra.org/m/twxxx3yq]Math by Code[/url]の一部です。[br][br]集合と集合を九九の表のように組み合わせた要素の集合を[color=#0000ff]直積(direct Product)[/color]といいます。[br][/b][size=100]たとえば、[br]A={0,1}, B={0,1,2}としたら、たてにA、よこにBをかいた表を作るとします。[br]すると、2行3列の表ができるので、AとBとのすべての要素の組み合わせを全体として[br]とらえることができます。これが直積の例です。[br]この表をA×Bとかき直積といいます。Aの成分とBの成分を順に並べただけのものです。[br]Aの成分が0のときが1行目で(0,0),(0,1),(0,2)がならびます。[br]Aの成分が1のときが2行目で(1,0),(1,1),(1,2)の3列です。[br]ぜんぶで、タプルが2行3列できますから、A×Bの要素数は2×3になりますね。[br][color=#0000ff]だから、直積そのものは何も計算しているわけではなく、座標のように成分を順序よく入れるのが基本です。[b]成分ごと操作(componts-wize operation)[/b]です。[/color][br][/size][/size][b]なぜ、直積なんて考えるのでしょうか。[br][/b]それは、直積があると、2項演算、関数、グラフを記号化、明確化がしやすいというのがあるでしょう。[br][color=#0000ff](例)[/color][br]2項演算c=a*b=a×b(mod 2)は、a∈A, b∈Bならば、A×Bの表にcの値をならべた行列で表示できますね。[br]この2項演算をfとすると、fはA×B→{0,1}という関数として表現できますね。[br][color=#0000ff](例)[/color][br]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)}と[br]順序対、タプルのリストになります。この集合は直積R×Rの部分集合になりますね。[br]一般に、[br]・2つの集合AとBの[b]直積A×Bの要素数[/b]は|A||B|と2つの要素数の積になる。[br]・関数f:直積A×A→Aの関数fをA上の[b]2項演算[/b]と言う。[br]・関数f:R→Rに対する集合F={(x,y)|y=f(x)}は[b]関数fのグラフといい、直積R×Rの部分集合と言えるね。[br][/b]
[b][size=150]<群の直積>[/size][/b][br]n個の群の集合{G1,G2,..Gi.,Gn}があるとき、直積集合G=G1×G2×..Gi.×Gnを考えてみよう。[br]g1x,g2y∈G1, g2x,g2y∈G2, ....Gix,giy∈Gi,... Gnx,Gny∈Gnと各群からの適当に2要素をとりだして、[br]直積集合の2項演算gpx★gpyを[br](g1x,g2x,...gix,...gnx)★(g1y,g2y...giy....gny)=(g1x*g1y, g2x*g2y, .....,gix*giy....gnx*gny)[br]と定めてみる。Gの単位元Ge=(g1e, g2e,....gie...gne)としよう。[br]GはGeを単位元として、[b]各Gi成分、因子が演算*で群をなしているから[br]Gの演算★でも群をなす[/b]ことは明らかだね。[br][color=#0000ff](例)[/color][br][b]群Z2={0,1}と群Z3={0,1,2}の直積Z2×Z3=Z23とすると、[br]この集合は位数が2×3=6の巡回群になりZ6同型[/b]だ。[br]なぜなら、x2,y2∈Z2、x3,y3∈Z3とするとき、x2+y2∈Z2, x3+x3∈Z3。[br]Z2の単位元は0,Z3の単位元も0。[br]Z23=Z2×Z3の要素に対して、2項演算x23★y23を[br](x1,x2)★(y1,y2)=(x1+y1,x2+y2)と定めよう。[br][br]Z23の単位元をe=(0,0)とする。[br]Z23の★算はZ2成分、Z3成分の場所でそれぞれ演算しているだけだから、[br]閉じているしそれぞれの成分での加算が群をなすから、★算でZ23も群になる。[br]Z23={(0,0),(1,1),(0,2),(1,0),(0,1),(1,2)}がZ6の{0,1,2,3,4,5}に対応する。[br][b](1,1)=1を加算の生成元とする。1をたすごとにZ2成分は0,1を繰り返し、Z3成分は0,1,2を繰り返す。[/b][br]だから、このようにZ6にきれいに対応することがわかる。[br][br][b][size=150]<直積から成分への分解>[br][/size][/b]G1,G2が群ならG1,G2は直積G1×G2の部分群とみなせる。[br]これは、たとえば、G1×G2のうち、g1∈G1に対してG2成分だけeにした(g1,e)への対応は単射だから、[br]G1はG1×G2の部分群とみなせる。G2も同様だね。[br]しかも、G1、G2はG1×G2の正規部分群だ。(この説明は省略。)[br][br][b][size=150]<直積が巡回群になる条件>[br][/size][color=#0000ff]「直積Zm×Znが巡回群になるのはmとnが互いに素であるときにかぎる[/color]。(中国剰余定理)」[/b][br]互いに素であるときは、単位元0=(0,0), 生成元1=(1,1)として、Zm成分が0,..m-1を繰り返し、[br]Zn成分が0,...n-1を繰り返すので、最大元mnー1=(m-1,n-1)の次が0=(0,0)に戻るから位数mnの巡回群[br]になる。[br]もしmとnに公約数dがあるなら、p=m/d, q=n/dとなる整数がある。[br]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より小さくなる。[br]位数mnの元を含まないから、巡回群ではない。[br][color=#0000ff](例)[/color][br][b]Z2×Z2は巡回群ではなくクライン群[/b]になる。[br]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の元を含まないから巡回群ではない。[br][color=#0000ff](例)[br][/color][b]Z3×Z5は巡回群Z15になる。[br][/b][br][b][size=150]<2つの部分群H,Kの直積と等しくなる群G>[br][/size][/b]「H、KがGの正規部分群でHK=G、H∩K={e}なら、H×KとGは同型になる。」[br]h∈H、k∈Gに対してf(h,k)=hkとすると、fは単射でHK=Gだから、H×KからGへの単射となるから。
ラグランジュの定理というのがあったね。[br]群Gを部分群Hで剰余類に分けると、G=|H|+a|H|+b|H|+....と剰余類分解ができることから、[br][b][size=150][color=#0000ff]部分群Hの位数は群Gの約数であるというのがラグランジュの定理[/color][/size][/b]だったね。[br]さらに、元の位数はその元を生成元とする部分群の位数に等しいので、[br]群Gのどの元の位数も、Gの位数の約数だということが言えたね。[br]この逆のような内容がある。それがコーシーの定理だ。[br][br][b][size=150]<コーシーの定理>[/size][/b][br][b][color=#0000ff][size=200][size=150]pが有限群Gの位数の素因数ならGに位数pの元がある。[br][/size][/size][/color][/b][color=#0000ff](例)[br][/color][b]位数が2の倍数の群Gには位数2の元がある[/b]ことになるね。[br]位数2の群ではZ2={0,1}の1は位数が2だ。[br]位数4の群では巡回群Z4={0,1,2,3}の2は位数が2だ。クライン群Z2×Z2{(0,0),(1,0),(0,1),(1,1)}の単位元以外はみな位数が2だったね。[br]位数2nの巡回群Z2n={0,1,...n,...n-1}のnの位数は2だ。[br]位数2nの2面体群Dn={0,r^1,...r^(n-1),t, tr, tr^2,...,tr^(n-1)}のtの位数は2だ。[br]位数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だ。[br]位数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だ。[br]位数4!=24の対称群S4は互換の位数は2だ。[br]位数n!の対称群Snの互換の位数は2だ。[br][br][b][size=150]<シロ―の定理>[br][/size][/b](p群とは)[br]素数pのべきの位数をもつ|G|=qr (q=p[sup]m[/sup]、rはpの倍数でない)の群を[b]p群[/b]という。[br]素数pのべきの位数をもつ|G|=p[sup]2[/sup]なら、Gは可換群。[br][color=#0000ff](例)[/color][b]位数が4の群[br][/b]4=2[sup]2[/sup],|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だった。[br](シロ―p部分群の性質)[br]位数がq=p[sup]m[/sup]の部分群をGの[b]シロ―p部分群[/b]という。S(p)などとかいたりする。[br]1・S(p)を筆頭に、[b]qの約数位数[/b]の部分群がある。[br]2・S(p)は[b]互いに共役[/b]だから、共役作用の軌道になる。[br]3・S(p)の[b]個数は1(mod p)で、r=|G|/qの約数[/b]だ。[br] もし、S(p)が1個だけなら、自分自身と共役だから、この1個は[b]Gの正規部分群[/b]となる。[br][br][b][size=150]<有限アーベル群の構造定理>[br][/size][/b]可換群なら位数が素数のべきの巡回群の直積群と同型になる。[br]この巡回群の種類と個数は、同型の取り方と関係なく一定で、有限アーベル群の不変量と言えるね。[br][color=#0000ff](例)[/color][b]pが素数のときのp[sup]4[/sup]の可換群[/b][br]4=3+1=2+2=2+1+1=1+1+1+1の位数の和分解5個から、[br]p[sup]4[/sup]の指数4の和分解した指数乗の巡回群の直積に分解できる。[br]Cp[sup]4[/sup], Cp[sup]3[/sup]×Cp, Cp[sup]2[/sup]×Cp[sup]2[/sup],Cp[sup]2[/sup]×Cp×Cp,Cp×Cp×Cp×Cp[br][color=#0000ff](例)[/color][b]位数72のアーベル群[/b]72=2[sup]3[/sup]*2[sup]2[/sup]だから、構造定理から次の6個が代表元となるね。[br]C8×C9, C8×C3×C3,C4×C2×C9, C4×C2×C3×C3, C2×C2×C2×C9,C2×C2×C2×C3×C3[br][br][b]<分類問題の例>[br]・位数が2p(pが奇素数)の群はC2pかDpと同型[br][/b][color=#0000ff](例)[/color]位数6の群Z6かD3と同型だ。[br][color=#0000ff](例)[/color]位数10の群Z10かD5と同型だ。[br][color=#0000ff](例)[/color]位数14の群Z14かD7と同型だ。[br][b]・位数が8の群[br][/b]アーベル群ではC8,C4×C2,C2×C2×C2[br]非アーベル群ではD4,Q8[br][b]・位数が9の群[br][/b]アーベル群だけで、C9,C3×C3[br][br][color=#9900ff][b][u][size=150]質問:さらに多くの分類問題を解くためには、どうしたらよいでしょうか。[br][/size][/u][/b][/color][br]半直積、フロベニウス群などを学ぼう。[br]また、インストールの手間を惜しまなければ、[b]GAP[/b]や[b]Sage[/b]などの群論が使える言語も調べてみよう。[br]実験しながら、思考を深めたり検証することができるでしょう。[br]視覚化の必要がなければ、[b][color=#0000ff]インストールなしでwebでsage,gapが使える[/color][/b][b][color=#0000ff][url=https://sagecell.sagemath.org/]Sage Cell Server[/url]もあります[/color][/b]。[br]languageを変えて、コードを入れ、evaluateで実行できるplaygroundになっていますよ。[br]tutorialをコピペしたりしながら、いろいろ試して、学びを深めよう。
有限な位数の群はケーリーの定理によると、対称群の部分群として表すことができた。[br]だから、対称群は置換だから、辞書というデータ構造で群の2項演算を辞書の合成としてコード化することができたね。[br]可換群については、アーベルの構造定理が役立ったね。非可換群は、結構調べにくい。[br]そこで、群の置換表現だけでなく、一般線形群GLで表すことで、表現の道具を増やしてみよう。[br]たとえば、対称群S3の置換表現を辞書データで表してみよう。[br]辞書{1:x, 2:y, 3:z}を簡単のために、xyzとかくことする。すると、互換、巡回置換は数値列で表現できる。[br]S3={e=(1)=123, r=(123)=231, s=(132)=312, a=(12)=213, b=(23)=132, c=(13)=321}[br]行列で表してみよう。[br][b][color=#0000ff]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]],[br]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]][br][/color][/b][br][color=#9900ff][u][b][size=150]質問:群S3を行列で表して、2項演算をコードで作るにはどうしたらよいでしょうか。[br][/size][/b][/u][/color][br]geogebraで作れます。[br]e=Identity(3)は3次の単位行列です。[br]何度も同じ行ベクトルをかくのが手間なので、[b][color=#0000ff][br]p1={1,0,0},p2={0,1,0},p3={0,0,1}[/color][/b]とすることで、[br][b][color=#0000ff]Ags={e, r={p3,p1,p2},s={p2,p3,p1},a={p2,p1,p3},b={p1,p3,p2},c={p3,p2,p1}}[br][/color][/b]と簡単に指定できるし、p1,p2,p3の3要素の順列と考えると3!=6要素ができることにも合致するね。[br]行列の積は行列を並べてかくだけです。[br]行列の積がq=(1,2,3)のインデックスがどう入れ替わったかを知るためにapplymatrix(積行列、q)[br]をしましょう。[br]積(1,2,3)=(x,y,z)になることが、辞書{1:x, 2:y, 3:z}を表すので、置換表現と行列表現を行き来することができるね。3次元ベクトル空間Xから基底を選んだ数体K上のベクトル空間KXから、[br]G=S3の表現f:G→GL(KX);g→Agが定まる。fは準同型写像。[br]Pgの集まりをPとしている。[br][b][size=150]<基底の変換>[br]群Gの作用する線形変換fでの基底での表現がAからBに変わったとする。[br]つまり、[br][/size][/b]基底ベクトルをe1=[math]\left(\begin{matrix}1\\0\\0\end{matrix}\right)[/math],e2=[math]\left(\begin{matrix}0\\1\\0\\\end{matrix}\right)[/math],e3=[math]\left(\begin{matrix}0\\0\\1\\\end{matrix}\right)[/math]としてfの表現行列をAとする。[br]基底を変えても群を表現することはできる。[br]新基底x1=e1+e2+e3=[math]\left(\begin{matrix}1\\1\\1\end{matrix}\right)[/math], x2=e1=[math]\left(\begin{matrix}1\\0\\0\\\end{matrix}\right)[/math], x3=e1+e2=[math]\left(\begin{matrix}1\\1\\0\end{matrix}\right)[/math]のときのfの表現行列をBとする。[br][br]基底x=(e1,e2,e3)から新基底X=(x1,x2,x3)に変換する基底変換行列がPなら、[br]X=Pxだから、(x1,x2,x3)=(e1,e2,e3)P[br]([math]\left(\begin{matrix}1\\1\\1\end{matrix}\right)[/math], [math]\left(\begin{matrix}1\\0\\0\\\end{matrix}\right)[/math], [math]\left(\begin{matrix}1\\1\\0\end{matrix}\right)[/math])=([math]\left(\begin{matrix}1\\0\\0\end{matrix}\right)[/math],[math]\left(\begin{matrix}0\\1\\0\\\end{matrix}\right)[/math],[math]\left(\begin{matrix}0\\0\\1\\\end{matrix}\right)[/math]) P[br][math]\left(\begin{matrix}1,1,1\\1,0,1\\1,0,0\end{matrix}\right)=\left(\begin{matrix}1,0,0\\0,1,0\\0,0,1\end{matrix}\right)P[/math] =P[br]P=[math]\left(\begin{matrix}1,1,1\\1,0,1\\1,0,0\end{matrix}\right)[/math] [br]可換図式は次のようになるね。[br][br] A[br]x⇒⇒⇒f(x)[br]↓ ↑[br]↓P ↑P[sup]-1[/sup][br]↓ ↑[br]X⇒⇒⇒f(X)[br] B[br][color=#9900ff][b][u][size=150]質問:可換図式をコードでかくにはどうしたらよいでしょうか。[br][/size][/u][/b][/color][br][IN]Python[br]import japanize_matplotlib[br]import numpy as np [br]from matplotlib import pyplot as plt[br]import networkx as nx[br][br][br]def kakanzushiki(f,n,funcs,E):[br] # グラフの作成[br] G = nx.DiGraph()[br] G.add_nodes_from(f, bipartite=0)[br] G.add_nodes_from(n, bipartite=1)[br] G.add_edges_from(E)[br] [br] # グラフを描画[br] pos = nx.bipartite_layout(G, f)[br] colorList = ['white']*(len(f) + len(n))[br] labels = nx.get_edge_attributes(G, 'label')[br] nx.draw_networkx_edge_labels(G, pos, edge_labels=labels,[br] font_family='IPAexGothic',font_size=20,rotate = False,verticalalignment='baseline')[br] nx.draw_networkx(G,pos,node_color=colorList,edge_color ='green',font_size=20,[br] verticalalignment='baseline',arrowsize=30)[br] plt.show()[br] [br]# グラフの設定と実行==========================================================================[br]f = ["x","X"][br]n = ["f(x)","f(X)"][br]funcs=["A", "P", "B", "1/P"][br]f.reverse()[br]n.reverse()[br]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]})][br]kakanzushiki(f,n,funcs,E)[br][img]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAk8AAAGpCAIAAAAbUEU7AAAAAXNSR0IArs4c6QAAIABJREFUeAHt3Qd8E/X/x/HLaNKmLR2sUijQIkMZpWwZBUSGiKAggsgfZVsRRERBESlTZFMQ0J9sQZAhCgJWkC2yyx6ySwe2tHSvjL8SrbVt0nxLC9f2dY8+NMl97pu75+ceeXPJ5SKZmBBAAAEEECjuAlJx30C2DwEEEEAAARNpx06AAAIIIFD8BUi74t9jthABBBBAgLRjH0AAAQQQKP4CpF3x7zFbiAACCCBA2rEPIIAAAggUfwHSrvj3mC1EAAEEECDt2AcQQAABBIq/AGlX/HvMFiKAAAIIkHbsAwgggAACxV+g0NPOYDAkJyenMyGAAAIIIPAQAsnJyRkZGfmO5cJNO4PBEB4evmbNmk2bNm1mQgABBBBAIL8C33zzzZUrV/IdeIWbdqmpqcHBwXZ2dvXq1fNjQgABBBBAIF8Cvr6+Tk5OixcvTkxMzN/hXeGmXUZGxv79+z09PcPCwuLj4xOYEEAAAQQQEBeIiIjw9/dftmxZWlqaTNPuwIEDFStWjIuLMxqN+VtFlkIAAQQQKOECiYmJbdu2Je1K+G7A5iOAAALFXIC0K+YNZvMQQAABBEwmE2nHboAAAgggUPwFSLvi32O2EAEEEECAtGMfQAABBBAo/gKkXfHvMVuIAAIIIEDasQ8ggAACCBR/AdKu+PeYLUQAAQQQIO3YBxBAAAEEir8AaVf8e8wWFnuBuLi4U6dO7dix4+TJkwaDodhvLxv4iAVSUlIuX7588ODB4ODg7du3//jjj8eOHbt//755NYxGY1xc3E8//bRjx46oqKiH3APT0tKOHj26ffv2CxcupKamFuCWknYFiMlQCDwegf3797/wwgtqtbpr165RUVGPZyV41mIqkJaWtmvXroEDB9aqVcvZ2VmpVEqS1KVLl2PHjpm3ODk5+fvvv9fpdJ6engcPHsz3VSjNo0VHR/fv31+lUvXp0+fatWsPmZ1Ze0LaZdXgNgJFT8BgMCxYsKBKlSqSJPn6+m7ZsqXobQNrLFcBg8Fw+vTp6tWrq9XqUqVKeXh4VKpUycvL64033jh9+rTJZDIYDDdv3mzVqpVKpRoxYkRERMRDbkpaWtqvv/7q6urq4OCwadOmhISEhxwwc3HSLpOCGwgUSYG7d+8OGTJE9WAqU6bM8OHDuX56kWykLFc6JSVl8ODBOp1Oq9UOHz58x44dp0+fvnDhwu3bt1NSUkwmU3x8/Nq1axUKhaOj44kTJ9LT0x9+O1JSUrp3725vb//iiy+eO3euoPZn0u7hW8MICDxOga1bt7Zq1crHx6devXoKhaJp06aRkZGPc4V47mIkkJiYWKtWLbVa/eyzz54+fdr4z5S5iVeuXHnmmWfUanWvXr3u3buX+fjD3NDr9Tt37ixTpoxGo9mwYYM5Vh9mQPOypN3DGzICAo9TYPz48WXLln3++effe+89T09Pb2/vlStXPs4V4rmLkUB8fLyLi4tCoejfv//Vq1ezbVlSUtKWLVu0Wq29vf369esLKpZMJlNycnLdunXVavWgQYMuXryY7Xnzd5e0s+iWkpKyZcsWPz+/2rVrv/vuuzk7nZqa+uuvvzZt2rROnTrPP//87du3C/ADVYurxQwEsghcu3atR48ednZ2b7/99rZt2zp06ODs7NyrV68sJdxEIP8C8fHx9vb2kiQNHTr0+vXr2Qa6fv3622+/rVQqvby87t69W7AvgCNHjnR3d/fx8dm5c2e2583fXdLOopvBYLhz506XLl3s7e3LlCmzaNGirGe7GY3GCxcuvPzyy2q12sHBYenSpfHx8RbHYgYChSPw9ddf+/r6VqlSJSgo6MaNGx999JFSqXzyySevXLlSOE/IqCVCICoqatmyZf7+/i1atDCfhFmhQoUmTZr4P5gGDBgQHBxsMpkOHz5cu3ZtnU7Xp0+fbKdi6vX6jRs3vvTSS23btn3vvff++OOPnHA7d+4cMGCAv7//u+++e+rUqWwFP/74Y9WqVe3s7GbPnh0dHZ1tbj7uknbW0AwGw4EDB5588km1Wt2oUaMff/wxs6OhoaFTp051dXXV6XQDBgyIjIws2H/XWFst5iHwQCA9Pf2tt95ydXXt0KHDrl27UlNT169f7+LiUrZs2aCgIJAQyLfAnTt3JkyYIFmY6tev//XXX6empm7cuNHe3t7NzW3evHkZGRlZn85oNB4/frxv375qtdrb23vGjBnZXiGvXbv2+uuvu7i4eHl5BQYGZj2WMI8TERFRp04dhUKRef5n1vHzcZu0ywMtLS1t7ty5FStW1Gq1ffv2PXHihPk0pHXr1j311FNarbZp06YhISHZGpnHoMxGoCAEzpw506ZNGzs7u1GjRoWFhZlMpiNHjrRu3dre3v7ZZ5/N9upTEE/IGCVFID4+fs+ePYGBgR9++KFKpZIkqVGjRu+8807gg2nJkiVnzpyJiIj49NNPJUny8PDYu3dvztfA5OTkzZs3N2/eXKPRNG7c2Hw4aBZMTk6eNGlSlSpVHBwc+vfvf+bMmZyyGRkZHTt2tLe3b9q06Y4dO3IWiD5C2uUtFhYW1r9/f3d39/Lly0+cOPHmzZv79+/v2rWrWq328fFZvnx5QZ0gm/eqUIFAFoGgoKBq1ap5eXn973//M2dbaGjoJ598olAoypcvf/r0aQIvixY3BQQMBkNSUtIff/xx/fp1jUYjSdLrr79+/PjxPx5MMTExqampZ8+efeONNxQKRdWqVe/evZvry2BkZOTcuXM9PT2dnJy6d+/+5/5pLtu0aZOfn59arW7btu22bdssfW9h2LBhpUuXLleu3KpVqwTW3kIpaWcB5r8PHzhw4JlnnrG3t/fz85swYcLbb79dqlSpcuXKvfPOO5mXz/nvEtxDoHAFEhMTe/bs6eTk9Pzzz+/bt8/8ZCkpKdu2bTO/wT5p0qSkpKTCXQlGL+4C8fHxWq1WkqQ333wz21kqhw4dateunUqlqlOnTs4Du0yYCxcuBAQEaLVaNze3yZMnJycnX7x4sUuXLk5OTj4+PgsXLrTymdynn35aqVIltVo9b968zE+RMkcWvUHa2SRmMBiWLFlSu3ZtOzu7ihUrenl5/flVyhdeeMF8NQGbhqAIgQIVOHLkiPkU7fHjx5vfxjQPf+HChbZt26rV6gYNGkRGRub6L+4CXREGK8ICN2JvhMWHpenTLG2DlbTbvXt3gwYNNBpNixYtLC1uMpnS0tL279/v7++vUqm8vLy+++67d955p3Tp0k5OTqNGjbp8+bKVZRctWuTt7S1J0sSJE2NiYqxU2jKLtLNF6a+aqKioESNGlC5dWpIklUrl5+e3du1aWxemDoGCFpgwYYKHh0eFChXWrl2bnp5u+GeKiIiYNm2aeS/ds2dPAX4FqqC3gPEev0DgnsDJ+yb/eOXHG7E3UjL+ujZKtslK2m3fvr169eo6ne65557LtlS2u7GxsWvWrPH09FSpVI0aNXJ2dlapVB06dDh06JCVg0KTybR69eoaNWpIkvTBBx9k/SddtvFtvEva2Qj11+Xgli5dWrduXUmStFptr169cp5EZOtY1CHwcAIJCQn+/v5arbZ+/frz58/fk2X66aefZs+ebT6Z7t133831zO+He3KWLj4CleZUkgKlJ4KeeO+n94KvBd+Ou50t86yk3datW728vMwfyOUpEh4ePnr0aPMJL5IkeXl5bdiwIc9rYG7YsKFWrVqSJI0aNer27dt5Pov1AtLOus+/c8PCwl5//XUnJyfFg6lZs2a7du2y/g+TfxfmFgIFKrBr165KlSpZOD/834dr1Khx6dIl9tICtS9Wg5nTTjlRqQhUVJlXZcSOEXtu7LmbeDdV//dP7VhJu+3bt1erVs2WYzuTyZSenn7kyBGdTmfeOwcNGpTzeh05ZTm2y2lS6I+kp6dPnjy5SpUqf35e6urq6uLi4uDg0K1bt7t37xb6c/MECPxXwGg0Dhs2rFSpUhqNxsXFpXRuk6urq/llxZZ/Qf93eO6VIAFz2kmBkhQomTOvwqwKg38YfPD2wYS0hAxDhpW0s/FzO5PJZDQaw8LCxowZ8+cncAqFQpIkPz+/Q4cO6fV669aZn9tNmDDh4S/CybGdde2/5/7888/169eXJOnpp5+eMWNGQECAJEnly5cfM2aMTctThEABCRiNxpSUFG9vb6VS+eKLL4aEhPxznd5//5+enn7+/Hnzu0b9+/e/ceNGAT05wxQ3gaxpZ848RaBCOVHp/pn7q5tePXLniJW0O3jwYJs2bVQqVd26da27JCQkmL+HrlAoSpUqZb44y9ChQy9dumR9wc8+++zP755LkjR37lxL31KwPkLWuaRdVo3cb9+9e7d9+/b29vblypVbsGBBXFxccHBwmzZtlEpl9erVt23blvtiPIpAIQikpaVt3LjRxcVFkqSgoCBLHx7Hxsa2a9fOzs7O09PzyJEjnJlZCK0oDkPmTLvM4zyHKQ7lZ5Z/btlzSru/fr415zcQzpw5069fP0mSKleuHB0dbWkfMxgMhw4d8vPzUyqV7u7ue/fubdeunU6nc3Z2DgoKsn7ENnz48DIPpgK50Dlpl8cuazQaR44cWaZMGZVKNWrUqKtXrxqNxvj4+OXLl3t4eGi12ubNm4eHh1vqdB6jMxsBQYH4+PiePXtqtVoPD4+DBw9aei8oJSVl8eLFTk5OKpXq888/t/KVJsHnp7xYCVhKu8zMc5rgJKn/elO8+/91v/j7f36LIDw8fOrUqeZrqezZs8fSx8Pnz58fMmSIRqNxdXWdPn16UlLS4cOH69Spo1Kp6tWrt3nzZkv78J/X4ezYsaNWq23UqNH27dsf3p20s2ao1+s3bNjg4+OjUqk6deq0d+9e89G00Wi8cePGuHHjzL/nGxAQkJycbG0g5iFQEAJ6vf7y5cvu7u4KhaJ3795WPuc3X9O8UqVKSqWyR48euV6ZqSDWiDGKtoD1tJMCJcVHCnPaubd07/llz00XNkUlRZm32XydTLVanet1Ms01f/zxx9y5c8uWLevk5PTSSy+ZL7mSmpoaFBRUtWpVrVbbu3fv3377LVfEyMhIX19fhULRr1+/kJCQXGuEHiTtLHLp9forV640a9ZMo9FUrVp17dq1cXFxmdXmU4y6dOmiVCo9PDzWrFmT9boVafq08Pjwi1EX+UOgAAWO3zg+edFkRRmFVEaavHjykWtHrAx+PvJ8+1fbO1RyKF+7/JKNS85FnrNSzKySKeAxy8N8GGfxvx9K0l+XyZSkhpLLGJd6i+u9uvHVL49/eT3mutFo/PXXX+vWravT6Xr37p3zc7W0tLRNmzY1bNjQzs6uQYMGBw4cyHz9DA8PHzRoUOnSpcuUKTNu3Lg/L0KdOSvzxo4dO8yfT8+aNcv6G56Zi1i/Qdrl7vPnaW9RUVEBAQH29vZ/XjgnMDAwNDQ0W2l8fPx3331n7keTJk2OHz+eeW2biISIoCNBXdZ24Q+BAhTosKJD9U+qS30kqY/UdH7T51Y/Z31w74+87frZKV9TNpjVoPPXna0XM7cECthPsbeYcw9O1JSypJ1ipEIKlBynOj71+VMLjyw0mUw3btwYOXKkSqXy9vYOCwvL9mbmb7/91rt3b61W6+3tHRQUlJr697cazC+khw4d6tChg1arrVu37ldffZVtrslkGj16tLu7e7Vq1bZu3Wrl3c5sL8tW7pJ2ueOYP5xbtmzZzJkz586de/Xq1VwvsBsTE7N69eqZM2fOnj37+vXrmTXRydHfnvv2vZ/e4w8BBBCQrYDzNGehtFMEKsrOKNt+Vft1Z9eZTKakpKTvv//e2dnZwcHh22+/zXrhntu3b3/00Ufly5cvU6bM0KFDcx69paamLl261NfXV6vVdu7c+Zdffsl8LTYajXFxcY0bN9ZoNP379z9//nzmrIe5Qdo9jJ7FZTMMGfdT70cmRPKHAAIIyFagwuwKeaTdeElqJSlbKqVeUqWplbqs7TJx78Sfr/2c+endlStX2rdvr1are/XqlfX9xtDQ0FWrVo0ZM2bmzJmHDh3K9bUyPDx8xYoVY8aMmTFjxsGDBzNr9Hr9Tz/9VLZsWVdX19WrV2f9CCmzJh83SLt8oLEIAgggUBwE8j5LZeJf7156zfHqtLrTpL2TDoceTkhLyLrl9+/f//M9MEdHx/Llyx8+fDjnG5JZi225bTQaExIS+vbtq9PpOnfufPbsWVuWsqWGtLNFiRoEEECgGApYSTtFoEI1SeU1x6v18taf/PLJifATyRm5nHluNBpv375t/v7xe++9FxER8ZBMaWlpR44cKV26tKur68qVK2NjYx9ywMzFSbtMCm4ggAACJUsg17RTBCo0kzUVZ1dsvrT5+F/GX4y6mGHIsOKSlJS0cePGJ554omXLlhcuXMh2roqVBXOdFRcXN23aNB8fn5dffvnmzZu51uTvQdIuf24shQACCBR5gZxpp52sLTezXJMvmwTuCfz93u82bmFqaupXX321cOHCy5cvZ56abuOy2coSExPXrFmzcOHC06dPP/z7olkHJ+2yanAbAQQQKEECWdNOM1lT6tNSDb5o8OmBT2/EFsNrq5J2JWjPZlMRQACBrALmtFNNUqkmqnwX+847PC80LvsXi7PWF+nbpF2Rbh8rjwACCORfwGuulyJQ0eTLJkuOLbkecz01I9VgNOR/OHkvSdrJuz+sHQIIIFBoAitDVm48v/FS9KX41Hi9MY9fmyu0tXhEA5N2jwiap0EAAQTkJhCbEpuQllDsc87MTtrJbfdjfRBAAAEECl6AtCt4U0ZEAAEEEJCbAGkn0JGT4Sc3Xdh07u45gWUoRQABBEqqQFh82MFbBy9FXZIDAGkn0IWlJ5f+3+b/W39uvcAylCKAAAIlUiBdn77x/MZu33SbvG+y9auxPBoe0k7AecGRBV3WdllxaoXAMpQigAACJVLg6r2rb/34ljJQ2WJpCzm8JUbaCeyGpJ0AFqUIIFCCBTIMGatPr663uJ4UKFWaU2nS3kl6w2P+hgNpJ7A/knYCWJQigEAJFrh1/9bQrUNVE1VSoKSepG7yZZPrMdcfrwdpJ+BP2glgUYoAAiVVQG/UrwxZ6bfETxH418/jSYGSxyyPaQemPd4LtZB2AvsjaSeARSkCCJRUgbuJd9/47g3zgZ057VQTVU8tfCoqMcpoMj4uFdJOQJ60E8CiFAEESqrAipAV9ZfUzzywMwee23S3OYfnPMaTM0k7gf2RtBPAohQBBEqkwP2U+7029LKbZGcOucz/qiaqfOb5xCTHGI2P5/COtBPYH0k7ASxKEUCgRAqYT8VUTPz7E7vMtJMCJd1U3cIjCxPTEh8LDGknwE7aCWBRigACJU8gLjXu5fUv66bqsoZc5m3lROWTC5+8GXvzsZyuQtoJ7I+knQAWpQggUPIE1p1d99TCp3I9sDNnnt0ku8XHFsemxD56G9JOwJy0E8CiFAEESphAfFp893Xdnac5Zx7M5Xqjyf+anP/j/KM/vCPtBPZH0k4Ai1IEEChhAlsubvGZ75PtVMycgaedrF18bPG95HuPmIe0EwAn7QSwKEUAgRIjYDQZk9KTXlr3Up4Hdubwa7ui7YnwE4/48I60E9gfSTsBLEoRQKDECOgN+uBrwR6zPPI8sDOnnf0U+8XHFkcnRz9KIdJOQJu0E8CiFAEESoaA0WS8n3LfyqmYOd/MVAQqnvv6ucOhhx/l4R1pJ7A/knYCWJQigEDJEEjVp+67uc9pmpONB3bm8HOY4rDgyIJHeXImaSewP5J2AliUIoBAyRCISorqu6lvzoun5Dyky/qIIlDR7Ztuv4b++siQSDsBatJOAItSBBAoGQKhcaGV5lRym+6W889pqpPdJDuHKQ45Z7lOd60eVH3duXWPDIm0E6Am7QSwKEUAgZIhkJSe9MOlH7449sWSY0uy/Q3dOrTOojovfvNitsfNd7+7+F1oXOgjQyLtBKhJOwEsShFAoMQI6A36dEN6zr8N5zc89/VzU/ZPyTkr3ZCeYch4lFeIJu0E9kfSTgCLUgQQKPECmy9u7rym87QD0+QgQdoJdIG0E8CiFAEESrwAaSewC2RkZBw4cKBixYpxcXGP8pg311Uk7XJl4UEEEEAgVwHSLleW3B8k7XJ34VEEEEBA9gKknUCLSDsBLEoRQAABOQmQdgLdIO0EsChFAAEE5CRA2gl0g7QTwKIUAQQQkJMAaSfQDdJOAItSBBBAQE4CpJ1AN0g7ASxKEUAAATkJkHYC3SDtBLAoRQABBOQkQNoJdIO0E8CiFAEEEJCTAGkn0A3STgCLUgQQQEBOAqSdQDdIOwEsShFAAAE5CZB2At0g7QSwKEUAAQTkJEDaCXSDtBPAohQBBBCQkwBpJ9AN0k4Ai1IEEEBATgKknUA3SDsBLEoRQAABOQmQdgLdIO0EsChFAAEE5CRA2gl0g7QTwKIUAQQQkJMAaSfQDdJOAItSBBBAQE4CpJ1AN0g7ASxKEUAAATkJkHYC3SDtBLAoRQABBOQkQNoJdIO0E8CiFAEEEJCTAGkn0A3STgCLUgQQQEBOAqSdQDdIOwEsShFAAAE5CZB2At0g7QSwKEUAAQTkJEDaCXSDtBPAohQBBBCQkwBpJ9AN0k4Ai1IEEEBATgKknUA3SDsBLEoRQAABOQmQdgLdIO0EsChFAAEE5CRA2gl0g7QTwKIUAQQQkJMAaSfQDdJOAItSBBBAQE4CpJ1AN0g7ASxKEUAAATkJkHYC3SDtBLAoRQABBOQkQNoJdIO0E8CiFAEEEJCTAGkn0A3STgCLUgQQQEBOAqSdQDdIOwEsShFAAAE5CZB2At0g7QSwKEUAAQTkJEDaCXSDtBPAohQBBBCQkwBpJ9AN0k4Ai1IEEEBATgKknUA3SDsBLEoRQAABOQmQdgLdIO0EsChFAAEE5CRA2gl0g7QTwKIUAQQQkJMAaSfQDdJOAItSBBBAQE4CpJ1AN0g7ASxKEUAAATkJkHYC3SDtBLAoRQABBOQkQNoJdIO0E8CiFAEEEJCTAGkn0A3STgCLUgQQQEBOAqSdQDdIOwEsShFAAAE5CZB2At0g7QSwKEUAAQTkJEDaCXSDtBPAohQBBBCQkwBpJ9AN0k4Ai1IEEEBATgKknUA3SDsBLEoRQAABOQmQdgLdIO0EsChFAAEE5CRA2gl0g7QTwKIUAQQQkJMAaSfQDdJOAItSBBBAQE4CpJ1AN0g7ASxKEUAAATkJkHYC3SDtBLAoRQABBOQkQNoJdIO0E8CiFAEEEJCTAGkn0A3STgCLUgQQQEBOAqSdQDdIOwEsShFAAAE5CZB2At0g7QSwKEUAAQTkJEDaCXSDtBPAohQBBBCQkwBpJ9AN0k4Ai1IEEEBATgKknUA3SDsBLEoRQAABOQmQdgLdIO0EsChFAAEE5CRA2gl0g7QTwKIUAQQQkJMAaSfQDdJOAItSBBBAQE4CpJ1AN0g7ASxKEUAAATkJkHYC3SDtBLAoRQABBOQkQNoJdIO0E8CiFAEEEJCTAGkn0A3STgCLUgQQQEBOAqSdQDdIOwEsShFAAAE5CZB2At0g7QSwKEUAAQTkJEDaCXSDtBPAohQBBBCQkwBpJ9AN0k4Ai1IEEEBATgKknUA3SDsBLEoRQAABOQmQdgLdIO0EsChFAAEE5CRA2gl0g7QTwKIUAQQQkJMAaSfQDdJOAItSBBBAQE4CpJ1AN0g7ASxKEUAAATkJkHYC3SDtBLAoRQABBOQkQNoJdIO0E8CiFAEEEJCTAGkn0A3STgCLUgQQQEBOAqSdQDdIOwEsShFAAAE5CZB2At0g7QSwKEUAAQTkJEDaCXSDtBPAohQBBBCQkwBpJ9AN0k4Ai1IEEEBATgKknUA3SDsBLEoRQAABOQmQdgLdIO0EsChFAAEE5CRA2gl0g7QTwKIUAQQQkJMAaSfQDdJOAItSBBBAQE4CpJ1AN0g7ASxKEUAAATkJkHYC3SDtBLAoRQABBOQkQNoJdIO0E8CiFAEEEJCTAGkn0A3STgCLUgQQQEBOAqSdQDdIOwEsShFAAAE5CZB2At0g7QSwKEUAAQTkJEDaCXSDtBPAohQBBBCQkwBpJ9AN0k4Ai1IEEEBATgKknUA3SDsBLEoRQAABOQmQdgLdIO0EsChFAAEE5CRA2gl0g7QTwKIUAQQQkJMAaSfQDdJOAItSBBBAQE4CpJ1AN0g7ASxKEUAAATkJkHYC3SDtBLAoRQABBOQkQNoJdIO0E8CiFAEEEJCTAGkn0A3STgCLUgQQQEBOAlnTzmAw3L17d/PmzTExMQaD4dGvZmJiYtu2bZctW5aWlpa/Z5fyt5iNSz3GtEtNTf35559fffXVl/+Z6g+pX2FUheYBzYcMGTJu3LgVK1acPXv2sbTNRj3KEEAAgQIUuHPnzvr160eMGDFkyJCNGzfmOXLWtEtMTFy9enWTJk0uXbqUkZGRuey6dev+eYn99/99+vQZPHjwhAkT1qxZ8/vvv+c7nzKfxWQykXZZNf5zOzEx8csvv9RqtZIk2dvbOzo6alpqVH1Vdo3tHB0dPTw86tat271797lz50ZHRxuNxv8szB0EEECguAhERETs2rVr1qxZ/fr1a9iwoaura6VKlSZPnpzn9mVNuz/++OOll16qX7/+zZs3sx4kfPLJJ5IkKZVKrVbr+M9kfsn19PT08/N75ZVXli9ffufOnTyfznoBaWfRJ2vaDRw48LPPPus+vftTU57qMbnH2LFje/fuXatWLTs7u2rVqgUGBiYkJBB4FimZgQACRVMgLS0tKCgoICCgffv2lStX1mq1KpVKqVRWrFhRKO3S09NPnDjh6ek5duzYuLi4rBjmtKtQoUKfPn3mPJhmz549ffr0MWPG9OzZs3Llyg4ODn5+fgsXLrx7927WBUVvk3YWxbKm3datW5OTkxccWdBlbZdlJ5fFxcWFhITMnz+/efPmSqXSw8MjODg4JSXF4li28uzDAAAgAElEQVTMQAABBIqgQFJSUvPmzZ2dnatUqdKqVat+/fq1bt3a1dVVNO3u3bsXFBTk6up66NChbG9LmtOubt26q1atyioUFxd3/Pjx6dOn16tXz87OrmXLllu2bMlaIHqbtLMoZintVpxaYV4mNjZ25cqVrq6uKpVq0KBB0dHRFsdiBgIIIFAEBdLS0qZMmTJs2LDPPvts27Ztt27d+uyzz6pUqSKadr///vsLL7zQrFmzxMTEbG+DWUo7s1Z8fPwnn3zi5eXl5OQ0evTopKSkfCuSdhbp8kw7k8l09erVFi1aKBSKJ5988uHfVra4KsxAAAEEHoeA0WiMi4vL+jHbnDlzRNMucFfg7t27K1euPG3atKznp5g3yHramUymffv2tWvXTpKkV1555dq1a/lmIO0s0tmSdmFhYYMHD5YkydnZ+datWxbHYgYCCCBQLATykXbD1w+fPHlylSpVTp8+nTU4zR55pt3Nmzd79eolSVLnzp2PHj2ab0XSziKdLWkXHh4eEBBgPmnz5s2bFsdiBgIIIFAsBPKRdj3n9+z4YMr2HqbZI8+0Cw0NffXVVyVJ6tSp0+HDh/OtSNpZpLMl7W7evNmtWzeFQlGxYsXQ0FCLYzEDAQQQKBYComnXaVWnVh+18vb2DgoKyhUgz7QLCQl54YUXJEl68cUXz507l+sgtjxI2llUyjPt9Hr98ePHy5Qpo1Qqn3vuuYc8O9biejADAQQQkI2AaNr5f+Ffc1DN2rVrX79+PdeNyDPtli1bVrduXUmSBg0aFB8fn+sgtjxI2llUsp52RqPx0qVLr732mlKptLOzW7x4cUJCgsWxmIEAAggUCwHRtGs0p1HVvlX79u2r1+tzBbCediEhIZ07d9ZoNN7e3vPnz8/1vdBch835IGmX0+TvR3JNu+fXPD9/7/yTJ08GBQW1a9fO2dlZo9G0bt06IiIi56evFodmBgIIIFA0BYTSbsO5DbUm1ao1qNby5cstbW7OtNPr9bGxsceOHZs5c+bTTz/t6Oio1WoHDx58+fJlS4PY8jhpZ1Epa9rVrl27RYsW1V6t5j7M3ae7j6+vr/kb/k5OTt27dz969Kilf7ZYHJ0ZCCCAQBEUEEq71cdWV3y/YqsPW1k5Zd2cdo6OjjVr1mz1YGrZsmWzZs3q1atXqVIlrVbr7u4+ZMiQI0eOZPtauigeaWdRLGvaOTg4ODs7a1tp1f3UpfxLeXt7N2/efMCAAV9++WVISEjOb5BYHJQZCCCAQFEWEEq7L/Z/UXp46ZfnvWzlRdKcdkql0t7e3vnBVKpUqbJly3p7e7ds2fLNN99csWLFhQsXkpOTH5KNtLMImDXtRo0atXTp0n4L+/nN8Av4ImDz5s27du06e/bs/fv3LS7PDAQQQKDYCdiedjExMYHrA8uMKBOwNsAKgzntKlWqNHTo0NX/TN98883mzZt/+eWXixcvFtRViEk7i13ImnZZr5OZeeUwi0syAwEEECimAran3dGjR3sH9q70QaWPf/rYCkbOz+2sFD/MLNLOoh5pZ5GGGQggUFIFbEw7o9G4fPnyuq/UfXLyk9P2T7OiRdr9jfMYf82VtLOygzILAQRKpoCNaRcdHT169Ojybco3DWo67QBpZ8POQtrZgEQJAggg8IgEbEy7vXv3duvWrWqnqs8uf5a0s6k3pJ1NTBQhgAACj0TAlrTT6/Vz585t3bp1mzfbdF7TmbSzqTOknU1MFCGAAAKPRMCWtIuKiurfv3/Xrl3f/eJd0s7WtpB2tkpRhwACCBS+gC1pt3379tatW3/wwQfLDi8j7WztCWlnqxR1CCCAQOEL2JJ2H3/8sb+//8qVKzdf3Eza2dqTx5h2RqMxNTX13r170dHRaWlpRqNxwZEFXdZ24ft2tjaPOgQQKHYCKSkpMQ8mSxc3iYiI6Nq1a58+fY4fP25L2iUlJUVHR8fGxqamphaqFt+3E+Al7QSwKEUAgRIpsGHDhsaNG8+YMSM+Pt6WtHtkSKSdADVpJ4BFKQIIlEiBYcOGPfPMM99//73RaCTtBHaBx/hOZs61JO1ymvAIAgggkCmQnJw8fPjwjz/++MKFCyaTibTLlMn7BmmXtxEVCCCAgDwE0tPTjx49euHChcTERNJOrCeknZgX1QgggIBsBDi2E2gFaSeARSkCCCAgJwHSTqAbpJ0AFqUIIICAnARIO4FukHYCWJQigAACchIg7QS6QdoJYFGKAAIIyEmAtBPoBmkngEUpAgggICcB0k6gG6SdABalCCCAgJwESDuBbpB2AliUIoAAAnISIO0EukHaCWBRigACCMhJgLQT6AZpJ4BFKQIIICAnAdJOoBuknQAWpQgggICcBEg7gW6QdgJYlCKAAAJyEiDtBLpB2glgUYoAAgjISYC0E+gGaSeARSkCCCAgJwHSTqAbpJ0AFqUIIICAnARIO4FukHYCWJQigAACchIg7QS6QdoJYFGKAAIIyEmAtBPoBmkngEUpAgggICcB0k6gG6SdABalCCCAgJwESDuBbpB2AliUIoAAAnISIO0EukHaCWBRigACCMhJgLQT6AZpJ4BFKQIIICAnAdJOoBuknQAWpQgggICcBEg7gW6QdgJYlCKAAAJyEiDtBLpB2glgUYoAAgjISYC0E+gGaSeARSkCCCAgJwHSTqAbpJ0AFqUIIICAnARIO4FukHYCWJQigAACchIg7QS6QdoJYFGKAAIIyEmAtBPoBmkngEUpAgggICcB0k6gG6SdABalCCCAgJwESDuBbpB2AliUIoAAAnISIO0EukHaCWBRigACCMhJgLQT6AZpJ4BFKQIIICAnAdJOoBuknQAWpQgggICcBEg7gW6QdgJYlCKAAAJyEiDtBLpB2glgUYoAAgjISYC0E+gGaSeARSkCCCAgJwHSTqAbpJ0AFqUIIICAnARIO4FukHYCWJQigAACchIg7QS6QdoJYFGKAAIIyEmAtBPoBmkngEUpAgggICcB0k6gG6SdABalCCCAgJwESDuBbpB2AliUIoAAAnISIO0EukHaCWBRigACCMhJgLQT6AZpJ4BFKQIIICAnAdJOoBuknQAWpQgggICcBEg7gW6QdgJYlCKAAAJyEiDtBLpB2glgUYoAAgjISYC0E+gGaSeARSkCCCAgJwHSTqAbpJ0AFqUIIICAnARIO4FukHYCWJQigAACchIg7QS6QdoJYFGKAAIIyEmAtBPoBmkngEUpAgggICcB0k6gG6SdABalCCCAgJwESDuBbpB2AliUIoAAAnISIO0EukHaCWBRigACCMhJgLQT6AZpJ4BFKQIIICAnAdJOoBuknQAWpQgggICcBEg7gW6QdgJYlCKAAAJyEiDtBLpB2glgUYoAAgjISYC0E+gGaSeARSkCCCAgJwHSTqAbpJ0AFqUIIICAnARIO4FukHYCWJQigAACchIg7QS6QdoJYFGKAAIIyEmAtBPoBmkngEUpAgggICcB0k6gG6SdABalCCCAgJwESDuBbpB2AliUIoAAAnISIO0EukHaCWBRigACCMhJgLQT6AZpJ4BFKQIIICAnAdJOoBuknQAWpQgggICcBEg7gW6QdgJYlCKAAAJyEiDtBLpB2glgUYoAAgjISYC0E+gGaSeARSkCCCAgJwHSTqAbpJ0AFqUIIICAnARIO4FukHYCWJQigAACchIg7QS6QdoJYFGKAAIIyEmAtBPoBmkngEUpAgggICcB0k6gG6SdABalCCCAgJwESDuBbpB2AliUIoAAAnISIO0EukHaCWBRigACCMhJgLQT6AZpJ4BFKQIIICAnAdJOoBuknQAWpQgggICcBEg7gW6QdgJYlCKAAAJyEiDtBLpB2glgUYoAAgjISYC0E+gGaSeARSkCCCAgJwHSTqAbpJ0AFqUIIICAnARIO4FukHYCWJQigAACchIg7QS6QdoJYFGKAAIIyEmAtBPoBmkngEUpAgggICcB0k6gG6SdABalCCCAgJwESDuBbpB2AliUIoAAAnISIO0EukHaCWBRigACCMhJgLQT6AZpJ4BFKQIIICAnAdJOoBuknQAWpQgggICcBEg7gW6QdgJYlCKAAAJyEiDtBLpB2glgUYoAAgjISYC0E+gGaSeARSkCCCAgJwHSTqAbpJ0AFqUIIICAnARIO4FukHYCWJQigAACchIg7QS6QdoJYFGKAAIIyEmAtBPoBmkngEUpAgggICcB0k6gG6SdABalCCCAgJwESDuBbpB2AliUIoAAAnISIO0EukHaCWBRigACCMhJgLQT6AZpJ4BFKQIIICAnAdJOoBuknQAWpQgggICcBEg7gW6QdgJYlCKAAAJyEiDtBLpB2glgUYoAAgjISYC0E+gGaSeARSkCCCAgJwHSTqAbpJ0AFqUIIICAnARIO4FukHYCWJQigAACchIg7QS6QdoJYFGKAAIIyEmAtBPoBmkngEUpAgggICcB0k6gG6SdABalCCCAgJwESDuBbpB2AliUIoAAAnISIO0EukHaCWBRigACCMhJgLQT6AZpJ4BFKQIIICAnAdJOoBuknQAWpQgggICcBEg7gW6QdgJYlCKAAAJyEiDtBLpB2glgUYoAAgjISYC0E+gGaSeARSkCCCAgJwHSTqAbpJ0AFqUIIICAnARIO4FukHYCWJQigAACchIg7QS6IcO0W35qucAGUIoAAgiUVAHSTqDzjz7tMgwZCWkJ91Pv5/ybcWhGx9UdFx1dlHPW/dT7CWkJBqNBYNsoRQABBIq1AGkn0N5Hn3bB14KfXPikwxSHnH92k+1UE1WayZqcsxymOFSeW/lM5BmBbaMUAQQQKNYCpJ1Aex992h24daDF0hZSoCT0pwhUNPqi0cWoiwLbRikCCCBQrAVIO4H2Pvq0i0yMnHlopiJQIZR2UqC08OjCmOQYgW2jFAEEECjWAqSdQHsffdplGDIO3j7Y8IuGqokqGwNPPVFdZ1Gdi1EX9Qa9wLZRigACCBRrAdJOoL2PPu1MJlNkYuSMQzOUgUob004zWTPn8Jz41HiBDaMUAQQQKO4CpJ1Ahx9L2qUb0o+GHa2zqI5yYt6BZzfJrvbnta/GXOXATqCvlCKAQAkQIO0EmvxY0s5kMkUnRU/dP9WWwzuXT12m7p+apk8T2CpKEUAAgRIgQNoJNPlxpV26If105Okngp6w/umdZrKm/pL612Ku8U07gaZSigACJUOAtBPo8+NKO5PJFJca98meTxymOFj69E4RqCg3o9z4X8YLbA+lCCCAQIkRIO0EWv0Y005v0F+Ovuwzz0c9SZ1r4NlNsmv8ZWO+YyfQTkoRQKAkCZB2At1+jGlnMpnSDenvB7/v+qlrzq/fKQIVFWZVGLtrrMDGUIoAAggUHQGj0ZiSknLz5s2zZ8+eOHHi2LFjR48evXHjRkpKinkjDAZDTEzMsWPHTp48mZqaajQas21cPtLO/KTmp4uNjTUYCuxyjImJiW3btl22bFlaWj5Ps5CybV7B3n1caZeamnr79u1r16/tOrmr6uyqOT+9U01UtVjaIiQ8JCoq6vqD6f79+3o937cr2P4zWu4CiYmJt27dMu94mf+9cePG7du3w8LCoqOjk5KScl+SRxGwTcBoNCYlJe3bt69v375PPPGETqdTKpWSJA0dOvTSpUvmMWJjY5ctW6bRaCpXrnzr1q3MZEpOTg4PD79+/fqXe77stKzTtAPTcn1Og8EQFRV148aNmzdvRkdHm8NSr9dfu3atQoUKGo1m1apV9+/fz3XZfDxI2uWCptfrT5486ePjo1Ao3NzcOkzv4D7NPevhnfnA7oPgD27duvX6669LkqRWq+fOnRsdHZ3LcDyEQEELrF271sPDQ5IkxT+TSqXS6XSenp6NGjV68803v/3224SEhMxXn4J+fsYr/gKpqan79u1zd3dXKBRarVan0zk6Ojo5OQ0fPvzy5csmk8loNB45cqRZs2alSpUaM2ZMRkZGJkpwcHCbNm2USqVzVeeGwxtO25972kVERAwcOFCj0ZQpU+b999/PPORKS0sbNWqUk5NTixYtjh8/nvOQMfOJhG6QdrlzxcXFLV++XHowtXmujcsYl2wf3bVZ0Wbf5X1r1qxRq9VKpbJNmzbh4eG5j8WjCBS0QGbaOTs7l34wubm5mf/1rVAolEqlVqtt0qTJuXPn0tPTC/rJGa9ECNy8efO1115TKBRqtfrDDz/cuXPn8ePHT506FRoampqaajKZoqKi5s2bp1Qqvb29b926lTWT9Hr99OnTK1asqFAqKjapOG7zuFzJZsyY4e3trVAoevTocf78+cwao9F448YNLy8vpVL5+eef37t3L3PWw9wg7XLXMxqN4eHh3bp1U6vVGq2mzoA6bhPczId3f39iFzz2wK8H6tevr1AoXFxcfv3118x/mOQ+Io8iUHACmWm3YsWKyH+msLCw8+fPr1279pVXXlGr1XZ2dr6+vhcvXuQIr+DgS9BIZ8+erVatmlqt7ty58+3bt1NTU9PT0zMyMvR6vTnYDhw44O/v7+bm9uabb+b8EOfatWuDBg1SqVQObg693+ydNQvNiAcOHGjTpo1Kpapfv/7KlSuzHhqaTCa9Xj9w4EAXF5e2bdsePny4QNxJO4uM6enpx48f9/T0VCqVHj4eDoMcpE/+/mGEjqs7rt6zeuTIkRqNxtnZedy4cQkJCTnbaXFoZiDwcAKZabdly5asI+n1+oSEhEuXLn3yyZ87q2RnZzdz5sw//vgjaw23EbBF4MSJEw4ODhqNZuTIkTk/PIuLi1u4cKFOp/Px8fnhhx9yDpiRkbFly5ZWrVoplApfP99t27ZlrYmPj3/jjTdcXFycnZ0/+uijXHfRTZs2Va5c2dHR8X//+19CQkLWxfN3m7Sz6GY0GpOTk6dOneri4mJnZ1fWv6xupE4KlMrPLD/qh1GLvlpUsWJFrVbbsmXL27dvE3UWHZlRCAKW0s78VBkZGZcuXSpbtqxSqezdu/fVq1cLYRUYspgLHD9+XKFQaDSajz76KC4uLtvWnjp1qm/fvnZ2dq1atbL0TmN0dHTg1EA7ZzsnJ6eXXnopa6QtXry4evXqSqWye/fuhw4dyvXth6ioqKZNm6rV6gEDBpw5UwA/HUraZWvif+4ajcbQ0NAOHTrodDoHNwf1C2ppjNT5685TVk3p1KmTUqmsWrXq+vXribr/qHGn8AWsp53JZLp//379+vXVanXbtm0vXLhQ+GvEMxQTgdDQ0CVLlvTo0eOZZ56RJEmpVNaqVatr1649Hkzjx483B8+GDRtq1qxZtmzZkSNHWnoBNBqNK3eurNCywl+f3lWsOH36dLPRmTNn/P397e3ta9asuXz5ckvHbUajMSAgoHTp0rVr1/7uu+8e3pe0y9tw8+bNNWrUUCqVqmoqp0FOff7XJ2BkgIuLS5kyZd56663Y2Ni8h6ACgQIVyDPtYmJiqlevrlKpnnvuuczzxQt0FRiseAqcP39+yJAh5hP0cv63devWu3fvTk5OnjVrloODQ/Xq1ZcvX24FYmPIRt8Rvq5VXTUajZ+f35EjR5KTk4cNG+bm5mZvbz927Njr169bWfyLL77w8fHR6XRz5sxJTEy0UmnLLNIub6X4+Ph33323fPnySq2yZseaHd7oUKdOHa1W27Zt2yNHjuS9PBUIFLSA9bRLTk7euXOno6OjQqH44IMPwsLCCvr5Ga/YCkRGRq5bt27EiBG9e/eWJEmlUjVu3DggIGDEgykoKOjKlSs3btwYPny4JEkNGza0fgpJSETIzB0z+7/X39nZWafTvfrqqytWrKhcubJKpWrfvv3+/fuznZySjXX//v3169eXJOntt99++DfkSbtsvLnfPXHiRKdOnRwcHCo/mNRqdY0aNRYsWJDzTKTcl+dRBApUINe0M38d+OrVqxs2bOjSpYskSdWrVw8ODuab5gVqX8wHy8jIiIuLi4iI2LlzpyRJ5rNUrly5EvFgunfvXlpa2oEDB7p27apQKNq2bZv107icNMnpyXfj7+77bZ+53snJyc/Pz87OztPTc9myZZY+8MscJyIiwt/fX6FQvPDCC/v37898PH83SDub3IxG45IlS2rVqmU+tHdzcxs8ePCdO3dsWpgiBApaIDPtRo8e/c0/06pVq4KCgt55552nn366bNmyTz/99Lx583invaDtS8p4x44dM6fdxx9/nO0slc2bNzdp0sTOzu7FF1/M9QSTbEbx8fGbNm2qWLGi+fVTrVYHBARYfw/TPILBYOjSpYtarW7cuPHmzZuzDSt6l7SzVezMmTPt27c3d6t+/fqrVq2ydUnqEChogcy0c3BwcH4wOTk5aTQa89VVSpUq9eyzz65cuTI5Obmgn5nxipWApRNMTCaTlbRbuXJlrVq1HB0d+/btawuH0Wi8dOlSy5Ytza+fpUqV2rVrl/kr6nku3rt3b51OV7169RUrVuRZbL2AtLPu8/fc9PT0pUuX1q5d29ytOnXqfPnll3yd3CY7igpBIDPtatas2ezB1LRp00aNGtWtW7datWrVq1fv2rXrnDlzQkJCkpKSrLyiFcKqMWRREgiJCAmJCIlIiMj5e9RW0m7JkiVeXl6urq5vvvmmLVubmJi4devW8uXLm18/XV1dN23aZOlUzGwDDh482MXFpUKFCosWLco2S/QuaWeT2KVLl5555hm1Wu3o6KjT6VQqVadOnbJe6samUShCoIAEMtMu89vlGRkZsbGx586dW7lyZd++fT08PJRKZaNGjX7++Wc+tysg9WI4TN1FdWsuqPnJnk+O3jl6L/leuv7f68xZSbv58+eXK1fO/PWDPFHMlx3u1q2bQqHQPZgUCkXHjh1PnDhhy3kPw4cPL126dNmyZYOCgvJ8LusFpJ11n7/mpqenDxs2rEyZMnZ2dr169erWrdtfXzYvW/add97hIoR581FRCAI50y7rkyQlJf3www+lS5dWKBQNGjQ4deoUh3dZfbidKVBpTiXzBRErz638wc8fnAw/mZSepDf89VsuVtJu0aK/rq3h5ub21ltvZQ5l6UZkZOTMmTOVSqVOp+vatevLL7+s0+n+vNL0p59+asu1hYcOHerq6urh4fH5559begobHyft8obaunWrj4+PJEnt2rXbvXv39u3bW7duLUnSU0899f333+e9PBUIFLSA9bQzmUxJSUmTJk3S6XSSJC1evDjPk98KegUZr2gIVJpTyXy9e+VEpXKisuLsisN+HBYSEWI0Gq2k3fLly2vUqOHo6NivXz/r22kwGH744Qdvb2+lUlmtWrWrV6/evHmzWrVqSqWycuXK33//fZ6Hd6+99pqjo6O3t/dXX31l/bnynEvaWSMyGo2xsbEtWrTQarXu7u5Lly5NTExMSEgICgpyd3e3t7dv3759TEyMtSGYh0AhCOSZdhkZGYcOHXJxcZEkaeTIkdeuXSuEtWDIIi+QmXbmzFNNUumm6nzm+wz+YfDnWz63dE7m+vXr/fz8NBpNjx49rBOcPHmyb9++KpXK09Nz3rx5+gdTUFBQhQoVlErla6+9duLECesjmN9L8/Pz+/bbb61X5jmXtLNGlJGRMW7cODc3N4VCMWLEiMuXLxsfTOfOnRs6dKhCofjzc9fAwEBrQzAPgUIQyDPt9Hr92bNn3dzcCuqbuYWwEQz5+AWypV1m5rl86lL+3b9OKtFoNOPGjcv2DYTdu3d37NhRoVC0a9cu5wWjM7cqJiZmxowZbm5uTk5O3bt3z3yDISYm5qWXXnJycvrzZ6pmzJhh5YAhNja2TZs25s/5du/enTly/m6Qdhbd0tLSDh48WKVKFZVK1bBhw6ynzKakpGzdutV8HcJatWodO3Ysz+Nxi0/DDATEBfJMu7S0tO+++65UqVKSJE2YMCE0NFT8SVii+AvkmnZ//5bng8uHKdVK356+O87tSEz798Jdly9fNl9drHHjxlYOzjZv3tysWTOlUtmgQYOff/4564fHu3bt8vX1VSqVzZo1yzzTKif38ePHGzZsKEnSwIEDH/6sQNIup/BfjxiNxrCwsBdeeEGtVut0usWLF2f7XfLIyMjZs2frdDp7e/uePXvev38/ay9zH5RHESggAetpZzAYIiMju3btqtFodDrdpk2bOC2zgOCL2zB5pp2kkuyfsW+4oOHQrUN/vPLjveS/flg1ISFh6tSpKpWqVq1aa9euzRXl3LlzAwcOdHR0rFy5cmBgYLbvGyQkJIwfP97Ly8vR0XHw4MGWkmz16tU1atT480dGp02blu34Mtcntf4gaZe7T0xMTFBQkJOTk0Kh6NOnz+XLl7Mdven1+pCQkB49eigUCjc3t2XLlj38RUtzXxUeRSCHgKW0y8jIiIiICA4OHj58uKurq0KheOWVV/78uTv+KZaDkAf+ErAl7SR/SfpQcpvu1nxp8+Hbh2+5tCUiPuLrr7+uWrWqh4fH2LFjc1ImJCR89tlnVatW1el0PXv2zPVXOM6fP9+9e3cHBwcfH5/Zs2fn+vo5evTocuXK+fj4rFu3zpaLtuRck6yPkHZZNf6+nZKSsm/fPl9fX4VC4ePjs2vXrlyvSZGQkLBly5YqVaqYv9h06tSpzC8kxKXG7bmxZ9GxRfwhUBgCAxYPKNWulNRI6jG9x4ebPjT/jd00dvS60YO+GPTMmGdcn3VVNlG6dXB7be5rM/fOLIx1YMxiIOA63fXv9y0D//6p6n/vmn8IQSVJrf5KO/MXFVw+dWmxtMWwH4dNXju5Z8+e9vb2HTt2zPnRnfnEdZVK1ahRo2+++SbboYL5dVav13/99dd+fn4qlerZZ58NDg7O9lp8//79du3aabXanj17Hj16NNvcfNwl7bKjGY3Gq1evBgQEKBQKe3v7SZMmWTmCjoyM/PDDD9VqtVKpfP/99zMvNh+eED7/t/ld1nbhD4HCEGgws4G2v1Z6VVK+pvz3r69S9X8qzRsapyFOFUZVeFmnIA0AAAWmSURBVHLyk60Wt+r8defCWAHGLB4C9lPs/423bIH337TLWub+mfvIzSNnz57t4OBQo0aNvXv3Zn0ZvXXr1sCBA93c3Dw8PD766KO7d+9mnZv1dmRk5AcffFCuXLnSpUsHBARku/LwL7/8Uq1atT+vjTd79uyoqKisC+bvNmmX3c1oNP7+++9jx44dMGDAsGHDQkNDc/2HiXmxjIyMK1euDBkyZMCAAR9//PGdO3fMbxnFpcYduHVg6cml/CFQGALTf5o+dMnQAUED/vO3YMDgRYPf+t9bo74eNXnb5MW/Lf7q5FeF8eyMWWwE3Ka7ZY2x/9weKUl+ktRQknpJ0seSYqJCEagoP7N86+Wt3/rxrR1XduzatatBgwZlypR5//33s75VfuHChSlTpgwYMGDixIl5/ibanz8YNGHChAEDBnz66adXrlzJfDk2Go2jRo1yd3dv0KDB7t27s46fWSN6g7QTFaMeAQQQKCYC1j63++dQTzFRIQVKHrM8nv7q6fd+em/PjT1xqXEmk+nWrVvjx493cnJq2LBh5j/0C8TFaDSGhobWr19fp9ONHz/+1q1bBTIsaVcgjAyCAAIIFD0B62mnCFQoJv51POe72Pfdne8eDj2clJ6UuZEGg+HAgQN169Z1c3ObN2+e9d9lzVzKlhvp6emzZ892cXGpVavW/v37rby7ZstomTWkXSYFNxBAAIGSJWAl7dST1KVnlK65oOa7O989c/dMzh9JMJlMkZGRs2bNqlChQtu2bRMTEwvk/cY/38OMj4/39/evUKHCjBkzIiIiCqolpF1BSTIOAgggUMQEck079SS18zTnavOrjQ4effXeVSsZZjQaw8PD58yZM3v27Dt37hTIQZherw8NDZ01a9acOXMiIyOtPLuoNWknKkY9AgggUEwEsqWdcqJSNVHlPc97/C/jb8TeKCYb+c9mkHb/SPB/BBBAoIQJZKad+TcQan9ee+r+qRejLialJxmMhmKGQdoVs4ayOQgggICtAua0UwQqGn7RcOahmaciTsWkxGQYMmxdvkjVkXZFql2sLAIIIFBwAu1Wtmuzos3sX2f/due3P5L+KK45ZwYj7Qpux2EkBBBAoEgJHA07eizs2N3Eu8U758w9Ie2K1L7JyiKAAAII5EuAtMsXGwshgAACCBQpAdKuSLWLlUUAAQQQyJcAaZcvNhZCAAEEEChSAqRdkWoXK4sAAgggkC8B0i5fbCyEAAIIIFCkBEi7ItUuVhYBBBBAIF8CpF2+2FgIAQQQQKBICZB2RapdrCwCCCCAQL4ESLt8sbEQAggggECREiDtilS7WFkEEEAAgXwJkHb5YmMhBBBAAIEiJUDaFal2sbIIIIAAAvkSIO3yxcZCCCCAAAJFSoC0K1LtYmURQAABBPIlQNrli42FEEAAAQSKlABpV6TaxcoigAACCORLgLTLFxsLIYAAAggUKQHSrki1i5VFAAEEEMiXAGmXLzYWQgABBBAoUgKkXZFqFyuLAAIIIJAvAdIuX2wshAACCCBQpARIuyLVLlYWAQQQQCBfAkUg7fbv3+/p6RkWFhYfH5/AhAACCCCAgLhARESEv7//smXL0tLS8hWXJil/i9m4VGpqanBwsJ2dXb169fyYEEAAAQQQyJeAr6+vk5PT4sWLExMTbQygbGWFm3YGgyE8PHzNmjWbNm3azIQAAggggEB+Bb755psrV65kZGRkizEb7xZu2plMJoPBkJycnM6EAAIIIIDAQwgkJyfnO+pMpkJ+J9PGyKUMAQQQQACBQhUo9GO7Ql17BkcAAQQQQMAWAdLOFiVqEEAAAQSKtgBpV7T7x9ojgAACCNgiQNrZokQNAggggEDRFiDtinb/WHsEEEAAAVsESDtblKhBAAEEECjaAqRd0e4fa48AAgggYIsAaWeLEjUIIIAAAkVb4P8B2MdHjPgJaS4AAAAASUVORK5CYII=[/img][br][br]xからf(x)への表現Aは、表現Bを経由するとB=P[sup]-1[/sup]APになる。[br]この表現AにAgを入れて計算すると、対応する、Bgが求められる。[br]つまり、群の行列表現は基底に連動して変わるということがわかるね。[br]ということは、計算しやすいように、基底を選ぶことで表現行列が扱いやすくなるということだね。そうすると、群の2項演算が表現行列どうしの積になるので、群の計算が線形代数の計算や[br]写像の問題に置き換えて議論できるということになることがわかる。[br][br][color=#9900ff][b][size=150]質問:新旧の基底からPとinvPを求めて可換図式に反映し、AからBを求める関数を作るコードはどうしたらよいでしょう。[br][/size][/b][/color][br]pythonでは[b]行ベクトルを多列につみあげたものが行列というデータの入力方法なので、[br]Pのデータを行ベクトルのリストという形式で渡しましょう[/b]。[br]渡されたデータから、numpyで、行列Pと逆行列inv(P)を求めて、行列を返す関数[b]makePs[/b]を作ります。[br]そして、Aのデータは対称群なので、行ベクトルp1,p2,p3の順列をnumpyの行列リストとして作り出す関数[br][b]makeS3[/b]を作ります。返される行列群をAとして受け取りましょう。[br]そして、makePsからP,inv(P)を取得して、Aの各要素にinv(P)APをしてあげて、Bを作ればよいですね。[br][br]import japanize_matplotlib[br]import numpy as np [br]from matplotlib import pyplot as plt[br]import networkx as nx[br]from numpy.linalg import inv[br]from itertools import permutations[br]def makeS3():[br] p1 = np.array([1,0,0])[br] p2 = np.array([0,1,0])[br] p3 = np.array([0,0,1])[br] source = [p1,p2,p3][br] return [np.array(x) for x in permutations(source)][br]def makePs(newbase):[br] X = np.array(newbase)[br] x = np.identity(3)[br] P = np.dot(X,inv(x))[br] invP=inv(P)[br] return x,X,P,invP[br]def makeB(P,invP,A):[br] return [np.dot(invP,np.dot(x,P)) for x in A][br]def kakanzushiki(f,n,funcs,E):[br] # グラフの作成[br] G = nx.DiGraph()[br] G.add_nodes_from(f, bipartite=0)[br] G.add_nodes_from(n, bipartite=1)[br] G.add_edges_from(E)[br] # グラフを描画[br] pos = nx.bipartite_layout(G, f)[br] colorList = ['white']*(len(f) + len(n))[br] labels = nx.get_edge_attributes(G, 'label')[br] nx.draw_networkx_edge_labels(G, pos, edge_labels=labels,[br] font_family='IPAexGothic',font_size=10,rotate = False,verticalalignment='baseline')[br] nx.draw_networkx(G,pos,node_color=colorList,edge_color ='green',font_size=10,[br] verticalalignment='center',arrowsize=15)[br] plt.show()[br][br]# グラフの設定と実行===============================================================[br]x,X,P,invP=makePs([[1, 1, 1],[1, 0, 1],[1, 0, 0]])[br]Ag=makeS3()[br]Bg=makeB(P,invP,Ag)[br]print("Ag:")[br]for item in Ag:[br] print(item)[br]print("Bg:")[br]for item in Bg:[br] print(item)[br]f = [f"x{x}",f"X{X}"][br]n = ["f(x)","f(X)"][br]funcs=["A", f"P{P}", "B", f"1/P{invP}"][br]f.reverse()[br]n.reverse()[br]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]})][br]kakanzushiki(f,n,funcs,E)[br]