Коммутативное полукольцо

Коммутативное полукольцо — это полукольцо, в котором операция умножения коммутативна.

Определение коммутативного полукольца

Коммутативное полукольцо — это множество \(S\), на котором определены две бинарные операции:

Эти операции должны удовлетворять следующим аксиомам:

Если в полукольце также существует единичный элемент \(1 \in S\) такой, что \(a \cdot 1 = 1 \cdot a = a\) для любого \(a \in S\), то такое полукольцо называется коммутативным полукольцом с единицей.

Примеры коммутативных полуколец

Зачем нужны коммутативные полукольца?

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

Отличие коммутативного полукольца от некоммутативного

Основное отличие заключается в том, что в коммутативном полукольце операция умножения коммутативна, то есть \(a \cdot b = b \cdot a\) для любых \(a, b \in S\). В некоммутативном полукольце это свойство может не выполняться.

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

Коммутативное полукольцо - это полукольцо, с коммутативной операцией умножения: для \(\forall x, y \in S\) выполняется \(x * y = y * x\).

Для полукольца с единицей должны соблюдаться все законы полукольца:

, а также закон коммутативности умножения:

Код

trait CSemiring[A] extends Semiring[A]

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

(Z, +, *)

given CSemiring[Int] with
  val empty: Int                   = 0
  def combine(x: Int, y: Int): Int = x + y
  def times(x: Int, y: Int): Int   = x * y

Законы

... // Законы полукольца

def checkTimesCommutativity[A](x: A, y: A)(using
    cs: CSemiring[A]
): ValidatedNel[String, Unit] =
  Either.cond[String, Unit](
    cs.times(x, y) == cs.times(y, x),
    (),
    "Не соблюдается коммутативность по умножению: x * y = y * x"
  ).toValidatedNel

Схема

classDiagram
    class Semigroup~A~{
        +combine(x: A, y: A) A
    }  
    class Monoid~A~{
        +empty() A
    }
    Semigroup <|-- Monoid
    class CommutativeSemigroup~A~
    Semigroup <|-- CommutativeSemigroup  
    class CommutativeMonoid~A~
    Monoid <|-- CommutativeMonoid
    CommutativeSemigroup <|-- CommutativeMonoid
    class Semiring~A~
    CommutativeMonoid <|-- Semiring
    class MultiplicativeSemigroup~A~{
        +times(x: A, y: A) A
    }
    MultiplicativeSemigroup <|-- Semiring
    Semigroup .. MultiplicativeSemigroup
    class CommutativeSemiring~A~
    Semiring <|-- CommutativeSemiring

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


Ссылки: