人気ブログランキング | 話題のタグを見る

D3電卓

1. 改訂版 D3 電卓

D3電卓の改訂版。変更点は、逆元を求められるようにしたこと。群の要素の置換を計算できるようにしたこと。ソースは次のようになる。あくまでも有限群論の理解が目的なので原始的な道具にした。

module D3 where

data Ddata = Ddata Int Int Int deriving Eq

a1 = Ddata 1 2 3
a2 = Ddata 2 3 1
a3 = Ddata 3 1 2
a4 = Ddata 1 3 2
a5 = Ddata 2 1 3
a6 = Ddata 3 2 1

a1' = a1
a2' = a3
a3' = a2
a4' = a4
a5' = a5
a6' = a6

g = [a1, a2, a3, a4, a5, a6]

instance Num Ddata where
  (-) = undefined
  (+) = undefined
  abs = undefined
  signum = undefined
  fromInteger = undefined
  (*) (Ddata a1 a2 a3) (Ddata b1 b2 b3) =
    let c = [0, b1, b2, b3]
    in Ddata (c!!a1) (c!!a2) (c!!a3)

instance Show Ddata where
  show (Ddata 1 2 3) = "a1"
  show (Ddata 2 3 1) = "a2"
  show (Ddata 3 1 2) = "a3"
  show (Ddata 1 3 2) = "a4"
  show (Ddata 2 1 3) = "a5"
  show (Ddata 3 2 1) = "a6"

class Inverse a where
  inverse :: a -> a

instance Inverse Ddata where
  inverse x
    | x == a1 = a1'
    | x == a2 = a2'
    | x == a3 = a3'
    | x == a4 = a4'
    | x == a5 = a5'
    | x == a6 = a6'

uncover (Ddata a1 a2 a3) = (a1, a2, a3)

table grp = mapM_ (\x -> print $ map (x*) grp) grp
tableR grp = mapM_ (\x -> print $ map (*x) grp) grp

inv src dst = permute (zip dst src) src

permute tbl src = map (\x -> let (Just y) = lookup x tbl in y) src

2. D3電卓の操作法

まず load

Prelude> :load D3
[1 of 1] Compiling D3 ( D3.hs, interpreted )
Ok, modules loaded: D3.
*D3>

演算表の表示

*D3> table g
[a1,a2,a3,a4,a5,a6]
[a2,a3,a1,a6,a4,a5]
[a3,a1,a2,a5,a6,a4]
[a4,a5,a6,a1,a2,a3]
[a5,a6,a4,a3,a1,a2]
[a6,a4,a5,a2,a3,a1]
*D3> table [a1,a2,a3]
[a1,a2,a3]
[a2,a3,a1]
[a3,a1,a2]

右結合の演算表

*D3> tableR g
[a1,a2,a3,a4,a5,a6]
[a2,a3,a1,a5,a6,a4]
[a3,a1,a2,a6,a4,a5]
[a4,a6,a5,a1,a3,a2]
[a5,a4,a6,a2,a1,a3]
[a6,a5,a4,a3,a2,a1]

二項演算

*D3> a2 * a3
a1
*D3> map (a4*) g
[a4,a5,a6,a1,a2,a3]

逆元は引用符をつける

*D3> a2 * a2'
a1

inverse 関数で逆元を求める。

*D3> inverse (a2 * a4)
a6

群の要素の置換の結合、下の例は [a3,a1,a2] * [a2,a3,a1] を計算している。後ろの項と基準のポジションの [a1,a2,a3] とで変換テーブルを作って利用する。permute の第1引数は変換テーブル、第2引数はターゲット。

*D3> permute (zip [a1,a2,a3] [a2,a3,a1]) [a3,a1,a2]
[a1,a2,a3]

置換の逆置換を作る方法は次のようにする。変換テーブルを逆にして、恒等置換 [a1,a2,a3] をターゲットにする。

*D3> permute (zip [a2,a3,a1] [a1,a2,a3]) [a1,a2,a3]
[a3,a1,a2]

自動的に計算する inv 関数もある。第1引数に恒等置換 [a1,a2,a3] 第2引数に逆置換を求めたい置換を指定する。

*D3> inv [a1,a2,a3] [a2,a3,a1]
[a3,a1,a2]

プログラムの使い方や意味を言葉で説明するのは難しい。自分で動かしてみて感覚的に納得するのが一番近道だと思う。数学のイメージやコンピュータの操作などの言語になじまない情報をどう効率よく伝達するかは重要な問題だ。
# by tnomura9 | 2015-06-15 23:07 | 考えるということ | Comments(0)

D3電卓で遊ぶ

前回の記事でD3電卓ができたので、せっかくだから遊んでみた。群論の勉強というよりは、Haskell プログラミングの復習になった。最初は ghci に D3 を load するところから。

Prelude> :load D3
[1 of 1] Compiling D3 ( D3.hs, interpreted )
Ok, modules loaded: D3.
*D3>

群 G(= g) はリストとして定義されている。

*D3> g
[a1,a2,a3,a4,a5,a6]

演算表を全て打ち出す。

*D3> mapM_ (\x -> print $ map (x*) g) g
[a1,a2,a3,a4,a5,a6]
[a2,a3,a1,a6,a4,a5]
[a3,a1,a2,a5,a6,a4]
[a4,a5,a6,a1,a2,a3]
[a5,a6,a4,a3,a1,a2]
[a6,a4,a5,a2,a3,a1]

演算表の作成は今後も使いそうだから table という関数にしておく。

*D3> let table h = mapM_ (\x -> print $ map (x*) h) h

すると上の演算表は次のように表示できる。

*D3> table g
[a1,a2,a3,a4,a5,a6]
[a2,a3,a1,a6,a4,a5]
[a3,a1,a2,a5,a6,a4]
[a4,a5,a6,a1,a2,a3]
[a5,a6,a4,a3,a1,a2]
[a6,a4,a5,a2,a3,a1]

群 g の逆元を全て求めてみる。

*D3> [(x, y) | x <- g, y <-g, (x * y) == a1]
[(a1,a1),(a2,a3),(a3,a2),(a4,a4),(a5,a5),(a6,a6)]

群 g の巡回部分群を求める。まず、次々に要素を結合して数列を作る関数 cyclic を作る。

*D3> let cyclic a r = a : cyclic (a * r) r

cyclic は無限数列を作成するから、適当なところで take 関数で取り出す。まず、単位元 a1 に a2 を次々に掛けていく。

*D3> take 6 $ cyclic a1 a2
[a1,a2,a3,a1,a2,a3]

これは [a1, a2, a3] が g の巡回部分群になっていることを示している。そこで、[a1, a2, a3] の演算表を作ってみる。

*D3> table [a1, a2, a3]
[a1,a2,a3]
[a2,a3,a1]
[a3,a1,a2]

部分群 [a1, a2, a3] の右剰余類はどのようなものか調べてみる。

*D3> mapM_ (\x -> print $ map (x*) [a1,a2,a3]) g
[a1,a2,a3]
[a2,a3,a1]
[a3,a1,a2]
[a4,a5,a6]
[a5,a6,a4]
[a6,a4,a5]

きれいに [a1, a2, a3] と [a4, a5, a6] に分かれることがわかる。

部分群 [a1, a2, a3] はまた、正規部分群でもある。正規部分群 H には Ha = aH という性質があるので試してみる。

*D3> map (a4*) [a1, a2, a3]
[a4,a5,a6]
*D3> map (*a4) [a1, a2, a3]
[a4,a6,a5]

部分群 [a1, a2, a3] の右剰余類と左剰余類は一致するから(順序は違うが)[a1, a2, a3] は正規部分群である。

群 g は正規部分群によって剰余類 [a1, a2, a3] と [a4, a5, a6] に分割される。そこで、この剰余類どうしの要素の全ての積を考えてみる。

*D3> [x * y | x <- [a1, a2, a3], y <- [a1, a2, a3]]
[a1,a2,a3,a2,a3,a1,a3,a1,a2]
*D3> [x * y | x <- [a1, a2, a3], y <- [a4, a5, a6]]
[a4,a5,a6,a6,a4,a5,a5,a6,a4]
*D3> [x * y | x <- [a4, a5, a6], y <- [a1, a2, a3]]
[a4,a5,a6,a5,a6,a4,a6,a4,a5]
*D3> [x * y | x <- [a4, a5, a6], y <- [a4, a5, a6]]
[a1,a2,a3,a3,a1,a2,a2,a3,a1]

[a1, a2, a3] の要素と [a1, a2, a3] の要素を掛けたものは全て [a1, a2, a3] の要素となることがわかる。これを次のように記述するとする。

[a1, a2, a3] * [a1, a2, a3] = [a1, a2, a3]

同様に次のような関係がわかる。

[a1, a2, a3] * [a4, a5, a6] = [a4, a5, a6]
[a4, a5, a6] * [a1, a2, a3] = [a4, a5, a6]
[a4, a5, a6] * [a4, a5, a6] = [a1, a2, a3]

そこで集合 [a1, a2, a3] をひとつの要素 b1 とし、集合 [a4, a5, a6] を要素 b4 とすると、次のような演算表ができるので、

[b1 b4]
[b4 b1]

[b1, b4] は集合の積について、群をなしていることがわかる。群 G(=g) とその正規部分群 H からつくられるこのような群を G の H による剰余群 G/H という。

剰余群の意味は、群 G を適切な部分集合に分割すると、その部分集合をひとつの要素とした群を作り出せるということだ。この剰余群はもとの群よりも位数が小さいが、元の群の演算を保存している。つまり、G 以外の群 I で G の剰余群と同型な群にたいしては、G の剰余類 [a1, a2, a3] の要素がすべて I の要素 b1 に写像されるような写像 φ を作ると、その写像を準同型にすることができるということだ。つまり、群の間の準同型写像を作る要因は、もともとの群の構造のなかに潜んでいることになる。

群論のような抽象的な議論も、このようにモデルを作って操作しているうちになんとなく分かってくる。数学者はこのようなモデルを操作するようなことを全て頭のなかのイメージでやってしまうので偉い。しかし、数学の概念を学ぶだけなら、このようなモデルの適切なものがあれば、かなり取っ付き易くなるのではないだろうか。

こうしてみると、高校の時に、数学の出来る学生の頭脳と自分の頭脳がどう異なっていたかがわかる。数学の出来る学生は、頭のなかでイメージを操作することができたが、自分の頭のなかにはそのイメージをつくることができなかったのだ。しかし、凡人の頭でもこのように実際に操作してみることができるインタラクティブなモデルがあれば、数学の得意な生徒の持っていたイメージを自分のものにできるのではないだろうか。数学のイメージを伝える手段としては、言語は効率があまりよくないのだ。

幸い、昨今のパソコンの技術の進歩は目覚ましいものがある。数学のインタラクティブなモデルを作成するための十分な土台が揃ってきている。数学の教材にインタラクティブなモデルを導入できれば、学習効率を革命的に向上させることができるのではないかと思う。

また、重要なのはそのモデルがインタラクティブに操作できるかどうかということだ。学習者がそのモデルについて、手を使って試行錯誤しているうちにモデルの本質のようなものが体得されてくるものでなくてはならない。数学の教材は、学習者が自由に操作して試すことのできる教材でなくてはならないのだ。
# by tnomura9 | 2015-06-09 19:02 | 考えるということ | Comments(0)

三角形パズルの電卓

前回までの記事で群論のモデルに使った3角形の群の動作を計算するプログラムを作った。GHCI で作動させると、群の要素の演算を計算してくれる。有限群の学習には、要素の二項演算を自分でやってみるのが一番効果がある。プログラム名は D3.hs とした。ソースは次のようになる。

プログララム名 : D3.hs

module D3 where

data Ddata = Ddata Int Int Int deriving Eq

a1 = Ddata 1 2 3
a2 = Ddata 2 3 1
a3 = Ddata 3 1 2
a4 = Ddata 1 3 2
a5 = Ddata 2 1 3
a6 = Ddata 3 2 1

g = [a1, a2, a3, a4, a5, a6]

instance Show Ddata where
  show (Ddata 1 2 3) = "a1"
  show (Ddata 2 3 1) = "a2"
  show (Ddata 3 1 2) = "a3"
  show (Ddata 1 3 2) = "a4"
  show (Ddata 2 1 3) = "a5"
  show (Ddata 3 2 1) = "a6"

instance Num Ddata where
  (-) = undefined
  (+) = undefined
  abs = undefined
  signum = undefined
  fromInteger = undefined
  (*) (Ddata a1 a2 a3) (Ddata b1 b2 b3) =
    let c = [0, b1, b2, b3]
    in Ddata (c!!a1) (c!!a2) (c!!a3)

uncover (Ddata a1 a2 a3) = (a1, a2, a3)

使い方は、ghci から D3.hs を load するだけ。あとはコマンドラインから 要素と要素の演算や、要素とリストの演算などができる。演算子は * が中置記法で使える。操作によって正三角形の頂点の置換が行われたときの結果は uncover で確認できる。実行例は次のようになる。

$ ghci
GHCi, version 7.8.3: http://www.haskell.org/ghc/ :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Prelude> :l D3
[1 of 1] Compiling D3 ( D3.hs, interpreted )
Ok, modules loaded: D3.
*D3> a2
a2
*D3> uncover a2
(2,3,1)
*D3> a2 * a3
a1
*D3> g
[a1,a2,a3,a4,a5,a6]
*D3> map (a2*) g
[a2,a3,a1,a6,a4,a5]
*D3> mapM_ (\x -> print (map (x*) g)) g
[a1,a2,a3,a4,a5,a6]
[a2,a3,a1,a6,a4,a5]
[a3,a1,a2,a5,a6,a4]
[a4,a5,a6,a1,a2,a3]
[a5,a6,a4,a3,a1,a2]
[a6,a4,a5,a2,a3,a1]
# by tnomura9 | 2015-06-08 01:49 | 考えるということ | Comments(0)

演算表を調べる

三角形のパズルの群 G の演算表は下のように 6 × 6 の小さな表だが、群の特徴がたくさん詰まっている。

       a1 a2 a3 a4 a5 a6
--------------------------
a1 | a1 a2 a3 a4 a5 a6
a2 | a2 a3 a1 a6 a4 a5
a3 | a3 a1 a2 a5 a6 a4
a4 | a4 a5 a6 a1 a2 a3
a5 | a5 a6 a4 a3 a1 a2
a6 | a6 a4 a5 a2 a3 a1

1. 単位元

a1 は特異な操作でこれを他の操作と連結してもその操作を変えない。つまり、

a1ai = aia1 = ai

である。これを単位元といい e で表す。群 G では e = a1 である。

       a1 a2 a3 a4 a5 a6
--------------------------
a1 | a1 a2 a3 a4 a5 a6
a2 | a2 a3 a1 a6 a4 a5
a3 | a3 a1 a2 a5 a6 a4
a4 | a4 a5 a6 a1 a2 a3
a5 | a5 a6 a4 a3 a1 a2
a6 | a6 a4 a5 a2 a3 a1

2. 逆元

群 G のどの要素についても bai = aib = e となるような要素 b が存在する。このような b を ai の逆元といい、ai-1 で表す。下の演算表で、結合演算の結果が a1 になるような要素のペアは互いに逆元である。

       a1 a2 a3 a4 a5 a6
--------------------------
a1 | a1 a2 a3 a4 a5 a6
a2 | a2 a3 a1 a6 a4 a5
a3 | a3 a1 a2 a5 a6 a4
a4 | a4 a5 a6 a1 a2 a3
a5 | a5 a6 a4 a3 a1 a2
a6 | a6 a4 a5 a2 a3 a1


3. 部分群

群 G の演算表のうち a1, a2, a3 だけの演算表を取り出すと、この演算は {a1, a2, a3} の中で完結しており、単位元と逆元を含んでいる。つまり、集合 g = {a1, a2, a3} も群である。群 g を 群 G の部分群という。

       a1 a2 a3 a4 a5 a6
--------------------------
a1 | a1 a2 a3 a4 a5 a6
a2 | a2 a3 a1 a6 a4 a5
a3 | a3 a1 a2 a5 a6 a4
a4 | a4 a5 a6 a1 a2 a3
a5 | a5 a6 a4 a3 a1 a2
a6 | a6 a4 a5 a2 a3 a1

4. 右剰余類

部分群 g = {a1,a2,a3} と群 G = {a1,a2,a3,a4,a5,a6} の各要素との連結を調べてみると、

a1g = {a1, a2, a3}
a2g = {a2, a3, a1}
a3g = {a3, a1, a2}

のように連結の結果が g に属するものと

a4g = {a4, a5, a6}
a5g = {a5, a6, a4}
a6g = {a6, a4, a5}

のように Gの部分集合 {a4, a5, a6} に属するものに類別される。{a1, a2, a3} と {a4, a5, a6} は共通部分を持たず、また、要素の個数は同数である。つまり、群 G は部分群 g = {a1, a2, a3} によって類別される、つまり、G が {a1, a2, a3} と {a4, a5, a6} という2つの部分集合に分割される。

a4g = {a4, a5, a6} で右剰余類を求めることができるが、a4 はこの類に属するのだろうか、結果を見る限りは属するようである。実際 g = {a1, a2, a3} であり、a1 = e つまり a1 は単位元であるから、a4a1 = a4 である。したがって、a4g で右剰余類を求めるときに a4 はその右剰余類の代表元である。

このとき、類 {a1, a2, a3} と {a4, a5, a6} の代表元を bi とすると、Gの要素は biai で一意的に表せる。例えば a2g = {a1,a2,a3}, a4g = {a4,a5,a6} だから、b1 = a2, b2 = a4 とすると、次のように群 G の全ての要素が {b1, b2} と {a1, a2, a3} の直積で表すことができる。

a1 = a2a3 = b1a3 ... (b1, a3)
a2 = a2a1 = b1a1 ... (b1, a1)
a3 = a2a2 = b1a2 ... (b1, a2)
a4 = a4a1 = b2a1 ... (b2, a1)
a5 = a4a2 = b2a2 ... (b2, a2)
a6 = a4a3 = b2a3 ... (b2, a3)

また、G の演算表からは G の部分群として {a1, a4} がある事がわかる。{a1, a4} の演算表は次のようになるので、これが群であることがわかる。

       a1 a4
------------
a1 | a1 a4
a4 | a4 a1

それでは部分群 h = {a1, a4} による G の右剰余類はどうなるだろうか。

a1h = {a1, a4}
a4h = {a4, a1}

a2h = {a2, a6}
a6h = {a6, a2}

a3h = {a3, a5}
a5h = {a5, a3}

となって、群 G は {a1, a4}, {a2, a6}, {a3, a5} という3つの部分集合に類別される。また、群 G の全ての要素はたとえば {a4, a2, a5} と {a1, a4} の直積で一意的に表される。

5. 要素の位数

群 G の要素 a2 の累乗を調べてみると、a1, a2, a2a2, a2a2a2, a2a2a2a2, a2a2a2a2a2, ... と無限に続けることができるが、実際には上の数列を演算表で評価すると、

a1, a2, a3, a1, a2, a3, ...

のように {a1, a2, a3} の要素が繰り返し出現するだけである。実際、a2 は正三角形を時計回りに120度回転させる操作だったから、3回回転させると元のホームポジションに戻ってしまう。a2 という操作を続けても、正三角形はだたぐるぐる回るだけだ。このような場合には、要素 a2 の位数は 3 であるという。また {a1, a2, a3} は群 G の部分群である。

要素 a4 の場合は、
a1, a4, a4a4, a4a4a4, a4a4a4a4, ... = a1, a4, a1, a4, a1, a4, ...

なので a4 の位数は 2 で部分群は {a1, a4} である。a4 は三角形を裏返す操作だから、裏返したものをまた裏返すと元に戻ってしまう。つまり何もしない操作 a1 と同じになる。こうして a4 という操作を繰り返すと三角形は裏になったり表になったりを繰り返すことになる。

6. 準同型写像

群 G = {a1, a2, a3, a4, a5, a6} と群 H = {b1, b2} はどちらも集合だ。したがって、集合 G から集合 g への写像 φを考えることができる。この場合例えば a1 = φ(a2) のようになる。しかし、群 G も群 g も単なる集合ではない。それらには2項演算が定義されており、その2項演算の値は、それぞれの群の要素である。したがって、関数 φ がそれぞれの2項演算を保存してくれればいろいろと便利だ。つまり、

φ(xy) = φ(x)φ(y)

になって欲しい。つまり、群 G の要素 xy の積を先にとり、それをφで群 g に写像した φ(xy) と、群 G の要素 x, y のファイによる群 g への写像、すなわち、φ(x) と φ(y) の積 φ(x)φ(y) が一致して欲しい。手続き的な表現をすると、先に掛けて写像しても、写像してから掛けても結果が同じになってほしい。

このような写像を準同型写像というが、群 G と 群 g の間にも準同型写像 φ を定義することができる。具体的には次のような対応関係でφを定義する。

b1 = φ(a1)
b1 = φ(a2)
b1 = φ(a3)

b2 = φ(a4)
b2 = φ(a5)
b2 = φ(a6)

これは集合 G から集合 H への多対1対応だ。問題はこれに上に述べたような演算の保存があるかどうかということだ。そこで、群 G と群 H の演算表を調べてみる。

       a1 a2 a3 a4 a5 a6
--------------------------
a1 | a1 a2 a3 a4 a5 a6
a2 | a2 a3 a1 a6 a4 a5
a3 | a3 a1 a2 a5 a6 a4
a4 | a4 a5 a6 a1 a2 a3
a5 | a5 a6 a4 a3 a1 a2
a6 | a6 a4 a5 a2 a3 a1

       b1 b2
------------
b1 | b1 b2
b2 | b2 b1

群G の2項演算と群 H の2項演算の間には何の関連性も必要ない。しかしφを上に述べたように定義すると、

φ(a2a3) = φ(a1) = b1, φ(a2)φ(a3) = b1b1 = b1 ゆえに φ(a2a3) = φ(a2)φ(a3)
φ(a3a5) = φ(a6) = b2, φ(a3)φ(a5) = b1b2 = b2 ゆえに φ(a3a5) = φ(a3)φ(a5)

群 G は元々正三角形の重ね合わせの操作の群であるから、三角形の回転と反転の操作を含んでいる。しかし、φ によって群 H への準同型写像が存在するということは、群 H は群 G の中の反転の操作のみを抽出しているとも言える。準同型写像の意味は単に2項演算を保存する多対1の写像であるが、実例ではそれ特有の意味付けができるところが面白い。

7. 自己同型群

群 G と群 H の準同型写像は一般には多対1の写像だが、群 G と群 H の写像が1対1対応だと、同型写像になる。このとき、群 G と群 H は同型となり、演算の意味付けは異なっても演算の構造が同じことを示している。このような同型写像は群それ自身にも作ることができる。例えば G = {a1,a2,a3,a4,a5,a6} の個々の要素に対し、a1 = φ(a2), a2 = φ(a3), a3 = φ(a4), a4 = φ(a5), a5 = φ(a6), a6 = φ(a1) というような写像を考えると、この写像は群 G の自己同型写像となる。また、この写像は a1, ..., a6 の置換のひとつと考えられるから群 G に対し考えられる限りの置換 φ1, φ2, ..., φ6 を考えると集合 {φ1, φ2, ... , φ6} は置換の結合についての群になる。これを自己同型群という。


8. まとめ

上で述べたような議論は、三角形を台紙の三角枠に重ねるパズルを出発点にしているが、次第に操作の連結の演算表を用いた議論へと移ってゆき、三角形の回転や反転などの性質が見えにくくなってくる。つまり、三角形の移動という具体的な操作が、演算表に抽象化されることで、群という操作の集合の話に抽象化されるからだ。演算表の考察になると、それが三角形の対称移動であるかどうかはもはや問題ではなく、操作の連結という2項演算をもった、操作の集合の話になってしまう。

しかしながら、それが抽象的な議論であるために、右剰余類による類別のような結果は、三角形の対称移動にかかわらず様々な操作の集合である群に共通する性質であることがわかる。

とはいえ、G の部分群 {a1, a2, a3} が三角形の回転の性質であることや、部分群 {a1, a4} が三角形の反転の性質であることを知れば、いろいろな部分群の性質の特徴が見えてくる。抽象と具象は互いに補いあいその理解を深める性質のものだ。

ここに述べたことは群論のほんの入口で、だんだんと面白くなっていく。したがって、この記事だけを読んでも群論の勉強にはならない。しかし、三角形のパズルから出発して、抽象性の高い群論に取っ掛かりをつけることができたのではないかと思う。言いたかったのは、一旦抽象概念の具体的なイメージができてしまえば、それらの議論を追いかけるのが随分楽になるということだ。
# by tnomura9 | 2015-06-04 20:33 | 考えるということ | Comments(0)

操作の結合

前回紹介した三角形のパズルで三角片を動かす方法は何通りあるだろうか。

1. 操作の種類

ホームポジション [1,2,3] に置かれた三角片をたとえば時計方向に120度回転したときのことを考えてみる。この操作によってホームポジションから移動したときの三角片の位置は [2,3,1] なので、三角片を120度回転させる操作は (2,3,1) で表される。

このとき三角片のホームポジションの頂点 1 は 頂点 2 に、頂点 2 は頂点 3 に、頂点 3 は頂点 1 で置き換えられる。見方を変えれば、(2,3,1) という操作は、現在の位置の三角片の頂点をそれぞれ 1->2, 2->3, 3->1 に置き換える操作であると考えることができる。

ホームポジションから三角片を移動させるやり方は次の6通りがある。

a1 : (1,2,3) .... 三角片を全く動かさない操作。
a2 : (2,3,1) .... 三角片を時計回りに 120 度回転させる操作。
a3 : (3,2,1) .... 三角片を時計回りに 240 度回転させる操作。
a4 : (1,3,2) .... 三角片を裏返す操作。
a5 : (2,1,3) .... 三角片を 120 度回転したあと裏返す操作。
a6 : (3,1,2) .... 三角片を 240 度回転したあと裏返す操作。

三角片を動かす操作はこの6通りしかない。三角片を動かしたときの位置は、ホームポジションの三角片の頂点を置き換えたときの結果と同じだから、[1,2,3] の置換は 3! = 6 通りしかないからだ。

この6つの操作を要素とする集合 G = {a1, a2, a3, a4, a5, a6} には次に述べる操作の連結という二項演算が定義できて、それは群の条件を満たす。すなわち、G は群である。

2. 操作の連結

操作とは、三角片の頂点を置換することだとい考え方を使えば (2,3,1) という操作をホームポジション以外の三角片にも作用させたときの三角片の位置を計算できる。

たとえば、ホームポジションに置いた三角片に操作 (3,2,1) を作用させると三角片の位置は [2,3,1] になるが、これにさらに (2,3,1) を作用させたらどうなるだろうか。これは 1->2, 2->3, 3->1 という置き換えを [2,3,1] の位置にある三角片について行えばいい。ホームポジションの三角片が操作 (2,3,1) を作用させるたびにどのようになっていくかはつぎのようになる。

[1,2,3] -> [2,3,1] -> [3,1,2]

これは三角片を実際にホームポジションから120度時計方向に回転させたときと、その位置からさらに 120 度回転させたときの、三角片の頂点の位置を記録することで確認できる。

(2,3,1) を続けて2回ホームポジションの三角片に作用させた結果は [3,2,1] なので、これはホームポジションの三角片を240度回転させる操作 (3,1,2) と一致する。すなわち、操作 (2,3,1) と 操作 (2,3,1) の連結が操作 (3,1,2) であることを示している。すなわち、

(2,3,1) * (2,3,1) = (3,1,2)

である。三角片に操作を2回作用させることが別の操作と等しくなるから、操作の連結という二項演算を考えることができる。

上に述べた a1 ... a6 の操作を2つづつ組み合わせて結合したらどのような結果になるかは、三角形のパズルの三角片を実際に動かしてみればわかる。しかし、三角片を動かす操作が、三角片の頂点の置換であるというもう一つの面を利用すれば、操作の結合がコンピュータで計算できる。

次の op は Haskell でプログラムした操作の結合を計算するプログラムである。

Prelude> let op (a1,a2,a3) (b1,b2,b3) = let c = [0,b1,b2,b3] in ((c!!a1),(c!!a2),(c!!a3))

まず三角片を全く動かさない操作 a1 と a1 の連結を計算してみる。これは a1a1=a1 となるはずだ。
Prelude> op (1,2,3) (1,2,3)
(1,2,3)

次に a1 と 三角片を120度回転する操作 a2 との連結を計算する。これは a1a2 = a2 となるはずだ。
Prelude> op (1,2,3) (2,3,1)
(2,3,1)

最後に a2 と a2 の連結を計算する。これは結局三角片を 240 度回転する操作 a3 と一致する。
Prelude> op (2,3,1) (2,3,1)
(3,1,2)

ただし、正三角形の反転と (2,3,1) の連結では (2,3,1) は時計方向の回転にはならない。次の操作は、正三角形を反転した後、反時計方向に回転した場合の操作になる。

*D3> op (1,3,2) (2,3,1)
(2,1,3)

(2,3,1) は表の三角形を時計方向に120度回転する操作であるので、三角形の裏が見えるときは逆に反時計方向に回転する操作になるからだ。

(2,3,1) は三角形の表が見えている場合と裏が見えている場合では意味合いがことなるので、注意が必要だ。

3. 演算表

op 演算子で a1..a5 のすべての組み合わせを計算してもいいのだが、map 関数を使うと、a1.. a6 のうちの一つと g = [a1,a2,a3,a4,a5,a6] のリストの操作との結合を一度に計算できる。

まず、a1 .. a5 のすべての操作を要素とするリスト g を作成する。
Prelude> let g = [(1,2,3),(2,3,1),(3,1,2),(1,3,2),(2,1,3),(3,2,1)]

次に、a1 と g の要素との連結をすべて計算する。a1 という操作は三角片をまったく動かさない操作なので、その結果は g と同じになる。
Prelude> map (op (1,2,3)) g
[(1,2,3),(2,3,1),(3,1,2),(1,3,2),(2,1,3),(3,2,1)]

今度は a2 と g の要素との連結を計算する。さっきの場合と違って、結果が同じになるのは a1 との連結だけで、その他は連結の結果は変化する。しかし、それらはすべて a1 .. a5 のどれかと一致している。また、連結の結果が同じになることはなく、結果的に a1 .. a5 のすべてが1回づつ現れる。
Prelude> map (op (2,3,1)) g
[(2,3,1),(3,1,2),(1,2,3),(3,2,1),(1,3,2),(2,1,3)]

a3,a4,a5,a6 と g の要素との連結の結果も計算できる。
Prelude> map (op (3,1,2)) g
[(3,1,2),(1,2,3),(2,3,1),(2,1,3),(3,2,1),(1,3,2)]
Prelude> map (op (1,3,2)) g
[(1,3,2),(2,1,3),(3,2,1),(1,2,3),(2,3,1),(3,1,2)]
Prelude> map (op (2,1,3)) g
[(2,1,3),(3,2,1),(1,3,2),(3,1,2),(1,2,3),(2,3,1)]
Prelude> map (op (3,2,1)) g
[(3,2,1),(1,3,2),(2,1,3),(2,3,1),(3,1,2),(1,2,3)]

この結果から群 G の要素の連結についての演算表を作成することができる。

     a1 a2 a3 a4 a5 a6
--------------------------
a1 | a1 a2 a3 a4 a5 a6
a2 | a2 a3 a1 a6 a4 a5
a3 | a3 a1 a2 a5 a6 a4
a4 | a4 a5 a6 a1 a2 a3
a5 | a5 a6 a4 a3 a1 a2
a6 | a6 a4 a5 a2 a3 a1

4. まとめ

正三角形をもとの三角形に重なるように移動する操作では、三角形の頂点3つ全てが同時に置き換わる。すなわち、頂点の数 1,2,3 について考えると、これは数の置き換えすなわち置換であることがわかる。また、三角形の移動を続けるという操作の連結は、置換の連結に置き換えることができ、コンピュータで簡単に計算することができる。

群の要素である操作という目に見えない機能は、実際に三角形を動かすことで直感的に把握できる。また、その操作が実は 1,2,3 という数の置換であるということが理解できると、連結の演算表を自動的に計算できるようになる。実際有限群はすべて数値の置換である対称群 Sn の部分群と同型なので Sn の振る舞いを調べればすべての有限群の性質を理解することができる。
# by tnomura9 | 2015-06-03 23:41 | 考えるということ | Comments(0)