algebraic topology 2 圏論とvan-Kampenの定理

 J.P.MayのA Concise Course in Algebraic Topologyの自分用勉強ノート.練習問題も解く.

2.1 圏論
圏: \ \mathcal{C}\ とは対象の集まり\ \mathrm{Ob}(\mathcal{C})\ と,任意の対象\ A,\ B \in \mathrm{Ob}(\mathcal{C})\ に対し定義される射の集まり\ \mathrm{Mor}(A,\ B)\ の組みで以下を満たすものとする.
  • 任意の\ f \in \mathrm{Mor}(A,\ B),\ g \in \mathrm{Mor}(B, C)\ に対し\ g \circ f \in \mathrm{Mor}(A,\ C)\ が存在する.
  • 任意の対象\ A\ に対し\ \mathrm{id}_A \in \mathrm{Mor}(A,\ A)\ が存在し \begin{equation*} f \circ \mathrm{id}_A= f\ \ \ \ \ (\ \forall f \in \mathrm{Mor}(A,\ B)\ ),\\ \mathrm{id}_A \circ g = g\ \ \ \ \ (\ \forall g \in \mathrm{Mor}(B,\ A)\ ). \end{equation*}
  • 任意の\ f \in \mathrm{Mor}(A,\ B),\ g\in \mathrm{Mor}(B,\ C),\ h\in \mathrm{Mor}(C,\ D)\ に対し$$(h \circ g) \circ f = h \circ (g \circ f)$$ が成り立つ.

 例として集合と写像からなる圏\ \mathcal{Set}\ 位相空間連続写像からなる圏\ \mathcal{Top}\ と群と準同型からなる圏\ \mathcal{Group}がある.

2.2 関手
関手: \ \mathcal{C},\ \mathcal{D}\ を圏とする.共変関手\ F: \mathcal{C} \to \mathcal{D}とは任意の対象\ A \in \mathrm{ob}(\mathcal{C})\ に対し\ F(A) \in \mathrm{Ob}(\mathcal{D})と任意の\ f \in \mathrm{Mor}(A,\ B)\ に対し\ F(f) \in \mathrm{Mor}(F(A),\ F(B))\ が定義されており,以下を満たす.
  • $$F(\mathrm{id}_A) = \mathrm{id}_{F(A)}\ \ \ \ \ \ (\ \forall A \in \mathrm{Ob}(\mathcal{C})\ )$$
  • $$F(g \circ f) = F(g) \circ F(f)\ \ \ \ \ \ \ (\ \forall f \in \mathrm{Mor}(A,\ B),\ \forall g\in \mathrm{Mor}(B,\ C)\ )$$

 圏\ \mathcal{C}\ 反対圏\ \mathcal{C}^{\mathrm{op}}とは\ \mathrm{Ob}(\mathcal{C}^{\mathrm{op}})=\mathrm{Ob}(\mathcal{C})かつ\ \mathcal{C}^{\mathrm{op}}(A, \ B)=\mathcal{C}(B,\ A)\ をで定義される圏とする.圏\ \mathcal{C},\ \mathcal{D}\ に対し共変関手\ F: \mathcal{C}^{\mathrm{op}} \to \mathcal{D}のことを反変関手という.

自然変換
自然変換:\ \mathcal{C},\ \mathcal{D}\ の共変関手\ F,\ G:\mathcal{C} \to \mathcal{D}\ に対し自然変換\ \eta:F \to G\ とは射の集まり\ \{\eta_c:F(c) \to G(c)\}_{c \in \mathcal{C}}で任意の\ f \in \mathrm{C}(c,\ d)\ に対し $$ \xymatrix{ F(c) \ar[r]^-{F(f)} \ar[d]_-{\eta _c} & F(d) \ar[d]^-{\eta _d} \\ G(c) \ar[r]^-{G(f)} & G(d) } $$

力学と微分方程式1 微分方程式とその解

 力学と微分方程式(現代数学入門,岩波,高橋陽一郎著)のまとめ.微分方程式のシミュレートもやる.

1.1 古典力学微分方程式

 ある関数\ F(t,x_1,x_2, \dots, x_n)\ が与えられた時,未知関数\ x(t)\ に対する関係式$$F(t,x(t),x'(t),\dots x^{(n)}(t))= 0$$を常微分方程式といい,\ n \in \mathbb{N}\ をその階数という.\ F,x(t)\ はベクトル値関数でもよい.常微分方程式は物理において自然に現れる.ニュートン運動方程式$$F = ma\ \ \ (m:\mbox{質量},a:\mbox{加速度})$$は位置の2階微分が加速度であることから$$F = m\frac{\mathrm{d}^2 q}{\mathrm{d}t^2}\ \ \ \ (q:\mbox{位置})$$と表される.\ F\ が空間微分によらず\ q\ やその時間微分のみに依存するならば,これは常微分方程式となる.もし\ F\ \ q\ の空間微分の情報が含まれるならばこれは偏微分方程式となる.

 例として万有引力をあげる.原点に万有引力があるとき,時刻\ t\ における質点は常微分方程式 $$\left\{ \begin{array}{11} \frac{\mathrm{d}q}{\mathrm{d}t} = v \\ \frac{\mathrm{d}v}{\mathrm{d}t} = -\frac{q}{\|q\|^3} \end{array} \right.\ \ \ \ \ (q,v \in \mathbb{R}^3)$$を満たす.これは距離の2乗に反比例する引力\ F=\frac{-q}{\|q\|^3}\ 運動方程式の帰結である.ただし重力定数と質量を1としている.

この方程式からすぐわかる物理的に意味のある性質がいくつかある.エネルギー\ E = \frac{1}{2}\|v\|^2 -\frac{1}{\|q\|}\ に対し $$E' = \frac{1}{2}v^2 + \frac{q}{\|q\|^3} = 0$$より\ E\ \ t\ に依らない定数となる(エネルギー保存則).また角運動量\ A=q \times v\ に対し時間微分は$$A' = q' \times v + q \times v'=v \times v + q \times\frac{-q}{\|q\|^3} = 0$$

となる.一般にベクトル\ a, b \in \mathbb{R}^3\ に対し\ a \times b\ \ a, b\ と垂直でノルムが\ a,b\ のはる平行四辺形の面積と一致するベクトルとなる.従って任意の\ a \in \mathbb{R}^3\ に対し\ a \times a = 0 \in \mathbb{R^3}\ となる.\ A\ の時間微分が0ということは\ q, v\ と垂直なベクトルが変化しないということで,\ q, v\ \ q \times v\ と直行する平面上を運動し続けることを意味する.また$$\lim_{h \to 0}\frac{1}{h}q(t)\times q(t + h)=q(t)(\lim_{h \to 0}\frac{q(t + h) - q(t)}{h}) = q(t) \times v(t) = A$$より面積速度\ \lim_{h \to 0}|q(t) \times q(t + h)\| \ は一定となる.

algebraic toplogy 1 基本群

 J.P.MayのA Concise Course in Algebraic Topologyの自分用勉強ノート.練習問題も解く.

1.1 基本群定義
連続写像ホモトピー X,Y位相空間としf,g:X \to Y連続写像とする.このときf,gホモトピックとは連続写像H X \times I \to Yが存在し \begin{eqnarray*} H|_{X \times \{0\}} &=& f \\ H|_{X \times \{1\}} &=& g \end{eqnarray*} を満たすことである.ただしI=[0,1]とする.またHホモトピーという.

 位相空間X上の曲線とは連続写像a I \to Xのことでa(0) = a(1)を満たすとき特に閉曲線という.xを始点としyを終点とする曲線を$$a:x\mapsto y$$とかく.またc_xxに値をとる定値写像とする.曲線間のホモトピーにはさらに次の条件を課す.

曲線のホモトピー 位相空間X上の曲線a, b: x \mapsto yがホモトピックとは連続写像H:I \times I \to Xが存在し \begin{eqnarray*} H|_{I \times \{0\}} &=& a \\ H|_{I\times \{1\}} &=& b \\ H|_{\{0\} \times I} &=& c_x \\ H|_{\{1\} \times I} &=& c_y \end{eqnarray*} を満たすこととする.

 曲線a:x \mapsto y, b:y \mapsto zに対し,新たな曲線a \cdot bを $$ a \cdot b(t) = \left\{ \begin{array}{11} a(2t) & (0 \leq t \leq \frac{1}{2}) \\ b(2t-1) & (\frac{1}{2} \leq t \leq 1) \end{array} \right. $$と定義する. またa^{-1}: y \mapsto xを $$ a^{-1}(t) = a(1-t) $$と定義する.

基本群: X位相空間x \in Xとする.$$\pi_1(X,x) := \{a:x \mapsto x\}\ /_{\mathrm{homotopy}}$$はwell-defindな演算$$[a] \cdot [b] = [a \cdot b]$$により群となる.これをXxを基点とする基本群という.単位元[c_x]で[a]の逆元は[a^{-1}]である.
1.2 基点の取り換え

 Xの同じ連結成分に属するx,yに対し\pi_1(X,x),\pi_1(X, y)の関係を述べる.曲線a:x \mapsto yに対し準同型\gamma(a): \pi_1(X,x) \to \pi_1(X, y)を$$\gamma(a)([b])=[a \cdot b \cdot a^{-1}]\ \ \ \ \ ([b] \in \pi_1(X, x))$$と定める.この写像は逆写像\gamma(a^{-1})を持つので実際には同型写像となる.この\gamma(a)は曲線aの選び方に依存する.しかしa,a':x \mapsto yがホモトピックならば\gamma(a) = \gamma(a')である.

また\pi_1(X, x)が可換群ならば道の選び方によらない標準的な同型が存在する.実際 \begin{eqnarray*} \gamma(a'^{-1})\circ \gamma(a) ([b]) &=& \gamma(a'^{-1} \cdot a)([b]) \\ &=& [a'^{-1} \cdot a \cdot b \cdot a^{-1} \cdot a'] \\ &=& [a'^{-1} \cdot a] \cdot [b] \cdot [a^{-1} \cdot a'] \\ &=& [a'^{-1} \cdot a] \cdot [a^{-1} \cdot a'] \cdot [b] \\ &=& [b] \end{eqnarray*} より\gamma(a) = \gamma(a')となる.
1.3 ホモトピー不変

連続写像p:X \to Yは基本群の準同型$$p_*:\pi_1(X,x) \to \pi_1(Y, p(x)),\ \ \ [a] \mapsto [p \circ a]$$を導く.ホモトピックな連続写像p,q:X \to Yホモトピーh:p \simeq qとし,a=h|_{\{x\} \times I}とする.このとき次が成り立つ.

命題: 次の図式は可換である. $$ \xymatrix{ & \pi_1(X,x) \ar[ld]_-{p_*} \ar[rd]^-{q_*} \\ \pi_1(Y, p(x)) \ar[rr]_-{\gamma(a)} & & \pi_1(Y, q(x)) } $$
1.4 \pi_1(\mathbb{R}), \pi_1(S^1)の計算
  • \pi_1(\mathbb{R})= 0
  • \pi_1(\mathbb{S^1})=\mathbb{Z}

証明: \mathbb{R}の基本群は後に,可縮な空間の基本群は自明であるというより一般的な命題を証明する.従ってS^1についてのみ示す.ただし証明の肝となるリフトの一意性に関する部分は後で示されるのでここでは既知とする.互いに逆な2つの写像 \begin{eqnarray*} &i&: \mathbb{Z} \to \pi_1(S^1,1)\\ &j&: \pi_1(S^1, 1) \to \mathbb{Z} \end{eqnarray*} をつくる.iの方は簡単でi(n)= [f_n]で,f_n(t) = e^{2 \pi i n t}である.p: \mathbb{R} \to S^1を$$p(x) = e^{2\pi i x}$$と定義する.リフトの一意性よりS^1上の任意の閉曲線a:1 \mapsto 1に対し,\mathbb{R}上の曲線a'が一意に存在し$$p \circ a' = a$$を満たす.jを$$j([a]) = a'(1) \in p^{-1}(1)=\mathbb{Z}$$と定義する.この定義がwell-definedであることはより従う. $$ j \circ i (n) = j ([f_n])=n$$ よりj \circ i = \mathrm{id}である.従ってj全射である.j(\lbrack a\rbrack ) = j(\lbrack b\rbrack)と仮定する.これはa'(1) = b'(1)である.従ってa'^{-1}\cdot b'\mathbb{R}の原点を始点とする閉曲線である.\pi_1(\mathbb{R},0)\cong 0より\lbrack a'^{-1}\cdot b'\rbrack = \lbrack c_0 \rbrack である.従ってp_*で送ると\lbrack a \rbrack =\lbrack b\rbrack となり,j単射となる.(証明終了)

1.5 Brouwerの不動点定理

D^2 = \{z \in \mathbb{C} \mid \|z\| \leq 1 \}に対しi:S^1 \to D^2を包含写像とする.D^2も可縮なので\pi_1(D^2)= 0となる.

命題: 連続写像r:D^2 \to S^1r \circ i = \mathrm{id}_{S^1}を満たすものは存在しない.

証明: rが存在すると仮定する.(r \circ i)^*= \mathrm{id}_{\pi_1(S^1,1)}だが $$ \xymatrix{ \pi_1(S^1,1) \ar[r]^-{i_*} \ar[d]_-{\cong} & \pi_1(D^2, 1) \ar[r]^-{r_*} \ar[d]_-{=} & \pi_1(S^1, 1) \ar[d]_-{\cong} \\ \mathbb{Z} & 0 & \mathbb{Z} } $$ より矛盾.(証明終了)

Brouwerの不動点定理: 任意の連続写像f:D^2 \to D^2不動点をもつ.

証明: 不動点を持たない連続写像fが存在すると仮定する.連続写像r:D^2 \to S^1x \in D^2に対しxf(x)を結ぶ直線と円周の交点のf(x)に近いほうを対応させることで定義する.このときr \circ i = \mathrm{id}となり矛盾する.(証明終了)

1.6 代数学の基本定理
写像度: 連続写像f:S^1 \to S^1に対し写像\mathrm{deg}(f) \in \mathbb{Z}を以下の写像 $$ \xymatrix{ \pi_1(S^1, 1) \ar[r]^-{f_*} & \pi_1(S^1, f(1)) \ar[r]^-{\cong} & \pi_1(S^1, 1) } $$を用いて$$\pi_1(S^1, 1) \ni \iota \mapsto (\mathrm{deg}(f))\iota \in \pi_1(S^1, 1)$$として定める. 注意としてS^1基本群が可換であることより同型は1f(1)を結ぶ曲線の取り方に寄らない.

 ホモトピックな連続写像f,g:S^1 \to S^1に対し写像度は一致する.これはホモトピー不変に関する命題から従う.よって\mathrm{deg}(f)=nならばff_nホモトピー同値である.ここでf_nは$$f_n:S^1 \to S^1,\ \ \ z \mapsto z^n$$であり,定義から\mathrm{deg}(f_n)=nである.

代数学の基本定理 複素係数多項式$$f(z)=z^n +c_1 z^{n - 1} + \cdots + c_{n-1}z + c_n,\ \ \ n>0$$に対しf(z)=0となるz \in \mathbb{C}が存在する.(従って因数定理よりf(z)=0の解の個数は重複を含めn個ある.)

証明: f(z)の零点が存在しないと仮定する.$$p(z)=\frac{f(z)}{\|f(z)\|}$$とおく.z \in S^1とする.$$\phi(z, t):=p(tz)=\frac{c_n+t(c_{n-1}z + \cdots + t^{n-1}z^n )}{\|c_n+t(c_{n-1}z + \cdots + t^{n-1}z^n )\|}$$は定値写像z \mapsto \frac{c_n}{\|c_n\|}pホモトピーとなる.従って\mathrm{deg}(f)=0.また$$\psi(z,t):=\frac{p(\frac{z}{t})}{\|p(\frac{z}{t})\|}=\frac{z^n + t(c_1z^{n-1} + \cdots c_nt^{n - 1})}{\|z^n + t(c_1z^{n-1} + \cdots c_nt^{n - 1})\|}$$は写像z \mapsto z^np(z)ホモトピーである.従って\mathrm{deg}(p)=n.よって矛盾する.(証明終了)

1.7 問題

問題1:複素係数多項式f(z)S^1上に零点を持たないとする.ここでz \in S^1に対し \begin{eqnarray*} p(z)= \frac{f(z)}{\|f(z)\|} \end{eqnarray*} とする. このとき\|z\| \lt 1における重複も含めた解の個数と\mathrm{deg}(p)が一致することを示せ.

解答:f(z)=c(z-a_1)(z-a_2)\cdots (z-a_n)とかける.従って$$p(z)= \prod_{i=1}^n \frac{z-a_i}{\|z - a_i\|}$$である. ここで写像度の以下の性質を用いる.

写像度の性質: 連続写像f,g:S^1 \to S^1に対し
  • $$\mathrm{deg}(fg)=\mathrm{deg}(f) + \mathrm{deg}(g)$$
  • $$\mathrm{deg}(f \circ g)= \mathrm{deg}(f)\cdot \mathrm{deg}(g)$$
が成り立つ.

これはf(z)=z^n,g(z)=z^mのときを考察することで簡単に示される.従って $$\mathrm{deg}(p)=\sum_{i~1}^n \mathrm{deg}(p_i),\ \ \ \ p_j(z)= \frac{z-a_j}{\|z- a_j\|}$$となる.ここで\|a_j\|\lt 1を満たすp_jは$$\phi(z,t)=\frac{z-ta_j}{\|z -ta_j\|}$$により恒等写像とホモトピックであり写像\mathrm{deg}(p_j)=1である.また\|a_j\| \gt 1を満たすp_jは$$\phi(z,t)=\frac{tz-a_j}{\|tz - a_j\|}$$によって定値写像とホモトピックであり,\mathrm{deg}(p_j)=0である.従って題意が示された.(証明終了)

algebraic topology 2

整数論2 合同一次方程式と中国式剰余定理

 ax \equiv b \pmod mの形の方程式を合同一次方程式という.またそれらの連立方程式の解を与える中国式剰余定理について紹介する.

一次合同方程式: a,b,n \in \mathbb{Z},a\neq 0,n \gt 0とする. k =\mathrm{gcd}(a,n)とするとき合同方程式$$ax \equiv b \pmod{n}$$の解はk\mid bならばnを法としてk個存在する.またk \nmid bならば解を持たない.

証明: ax-ny=bとなる整数x,yが存在するとする.左辺はkを約数に持つのでk|bとなる.従ってk \nmid bならば解を持たない.ax-ny=kは整数解を持つことは整数論1(定理2)で示している.解の1つをx_0, y_0とする.2つの式を引き算すると$$a(x-x_0) + n(y -y_0)=0$$となる.両辺kで割ると$$a'(x - x_0) + n'(y - y_0)=0\ \ \ \ (a'=\frac{a}{k}, n'=\frac{n}{k})$$となる.\mathrm{gcd}(a', n')=1より$$x \equiv x_0 \pmod{n'}$$となる.従って$$x \equiv x_0,x_0 + n', \dots , x_0 + (k - 1)n' \pmod{n}$$となる.(証明終了)

中国式剰余定理:m_1,m_2, \dots ,m_nをどの2つとも互いに素な自然数とする.整数b_1,b_2 ,\dots ,b_nに対し連立合同方程式 \begin{eqnarray*} x &\equiv &b_1 \pmod{m_1} \\ x &\equiv &b_2 \pmod{m_2} \\ &\dots& \\ x &\equiv &b_n \pmod{m_n} \end{eqnarray*} の解はM=m_1*m_2* \cdots *m_nを法として1個存在する.

証明: 解の存在:$$M=m_1M_1=m_2M_2= \cdots = m_n M_n$$としてM_1,M_2,\dots , M_nを定める.定義より$$\mathrm{gcd}(m_i,M_i)=1\ \ \ (i=1,2,\dots , n)$$である.整数論1(定理2)より任意のiに対し \begin{equation}\label{iti} M_it_i \equiv 1 \pmod{m_i} \end{equation} を満たすt_iが存在する. 従って$$x \equiv \sum_{i=1}^n M_it_ib_i$$は連立合同方程式を満たす.実際m_ixを割るとi \neq jにおいてm_i | M_jより$$x \equiv m_iM_it_i \pmod{m_i}$$が成り立ち,(\ref{iti})より$$x \equiv b_1 \pmod{m_i}$$となる.
解の一意性:x,yが解とする.このとき任意のiに対し$$x_i \equiv y_i \pmod{m_i}$$が成り立つ.\{m_i\}_{i=1}^nは互いに素より$$x\equiv y \pmod{M}$$となる.従ってMを法として一意性が成り立つ.(証明終了)

 以下は合同一次式と中国式剰余定理を用いた連立合同方程式を解くコード.整数論1で定義したmoduleをimportとしている.

# coding: utf-8

import euclidian_algorithm as ea

def solve_cong_eq(a, b, n):
    #ax = b mod(n)のmod(n)解をリストで返す関数
    if a == 0: raise ValueError("aに0が代入されてます")
    elif n <= 0: raise ValueError("n<=0となっています")
    else:
        k = ea.Euclid(a, n)                                            # 最大公約数を与える関数
        if b % k != 0: return None                                     # 解なし
        else:
            b = b // k
            x0, y0 = ea.Bezout_identity(a, n)                          # ax0 + ny0 = gcd(a,n)の特殊解x0, y0を与える関数
            x0 = b * x0
            return sorted([(x0 + (n // k) * i) % n for i in range(k)]) # 0 ~ m - 1 の間で小さい順 

def chinese_rem(l):
    """"
    l: [(b1,m1),(b2,m2),...,(bn,mn)]
    x = b1 mod m1
    x = b2 mod m2
      ...
    x = bn mod mn
    のM = m1 * m2 * ... * mnを法とした解x (0 <= x < M)を返す関数
    """

    for i in range(len(l) - 1):
        if l[i][1]  <= 0: raise ValueError("n<=0となっています")
        for j in range(i + 1, len(l)):
            if ea.Euclid(l[i][1], l[j][1]) != 1: raise ValueError("互いに素ではありません") 
    if l[len(l) - 1][1] <= 0: raise ValueError("n <= 0となっています")
    M = 1
    for i in range(len(l)):  
        M = M * l[i][1]
    M_list = [M // l[i][1] for i in range(len(l))]
    t_list = [ea.Bezout_identity(M_list[i], l[i][1])[0] for i in range(len(l))]
    x = 0
    for i in range(len(l)):
        x += l[i][0] * M_list[i] * t_list[i]
    return x % M

if __name__ == "__main__":
    for a, b, n in [(3, 12, 15), (-12, 6, 30), (3, 2, 15)]:
        print("{0}x={1}   mod({2})".format(a, b, n))
        print("解:{0} mod {1}".format(solve_cong_eq(a, b, n), n))
        print("############################################")

    l = [(1, 2), (3, 7), (-3, 13)]
    M = 1
    for b, m in l:
        print("x = {0} mod({1})".format(b, m))
        M *= m
    print("解:x={0} mod({1})".format(chinese_rem(l), M))

3x=12   mod(15)

解:[4, 9, 14] mod 15

############################################

-12x=6   mod(30)

解:[2, 7, 12, 17, 22, 27] mod 30

############################################

3x=2   mod(15)

解:None mod 15

############################################

x = 1 mod(2)

x = 3 mod(7)

x = -3 mod(13)

解:x=101 mod(182)

整数論1 ユークリッド互除法

 ユークリッド互除法は2つの整数の最大公約数を求めるアルゴリズムである.証明も含めて紹介する.

定理1: a \gt b \gt 0を整数,abで割った余りをrとする.このとき$$\mathrm{gcd}(a,b) = \mathrm{gcd}(b, r)$$である.

証明:

l = \mathrm{gcd}(a,b),m = \mathrm{gcd}(b,r)とする.定義よりa=bq + rを満たす整数qが存在する.従ってmaの公約数でありm \leq l.またr=a-bqよりlrの公約数である.従ってl\leq m.これよりl=mとなる.(証明終了)

この定理1を下にユークリッド互除法を説明する.2つの自然数a \gt bの最大公約数を求めたい.数列r_nを次のように定める

  1. r_0=a,r_1=bとしr_0r_1で割った余りをr_2とする.
  2. r_{n - 1}r_{n}で割った余りをr_{n+1}とする.

ここでr_n0になるまで単調減少である.n=n_0で初めて0になるとすると定理1より$$\mathrm{gcd}(a,b) =\mathrm{gcd}(r_0,r_1)= \dots \mathrm{gcd}(r_{n_0 - 1},r_{n_0})=\mathrm{gcd}(r_{n_0 - 1}, 0) = r_{n_0 - 1}$$となる.これにより最大公約数を求めることができる.これがユークリッド互除法である.

 ユークリッド互除法の過程を詳しく見ることで次の定理が従う.

定理2 a, b0でない整数とする.このとき$$ax+by=\mathrm{gcd} (a,b)$$を満たす整数x,yが存在する.この等式をべズーの等式という.

証明: a,b \gt 0と仮定してよい.実際 \|a\|,\|b\|に対しx,yを求め,符号を調節すればよい.r_n=k_nr_{n+1} + r_{n + 2}としてk_nを定める.このとき \begin{equation*} \begin{pmatrix} r_0\\ r_1 \end{pmatrix} = \begin{pmatrix} k_0 & 1 \\ 1 & 0 \end{pmatrix} \cdots \begin{pmatrix} k_{n_{0}-1} & 1\\ 1 & 0 \end{pmatrix} \begin{pmatrix} r_{n_0} \\ 0 \end{pmatrix} \end{equation*} とかける.行列$$\begin{pmatrix}k_n & 1\\ 1 & 0 \end{pmatrix}$$は行列式-1より逆行列を持つ.従ってr_{n_0}について解くことができる.r_{n_0}=\mathrm{gcd}(a,b)より定理が示された.(証明終了)

# coding: utf-8
import numpy as np
# ユークリッド互除法

def Euclid(a, b):
    # ユークリッド互除法を用いて最大公約数を求める関数
    a = abs(a)
    b = abs(b)
    if a == 0 and b == 0: raise ValueError("両方0です")
    elif a == 0: return b
    elif b == 0: return a
    else:
        a, b = max(a, b), min(a, b)
        while b != 0:
            a, b = b, a % b
        return a

def Bezout_identity(a, b):
    # べズーの等式 ax + by = gcd(a,b) を満たすx,yを求める関数

    if a == 0 and b == 0: raise ValueError("両方0です")
    elif a == 0: return 0, 1 
    elif b == 0: return 1, 0
    else:
        c = a
        d = b
        k = np.array([[1, 0], [0, 1]])  # 単位行列
        a = abs(a)
        b = abs(b)
        junban = a > b                  # a,bの大小関係を記憶
        a, b = max(a, b), min(a, b)
        while b != 0:
            v = np.array([[a // b, 1], [1, 0]])
            k = np.dot(k,v)
            a, b = b, a % b
        k = np.linalg.inv(k)
        x = int((c // abs(c)) * round(k[0][0]))
        y = int((d // abs(d)) * round(k[0][1]))
        if junban == True:
            ans = c * x + d * y
            if ans > 0: return x, y
            else      : return -x, -y
        else:
            ans = c * y + d * x
            if ans > 0: return y, x
            else      : return -y, -x
        
if __name__ == "__main__":
    for (a, b) in [(47, 18), (-14, 26)]:
        print("###########################")
        print(a, b)
        print("最大公約数{0}".format(Euclid(a, b)))
        print(Bezout_identity(a, b))

 

###########################

47 18

最大公約数1

(5, -13)

###########################

-14 26

最大公約数2

(-2, -1)

群論1 群の定義および例

 群とは大学で学ぶ最も基本的で重要な代数構造である.大雑把に言えば足し算と引き算ができる集合である.

群の定義: Gを集合とし二項演算$$G \times G \to G\ \ \ \ \ ((a,b) \mapsto a \cdot b)$$が以下を満たすとき Gという.
  1. 任意の a,b,c \in Gに対し$$(a \cdot b) \cdot c = a \cdot (b \cdot c).$$
  2. ある1_G \in Gが存在し,任意のg \in Gに対し$$1_G \cdot g = g \cdot 1_G = g.$$ここで1_G単位元という.
  3. 任意のg \in Gに対し,ある g' \in Gが存在し$$g \cdot g' = g' \cdot g = 1_G.$$ここでg'g逆元 といいg^{-1}とかく.

 例えば\mathbb{Z},\mathbb{Q},\mathbb{R},\mathbb{C}は和に関し群となるし\mathbb{Q}^{*}=\mathbb{Q} \setminus \{0\},\mathbb{R}^{*},\mathbb{C}^{*}は積に関し群となる.ただし\mathbb{Z}^{*}は逆元を一般には持たないので群ではない.

対称群

 I_n=\{1,2,\dots ,n\}全単射写像全体をS_nとかく.S_nは合成に関し群となる.これを対称群という.

 \sigma = (i_1,i_2,\dots,i_r) \in S_n\sigma (i_1) = i_2, \sigma (i_2) = i_3,\dots , \sigma (i_r) = i_1と定義する.ただしI_n \setminus \{i_1,i_2,\dots i_r\}上では恒等写像とする.このとき\sigma を長さr循環置換という.特に長さ2の循環置換を互換という.

対称群の性質:
  1. 任意の\tau \in S_nは互いに共通文字を持たない循環置換の積に順番を除き一意に表される.
  2. 任意の \tau \in S_nは互換の積に表すことができる.

 注意として互換の積の表し方は一意ではない.しかし互換の個数の偶奇は一意に定まる.互換の個数をnとするとき(-1)^n符号数という.

# coding: utf-8

# 対称群を定義する

def get_symm_group(n):
    def make_permutation(m):
        if m == 1: return [[0]]
        else:
            ans = []
            for z in make_permutation(m - 1):
                for i in range(len(z) + 1):
                    copy_z = z[:]
                    copy_z.insert(i, m - 1)
                    ans.append(copy_z)
            return ans
    
    z = make_permutation(n)
    def sigma(i, z):
        try:
            f = lambda m: z[i][m]
            return f
        except ValueError:
            print("定義域から外れてます")

    return [sigma(i, z) for i in range(len(z))]


# 与えられた対称群の元を互いに交わらない循環置換の積で表す

def junkan(sigm, n):
    # sigm: n次対称群の元
    I = [i for i in range(n)]
    ans = []
    for j in I:
        if j != -1:
            J = [j]
            I[j] = -1
            k = sigm(j)
            while k not in J:
                I[k] = -1
                J.append(k)
                k = sigm(k)
            ans.append(J)
    return ans
    

# 対称群の元を互換の積で表す

def gokan(sigm, n):
    list_junkan = junkan(sigm, n)
    ans = []
    for z in list_junkan:
        if len(z) >= 2:
            a = []
            for i in range(1, len(z)):
                a.append([z[0], z[i]])
            a = a[::-1]
            ans.extend(a)
    return ans

# 対称群の元の符号数を求める

def get_sign(sigm, n):
    return (-1) ** (len(gokan(sigm, n)))

if __name__ == "__main__":
    N = 4 # N次対称群
    S = get_symm_group(N)
    print(len(S))
    for sigm in S:
        print("########################################")
        for i in range(N):
            print("sigma({0})={1}".format(i, sigm(i)))
        print("循環置換{0}".format(junkan(sigm, N)))
        print("互換{0}".format(gokan(sigm, N)))
        print("符号数{0}".format(get_sign(sigm, N)))

% vim sym_group.py

 

24

########################################

sigma(0)=3

sigma(1)=2

sigma(2)=1

sigma(3)=0

循環置換[[0, 3], [1, 2]]

互換[[0, 3], [1, 2]]

符号数1

########################################

sigma(0)=2

sigma(1)=3

sigma(2)=1

sigma(3)=0

循環置換[ [0, 2, 1, 3] ]

互換[[0, 3], [0, 1], [0, 2]]

符号数-1

########################################

sigma(0)=2

sigma(1)=1

sigma(2)=3

sigma(3)=0

循環置換[[0, 2, 3], [1]]

互換[[0, 3], [0, 2]]

符号数1

########################################

sigma(0)=2

sigma(1)=1

sigma(2)=0

sigma(3)=3

循環置換[[0, 2], [1], [3]]

互換[ [0, 2] ]

符号数-1

########################################

sigma(0)=3

sigma(1)=1

sigma(2)=2

sigma(3)=0

循環置換[[0, 3], [1], [2]]

互換[ [0, 3] ]

符号数-1

########################################

sigma(0)=1

sigma(1)=3

sigma(2)=2

sigma(3)=0

循環置換[[0, 1, 3], [2]]

互換[[0, 3], [0, 1]]

符号数1

########################################

sigma(0)=1

sigma(1)=2

sigma(2)=3

sigma(3)=0

循環置換[ [0, 1, 2, 3] ]

互換[[0, 3], [0, 2], [0, 1]]

符号数-1

########################################

sigma(0)=1

sigma(1)=2

sigma(2)=0

sigma(3)=3

循環置換[[0, 1, 2], [3]]

互換[[0, 2], [0, 1]]

符号数1

########################################

sigma(0)=3

sigma(1)=1

sigma(2)=0

sigma(3)=2

循環置換[[0, 3, 2], [1]]

互換[[0, 2], [0, 3]]

符号数1

########################################

sigma(0)=1

sigma(1)=3

sigma(2)=0

sigma(3)=2

循環置換[ [0, 1, 3, 2] ]

互換[[0, 2], [0, 3], [0, 1]]

符号数-1

########################################

sigma(0)=1

sigma(1)=0

sigma(2)=3

sigma(3)=2

循環置換[[0, 1], [2, 3]]

互換[[0, 1], [2, 3]]

符号数1

########################################

sigma(0)=1

sigma(1)=0

sigma(2)=2

sigma(3)=3

循環置換[[0, 1], [2], [3]]

互換[ [0, 1] ]

符号数-1

########################################

sigma(0)=3

sigma(1)=2

sigma(2)=0

sigma(3)=1

循環置換[ [0, 3, 1, 2] ]

互換[[0, 2], [0, 1], [0, 3]]

符号数-1

########################################

sigma(0)=2

sigma(1)=3

sigma(2)=0

sigma(3)=1

循環置換[[0, 2], [1, 3]]

互換[[0, 2], [1, 3]]

符号数1

########################################

sigma(0)=2

sigma(1)=0

sigma(2)=3

sigma(3)=1

循環置換[ [0, 2, 3, 1] ]

互換[[0, 1], [0, 3], [0, 2]]

符号数-1

########################################

sigma(0)=2

sigma(1)=0

sigma(2)=1

sigma(3)=3

循環置換[[0, 2, 1], [3]]

互換[[0, 1], [0, 2]]

符号数1

########################################

sigma(0)=3

sigma(1)=0

sigma(2)=2

sigma(3)=1

循環置換[[0, 3, 1], [2]]

互換[[0, 1], [0, 3]]

符号数1

########################################

sigma(0)=0

sigma(1)=3

sigma(2)=2

sigma(3)=1

循環置換[[0], [1, 3], [2]]

互換[ [1, 3] ]

符号数-1

########################################

sigma(0)=0

sigma(1)=2

sigma(2)=3

sigma(3)=1

循環置換[[0], [1, 2, 3]]

互換[[1, 3], [1, 2]]

符号数1

########################################

sigma(0)=0

sigma(1)=2

sigma(2)=1

sigma(3)=3

循環置換[[0], [1, 2], [3]]

互換[ [1, 2] ]

符号数-1

########################################

sigma(0)=3

sigma(1)=0

sigma(2)=1

sigma(3)=2

循環置換[ [0, 3, 2, 1] ]

互換[[0, 1], [0, 2], [0, 3]]

符号数-1

########################################

sigma(0)=0

sigma(1)=3

sigma(2)=1

sigma(3)=2

循環置換[[0], [1, 3, 2]]

互換[[1, 2], [1, 3]]

符号数1

########################################

sigma(0)=0

sigma(1)=1

sigma(2)=3

sigma(3)=2

循環置換[[0], [1], [2, 3]]

互換[ [2, 3] ]

符号数-1

########################################

sigma(0)=0

sigma(1)=1

sigma(2)=2

sigma(3)=3

循環置換[[0], [1], [2], [3]]

互換[ ]

符号数1

擬似逆行列

ムーア-ペンローズの擬似逆行列
擬似逆行列 行列\mathbf{A}に対し以下を満たす行列\mathbf{A}^+(ムーアーペンローズ)の擬似逆行列という.

1. \mathbf{A}\mathbf{A}^+\mathbf{A}=\mathbf{A}.

2. \mathbf{A}^+\mathbf{A}\mathbf{A}^+=\mathbf{A}^+.

3. (\mathbf{A}\mathbf{A}^+)^*=\mathbf{A}\mathbf{A^+}.

4. (\mathbf{A}^+\mathbf{A})^*=\mathbf{A}^+\mathbf{A}.

\, \, \mathbf{A}^+は必ず一意に存在し,\mathbf{A}が正則のときは\mathbf{A}^+=\mathbf{A}^{-1}となる.