Группа

Моноиды, как базовые алгебраические структуры, представляют собой упорядоченные множества с одной ассоциативной операцией и нейтральным элементом. Они служат фундаментом для изучения более сложных структур, таких как группы, которые являются естественным продолжением и расширением моноидов. Группы добавляют к свойствам моноидов ключевое условие — существование обратного элемента для каждого элемента множества. Это позволяет группам обладать более богатым набором свойств и находить применение в широком спектре областей, от теории чисел и геометрии до физики и криптографии.

Что такое группа?

Группа — это алгебраическая структура, которая формализует понятие симметрии и операции, подчиняющейся определенным правилам. Формально, группа определяется как множество \(G\), на котором задана бинарная операция \(\cdot\) (называемая "умножением" или "групповой операцией"), удовлетворяющая четырем аксиомам:

Примеры групп

Важные свойства групп

Формальное определение

Группа G — это моноид с обратным \(g^{-1}\) для каждого элемента g.

Множество \(G\) с заданной на нём бинарной операцией +: \(G \times G \to G\) называется группой \((G, +)\), если выполнены следующие аксиомы:

Код

trait Group[A] extends Monoid[A]:
  extension (a: A) 
    def inverse: A

Числа относительно сложения с 0

given Group[Int] with
  val empty: Int                      = 0
  def combine(x: Int, y: Int): Int    = x + y
  extension (a: Int) def inverse: Int = -a

Рациональные числа относительно умножения

В упрощенном варианте группа для рациональных чисел будет выглядеть так:

final case class Rational(n: Int, d: Int):
  def *(that: Rational): Rational =
    Rational(n * that.n, d * that.d)

given Group[Rational] with
  val empty: Rational                             = Rational(1, 1)
  def combine(x: Rational, y: Rational): Rational = x * y
  extension (a: Rational) def inverse: Rational   = Rational(a.d, a.n)

Законы групп

... // Законы моноида

def checkInverse[A](x: A)(using
    g: Group[A]
): ValidatedNel[String, Unit] =
  Either.cond[String, Unit](
    g.combine(x.inverse, x) == g.empty &&
      g.combine(x, x.inverse) == g.empty,
    (),
    "Не соблюдается обратимость: x + (-x) = (-x) + x = e"
  ).toValidatedNel

Схема

classDiagram
    class Semigroup~A~{
        +combine(x: A, y: A) A
    }  
    class Monoid~A~{
        +empty() A
    }
    Semigroup <|-- Monoid
    class Group~A~{
      +inverse(x: A) A
    }  
    Monoid <|-- Group 

Реализация в библиотеках

Реализация в Cats

import cats.*
import cats.syntax.all.*

1.inverse()       // -1
1 |+| 1.inverse() // 0

Реализация в Spire

import spire.algebra.Group
import spire.syntax.group.*

1.inverse       // -1
1 |+| 1.inverse // 0

Ссылки: