beet's soil

競プロのことなど

競技プログラミングのための代数入門

モノイド!(素振り)

なぜ代数をするのか?

代数構造とは、ある性質を持った集合と演算の組に名前をつけたものです。
ある演算そのものに注目するのではなく、より一般にある性質を満たす集合と演算全体に注目することで、その性質を満たすものすべてについての議論を一度に行うことができます。
代数構造はデータ構造とも関連していて、あるデータ構造で扱えるかどうかを代数を用いることで機械的に判定することができます。

例をあげましょう。セグメント木は後述するモノイドを扱うことのできるデータ構造です。
このとき、整数と和や積などの個別の対象がセグメント木で扱えるかどうかをいちいち考える必要はなく、ただ対象がモノイドであるかどうかだけを調べることで判定することができます。

マグマ

集合 M と二項演算 :M×MM の組 (M,) のこと。
くだけて言うと、 M の任意の二つの要素の間の演算が定義されていて、その結果もまた M に含まれるということ。

かなり弱い条件 これを満たしていないと静的型付き言語で実装するのがつらい

マグマではない例:(Z,/)
例えば、 1,2Zであるが 1/2Z であるから、これはマグマではない
また1,0Zであるが、1/0 は定義されていない。

半群

マグマ(M,) であって、結合則を満たすもの
つまり、 任意の a,b,cM に対して、 (ab)c=a(bc) を満たすようなもの
結合則を満たしているとき、単に abc とも表す。

マグマではあるが半群ではない例:(Z,)
例えば、 1,2,3Zであるが (12)3=41(23)=2

モノイド

半群(M,) であって、単位元 eM をもつもの。
単位元とは、任意の aM に対して ae=ea=aを満たすような元のこと。
(厳密には右単位元と左単位元があり、右単位元かつ左単位元であるようなものを単に単位元と呼ぶ)

単位元は存在するなら一意である。
証明: e,eMがともに半群(M,)単位元であると仮定する。
ee=e=e(e'が単位元、eが単位元)であるから、一意である。

半群ではあるがモノイドではない例:(N,min)
もし単位元 eNmin単位元であるとすると、 ee+1Nに対して min(e,e+1)=ee+1 であるから矛盾、従って (N,min) はモノイドではない

セグメント木はモノイドを扱うことができる。
つまり、あるマグマ(M,)が結合的であり単位元をもつなら、それはセグメント木で扱うことができる。
beet-aizu.hatenablog.com

半群からモノイドへの埋め込み

モノイドではない半群(M,)に対して、適当な要素 eMを選び、 集合M=M{e}と演算を以下のように定めると、 (M,)eM単位元とするモノイドとなる。
ab={a          if     b=eb          elif  a=eab     otherwise
例: (N,min) をモノイドに埋め込む
Nに対して、集合M=N{}とすると、 (M,min)単位元とするモノイドになる。
競技プログラミングでは、十分大きなINFをminの単位元として使うことがあるが、それはこの埋め込みの一例になっている。

モノイド(M,) であって、任意の要素について逆元をもつようなもの。
ab=e を満たすとき、bをaの右逆元、aをbの左逆元と呼ぶ。
ただし、群においては左逆元と右逆元は一致し、単に逆元という。
証明: ab=e,bc=eとする
abc=(ab)c=ec=c
abc=a(bc)=ae=a

特に、単位元e の逆元は単位元eである。
aの逆元を a1と表す。

累積和は群を扱うことができる。
s(x)をx-1までの累積和として、半開区間 [l,r)に対し f(l,r)=s(l)1s(r) とすればよい。
概略:
(ab)1=(ab)1e=(ab)1(aea1)=(ab)1(abb1a1)=(ab)1(ab)(b1a1)=((ab)1(ab))(b1a1)=e(b1a1)=b1a1

アーベル群

(M,) であって、可換則を満たすようなもの。
つまり、任意の a,bM に対して、 ab=ba を満たすようなもの。

群ではあるがアーベル群ではない例 :二次正則行列とその積
例えば、
(1110)(1101)=(1211)
であるが、
(1101)(1110)=(2110)
であるから、可換ではない。

Binary Indexed Treeはアーベル群を扱うことができる。

TODO: 書く

整域