群論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