Don't Repeat Yourself

Don't Repeat Yourself (DRY) is a principle of software development aimed at reducing repetition of all kinds. -- wikipedia

群、モノイド、半群

数学を勉強している最中に話が出てきたので、少しまとめておこうと思います。理解に誤りがあったら教えて下さい🙇‍♀️ なお、私はモノイドやモナドといった言葉は、その成立条件について Functional Programming in Scala などの本でさらっと理解しています。一方で数学的な意味として一体どのようなものがあるのかなあということが気になって調べたという背景です。

群とは

群とは、集合 G とそこで定義される2項演算 x△y を組み合わせた代数系 (G, △) が、次の3つの条件 (群の公理) を満たすものです。補足ですが、△にはたとえば「+」のような演算が入ります。

  1. 結合法則: x△(y△z) = (x△y)△z
  2. 単位元をもつこと: x△e = e△x = x となる e をもつこと
  3. 逆元をもつこと: x△y=y△x=e となる要素 y をもつこと

ちなみに、参照した本では直前に「演算が閉じていること」を書いてあったのですが、3つの条件さえ満たせばいいよ、と書いてありました。が、ネットで改めて調べてみると、「演算が閉じていること」も条件に含まれそうな気がします。なので書き直すと、下記のようになるかと思います。

  1. 集合 G に対して一意的な演算 (△) が成り立ち、かつその演算に関して集合 G は閉じている。
  2. (下記、そのような演算に対して) 結合法則: x△(y△z) = (x△y)△z
  3. 単位元をもつこと: x△e = e△x = x となる e をもつこと
  4. 逆元をもつこと: x△y=y△x=e となる要素 y をもつこと

モノイドとは

モノイドは実際のところ、「1. 演算が集合内に閉じていること」「2. 結合法則」と「3. 単位元をもつこと」を満たす存在でしたね。なので、群よりかは少し「弱い」存在です。

半群とは

半群は、英語では Semigroup というそうです。私は cats の中でこの単語を見たことがありました。

半群は、「1. 演算が集合内に閉じていること」「2. 結合法則」を満たす存在です。なので、やはり群よりは「弱い」存在で、かつモノイドよりも「弱い」存在です。

余談) マグマ

調べていたら、「1. 演算が集合内に閉じていること」を満たす存在にも名前があるようです。マグマ (Magma) というそうです。勉強になりました。ブルバキが導入した用語なんですね。私はブルバキは聞いたことがあるぞ。

さらに余談) 群は加算のことである…?

ネットの記事を読んでいると、群は「加算 (+) のことである」と定義する記事をたまに読みます。しかし、これは前提条件が抜けていると思います。こう書くときに乗算を含まないのは、乗算の逆元を整数 Z の限りでは定義できないからです。しかし、有理数 Q まで拡張すれば、乗算の逆元は定義可能になります。乗算の単位元 e は 1 ですが、a * 1/a = 1/a * a = 1となるためです。したがって、「群は加算のことである」というテクストは、半分正解で半分誤りの可能性があるため、「整数の範囲で」「群は加算のことである」と説明するのが正しいのかなと思いました。

参考