しかし,例えば,計算機科学専攻で, 集合論などの基礎的な数学的知識はあっても,数学について十分な訓練を 受けていない場合は,ここで 出てくる諸概念を理解するのは難しいかもしれません.実は,私自身もそうです. 集合論の初歩や簡単な群論の知識はあっても,次々に出てくる 代数学の抽象概念に翻弄されてしまいます.
ここではいくつかの基本的な概念を 私なりに解説して,この本や,あるいは,他の半群に関する本を読むための一助と していただけたらと思います.
したがって,数学科の3年生以上まで苦痛に耐えた人たちや,痛みに麻痺している 人たちは,このドキュメントは 読む必要はありません.ここの説明は,かなり私の感覚に寄って説明していますし, また,(私の)既存知識の体系の中で定着するように計算機科学など他の概念との 関連も書いています.これと合わないと,もしかしたら かえって混乱するかもしれません.その場合も読むのをやめて,難しくても 教科書の内容を一つずつ理解していってください.また,申し訳ありませんが, 集合論の初歩とできれば群論の初歩もどこかほかで勉強しておいてください.
以上を要約すると,半群の概念で冗談を書きますので,付き合える人だけ読んで いってくださいということです.
を満たす要素を idempotent と言います.半群 S の中の idempotents をすべて集めたものをe2 = e*e = e
例えば,e を 半群 S のidempotent とすると,S1 = eSe はモノイドで単位元は e になります.つまり,
S1*S1 = eSe * eSe = e(SeS)e ⊆ eSe
=> S1 = eSe は演算で閉じているので半群
S1=eSe の元はみな e*x*eの形をしている.
ということで eSe は e を単位元とするモノイドになります. ちなみに,idempotent でなくとも,∀y∈S に対して,ySy は半群ですね. これがモノイドになるかどうかが,y が idempotent かどうかに係わっているだけです.
idempotents は,具体的にはどんな要素かと言いますと 変換モノイド Tn (つまり, {1, 2, ..., n} を自分に写すすべての写像の集合を写像の合成でモノイドと 見たもの)での
(1 2 3 4 5)などです(上の数を下の対応する場所の数に写す変換と思ってください). これは {1, 2, 3} については恒等写像で,4 と 5 は {1, 2, 3} の中に 写しています.このように領域を限った中では恒等写像でそれ以外の値はその中に 写される変換が idempotent になります.
(1 2 3 3 2)
これは半群が適当な集合 X を取って, X → X の関数の集合に埋め込めるという Cayley の定理の半群版を考えれば,一般的に成立するということが分かります.つまり, その埋め込みで idempotent e が f : X → X に 写されるとすると,f(f(x)) = f(x) ですから,領域 f(X) ⊆ X に限って言えば,f は恒等写像になるわけです.
(x*y)*(x*y) = (x*y*x)*y = (x*y)となり,idempotent になります.このときの idempotent が単位元に準ずる要素で, y は逆元に準ずる元なんですね.
idempotent は,日本語では,冪等元(べきとうげん)とか巾等元(べきとうげん)と 言うようです.難しい日本語です.でも,もともと,idempotent も ラテン語系の単語なので 難しい単語(しかも後世の造語)なのかもしれません.ちなみに wikipedia を見ると C言語のヘッダファイルを idempotent に作るとは,複数回 include されても,1回だけ include されたのと同じ効果を持つように作ることだそうです.
半群論の後ろの方で,Krohn-Rhodes の定理という,すべての有限半群は,この右ゼロ半群に単位元を加えたモノイドいくつかと群との Wreath Product(直積より少し一般的な積) に分解できるという定理がでてきます.つまり, 有限半群の部品となる重要な半群です.この定理はハードウェア屋さんには,すべての計算回路は組み合わせ回路とフリップフロップ(メモリー)回路を 組み合わせることによって実現できるという形でかなり常識的に身についていると思いますが,ソフトウェア屋さんには忘れ去られているような気がします.Krohn-Rhodes の定理の発表は 1963 年で,当時から,今まで,その 数学的な表現はとっつきにくいですから(Wreath Product が分かりにくいのです).
ごたくはこれくらいにして,どんなものか書きます.
y x | a | b |
a | a | b |
b | a | b |
まったく面白くない半群だと思うでしょう.ところがどっこい,これが結構役にたつのです.最初に言ったように,右ゼロ半群は計算機の分野ではメモリーとして働くのです.つまり,最後に入れた要素が結果として残っているので,これはつまり,最後に入れた値を覚えておくのと同じなわけです. さらに,これを複数個,Wreath Product で組み合わせて使うことにより,最後に掛けた要素だけでなく,最後のいくつかの演算の列,つまり,演算の履歴を表現することができます.この能力が,右ゼロ半群いくつかと群を Wreath Product で組み合わせることで, 任意の半群を埋め込むことができる理由です.
変換半群(適当な集合 X から自分自身への写像のなすモノイドの部分半群)で右ゼロ半群を作るのは 簡単です.例えば,上の半群 {a, b} は,これらを {1, 2} → {1, 2} の関数
a = λx.1とすればできます.ただし,二つの関数 f と g の積 f・g = λx.g(f(x)) とします.
b = λx.2
λx.f(x) は,x を受け取って,f(x) を返す関数を表す.
したがって,λx.1 は何を受け取っても 1 を返す定数関数
皆さんは,これを上に書いた右ゼロ半群のように変換半群で表現できるでしょうか? ここで変換半群で表現するとは,適当に集合 X を決めて, X → X の関数の集合として半群を表すことです.ただし,関数の積は f・g = λx.g(f(x)) とします.したがって, 具体的には次の式を満たすような集合 X と関数 fa : X → X, fb : X → X の 例を作れという問題です.
y
xa b a a a b b b
下にある
解答例をここに書いておきます.
関数はその入力と出力を逆にすると,関数にはならず「関係 (Relation) 」になるのです. これは普段あまり意識しないのですが,関数は矢を逆にしたときのいわゆる 双対が関数にならないので,双対概念が結構もとの概念と違うように見えるのです. 例えば圏論で集合の圏の initial object が空集合唯一なのに対して terminal object は 要素一個の集合すべてです.これが関係の圏ならどちらも空集合になります. この非対称性が関数の面白さでもありますね.
集合として S でなく S1 を使うところがミソです.動かされるものに 1 を入れることによって,異なる s, t に対して fs(1) = s ≠t = ft と なること,つまり,Sの元を忠実に変換することを保証しているのです. この定理を使うことによって,上で書いた左ゼロ半群を作ることができると思います.ケイリー(Cayley)の定理の半群版
S を半群とすると,S は関数のなす半群(実はモノイド)S1 → S1 に埋め込める.ここで,S1 は半群 S に(今無ければ)単位元 1 を追加したものである.この時の対応は s ∈ S に fs = λx.x・s を対応させるものである.
(to fill the rest)
レジスタの値として採用した
モノイドが有限モノイドでしたら,結局は有限オートマトンと同じ表現力しか
ありませんが,無限モノイドを許すと,そのモノイドによって再帰的列挙可能
な言語の族まで受理する言語の族が広がります.
M-Automaton の解説
に, M-Automaton を簡単に説明したものがあります.当面,そちらをご参照ください.
ということで,半群にはいつでも形式的に単位元を加えることができるので, モノイドと半群は実用上それほど区別しなくてよいと思います.
(to fill the rest)
(to fill)
実際,半群Sから0のある半群Tに準同型 h : S -> T があるとすれば,
I = h-1(0)は
h(x*u*y) = h(x)*h(u)*h(y) = h(x)*0*h(y) = 0 for x, y∈S, u∈Iですから,x*u*y∈I ,つまり,SIS⊆Iとなり,Iはイデアルになります.
逆に I がイデアルなら,半群SのIを0につぶした半群(Rees の商半群(factor semigroup) S/I)があり,SからS/Iへの準同型 h でI= h-1(0)のものがあります.
ということで,イデアルは0につぶすことができる要素の集合ですね.
ちなみに束論(lattice theory)でもイデアルは0の逆像です.また,1 の 逆像はフィルター(filter)と言います.超準解析(nonstandard analysis)などで 使うのはこのフィルターのうち,極大なものですね(超準フィルター).
最後に,環論のイデアルは乗法に関しては半群と同じようにゼロ元(zero element)ですが, 加法に関しては単位元(unit)です.加法の単位元というと,あれ? 0ですから やっぱり,0の逆像なんですかね.
イデアルを取り去って,代わりに0を入れます.
Remove the ideal and put the element 0.
Ideal Extension of S by T again
これだけの定義だとなかなかイメージし辛いし,また,何の役に立つか分かりにくいと思います. 何の役に立つかは,例えば,itempotent(e・e = e)のHクラスを取ると群になるなど,群との 繋がりをつける役割を果たしたりします.また,計算機科学との関係で言えば,Hクラスが すべて唯一の要素からなる半群と対応するオートマトンは star-free 言語を受理するといった 定理があります.x L y ⇔ S1・x = S1・y
x R y ⇔ x・S1 = y・S1
x H y ⇔ x L y and x R y
x D y ⇔ ∃z ∈ S x L z R y ⇔ ∃z' ∈ S x R z' L y
(関係 L と R は可換です)
x J y ⇔ S1・x・S1 = S1・y・S1
イメージしにくさを克服する一つの方法としては,いくつかの半群に対して,実際に
それぞれの関係のクラスを計算してみて絵を描いてみるという方法があります.手始めに
変換半群の T3 ({1, 2, 3} からそれ自身への写像すべての集合)に対してやってみるのは
良い方法です.これは wikipedia にも例が載っていますし,
こちらにはさらに推し進めて
のようなペーパークラフトを作ってみるという企画をやってみました.
上の資料の中でも参照していますが,Green の関係の例をさらに2つ載せておきます.
例えば, A.J. Cain の教科書などで,対応する勉強しながらこれらの例を参照してみてください.
(fill the rest)
(to fill the rest)
直積は,複数の半群からそれらを部品として大きな半群を合成した半群です.
S と T を半群とします.このとき直積
(s1, t1)・(s2, t2) := (s1・s2, t1・t2)つまり,S 成分と T 成分で独立に演算を行う演算が定義された半群です. 以下では,S と T が独立ではない演算が入る半群の合成方法が紹介されます.for (s1, t1), (s2, t2) ∈ S × T
Wreath product と semidirect product は初心者には分かりにくいと思います. でも,直積では合成できない半群がたくさんありますから,やっぱり理解しないと いけません.
ここでは直積も含めて,少し掘り下げて理解しておこうと思います.
いま,
A×Bがうまい分解で,Pの中の変換が
でも,
少し正確に記述しましょう.上の図の中の真ん中のもので, (f, g) の組
(f, g) ∈ (A × B → A) × (B → B)に対して,それが表すものを次のように (A × B) → (A × B) の変換として意味づけをします.つまり, (f, g) は (a, b) ∈ (A × B) に対して,(f(a, b), g(b)) を対応させる関数を表すことに するわけです.
このような意味付けをして,(f1, g1), (f2, g2) に対して,次の図のように,これらを関数として合成した結果の (A × B) → (A × B) の関数で演算を定義すれば,関数の合成は 結合法則が成立しますから,半群になります.
このときの (f1, g1) と (f2, g2) の演算の式は次の図のようになります.ここで, λb.g(b) は,b を入力として受け取って,g(b) を返す関数という意味です.
同様に λ(a, b).f(a, b) は (a, b) という値の組を受け取って,f(a, b) という値を返す関数と いう意味です.これらはラムダ記法と呼ばれ,計算機科学でよく使われる記法で,関数を表すのによく使われます. 通常の数学の本では,f(a, b) は,f(a, b) という値を表すのか,(a, b) を受け取って,f(a, b) を 返す関数を表すのか曖昧で,説明文の中でそれらが指示されます.ラムダ記法はそれを明示的に 表す記号です.意外と便利です.
以上をまとめると,(f1, g1), (f2, g2) ∈ (A × B → A) × (B → B) に 対して,
と定義すると,(A × B → A) × (B → B) を半群にすることができます. この半群を(A → A) と (B → B) の Wreath product と言います.(f1, g1)*(f2, g2) := (λ(a, b).f2(f1(a, b), g1(b)), λb.g2(g1(b)))
ここでは,A と B の上の monoids of full transformations に対して Wreath product を 定義しましたが,Wreath product は,任意の二つの半群に対して定義することができます. その前に,上の例を少し整理しましょう.そのためには2つの定義が必要になります.
一つ目は,A × B → A を半群にする演算の定義です.A × B → A は 次の演算で半群になります.
f1, f2 ∈ A × B → A に対して, f1・f2 := λ(a, b).f1(f2(a, b), b)
二つ目は,g ∈ B → B による f ∈ A × B → A への作用の定義です.
gf := λ(a, b).f(a, g(b))
これら2つを使うと,上の (f1, g1)*(f2, g2) の定義式は
のように書き表すことができます.つまり,直積のように要素ごとに演算を行うのではなく, 第2要素は単に演算を行うが,第1要素は,f2 に g1 を作用させてから f1 と演算を 行うという非対称的な定義になります.(f1, g1)*(f2,g2) := (f1・g1f2, g1・g2)
これらの動機付けと準備が終わりましたので,Wreath product の一般的な定義を行います. この定義は,前の定義では必要だった変換される集合は抽象化され合成される半群だけの 言葉で記述されています.
(f1, t1)*(f2, t2) := (f1・t1f2, t1・f2)
ここで t1f1 := λt.f1(t1・t) とする.また・は,それぞれの半群の演算である.
S Wr T は,要素の集合としては T → S と S の直積ですから,要素数は |S||T|・|S| になります.
ちなみに Wreath product は演算を繰り返すと,式がどんどん複雑になっていきます.次に多段の骨格を強調した図を挙げておきます.
(figure emphasize the skeleton of the cascades)