環と半環の項目をwikipediaで読んでみた


はじめに

purescriptを勉強している途中で少し環と半環をwikipediaで読んでみた。前提として、環や半環の前提知識はない。本日1時間ぶり2投稿目。

半環

読む(環)

環とは、集合 R とその上の二つの二項演算、加法 +: R × R → R および乗法 ∗: R × R → R の組 (R,+,∗) で、「環の公理系」と呼ばれる以下の条件を満たすものを言う(環の公理系にはいくつか異なる流儀があるが、それについては後で触れる)。

コメント: 半環の方では集合はGだったので勝手にRに変えないで欲しい。以後、引用以外はGと書く。

加法群

(R, +) はアーベル群である

加法に関して閉じている: 任意の a, b ∈ R に対して a + b ∈ R が成り立つ。
加法の結合性: 任意の a, b, c ∈ R に対して (a + b) + c = a + (b + c) が成り立つ。
加法単位元(零元)の存在:如何なる a ∈ R に対しても共通して 0 + a = a + 0 = a を満たす 0 ∈ R が存在する。
加法逆元(反元、マイナス元)の存在: 各 a ∈ R ごとに a + b = b + a = 0 を満たす b ∈ R が存在する。
加法の可換性: 任意の a, b ∈ R に対して a + b = b + a が成立する。

乗法半群

(R,∗) はモノイド(あるいは半群)である

乗法に関して閉じている: 任意の a, b ∈ R に対して a ∗ b ∈ R が成り立つ。
乗法の結合性:任意の a, b, c ∈ R に対して (a ∗ b)∗ c = a ∗(b ∗ c) が成立する。
乗法に関する単位元を持つ[注 1]。

分配律

乗法は加法の上に分配的である

左分配律: 任意の a, b, c ∈ R に対して a ∗(b + c) = (a ∗ b) + (a ∗ c) が成り立つ。
右分配律: 任意の a, b, c ∈ R に対して (a + b)∗ c = (a ∗ c) + (b ∗ c) が成り立つ。

なるほど?

アーベル群とは群のときにやった、(G,μ)=(実数,足し算)や(0以外の実数,掛け算)みたいなやつのこと。

1つのアーベル群に対して定まる演算は1つだけだったけど、環は1つの集合に対して足し算、掛け算の2演算と、それに加えて足し算と掛け算の間の関係にもいつもの関係(分配法則)が成り立つ条件が追加された感じかな。確かに分配法則などは演算1つじゃ考えられない概念だ。

(3+5)2=3*2+5*2とか、2(3+5)=2*3+2*5みたいな。

具体例としては、(G,+,*)=(有理数, 足し算, 掛け算)や(実数, 足し算, 掛け算)や(複素数, 足し算, 掛け算)がまずあるらしい。まあ何となく分かる。それ以上の例はちょっと今は追わない。。けど、要はとある環を定めるには、

  • 集合
  • a+b=b+aが成立する足し算と、足し算における0っぽいやつ、-aっぽいやつ。
  • a*b=b*aが成立するとは限らない掛け算と掛け算における1っぽいやつ(1/aはいらない)
  • 足し算と掛け算の自然な関係

あたりがあれば良いんだろう多分。一旦おしまい。

読む(半環)

定義を読む。

A: (R, +) は単位元 0 を持つ可換モノイドを成す:
B: (R, ·) は単位元 1 を持つモノイドを成す:
C: 乗法は加法の上に分配的である:
D: 0-倍は R を零化する:

コメント: なるほど。ほぼほぼ環かな?Dは分からないけど、Cは分配法則のことやんな?

A

(a + b) + c = a + (b + c),
0 + a = a + 0 = a,
a + b = b + a.

B

(a · b)· c = a ·(b · c),
1 · a = a · 1 = a.

C

a ·(b + c) = (a · b) + (a · c),
(a + b)· c = (a · c) + (b · c).

D

0 · a = a · 0 = 0.
この0ってのは足し算での単位元ってのが群の方で勉強した内容と比べて目新しいんやな。

以上より、半環が環とは異なる点はその加法が単に可換モノイドであればよく、可換群を成すことまでは要求されないことであると言える。

https://qiita.com/tetz-akaneya/items/ee6388753bc223ea974e
によると、

結合法則と単位元と逆元と交換法則=>アーベル群(可換群)
結合法則と単位元と交換法則=>可換モノイド(足し算をイメージ。-aはない。)

らしいので要は、足し算について逆元(5に対する-5っぽいやつ)があれば環、なければ半環ってことかな。

一旦ここまで。

purescript

Semiring(半環)のクラス定義は下記

class Semiring a where
  add  :: a -> a -> a
  zero :: a
  mul  :: a -> a -> a
  one  :: a

要は集合、足し算、掛け算、0、1の定義を求めているわけだが、半環の構成要素は下記であるからバッチリ今回勉強したことと合う。

  • 集合
  • 足し算、足し算における単位元(0)(環だとこれに加えて逆元-aが必要になるので、半環なのが大事なんやな)
  • 掛け算、掛け算における単位元(1)

typescriptで書くと、

interface Semiring<T> {
  add: (a: T) => (b: T) => T
  zero: T
  mul: (a: T) => (b: T) => T
  one: T
}

みたいな感じかな。

感想

環の世界での足し算や掛け算は本当に足し算や掛け算とは限らないので思い込みは危険だけど、とはいえそういう思い込みを作っていかないとイメージしずらいので辛い。こうやって書く側も、なんでわかりにくく書くんだって思われて辛い。