Полукольцо с единицей

Полукольцо с единицей — это полукольцо, в котором существует нейтральный элемент относительно операции умножения. Этот элемент называется единицей и обозначается обычно как \(1\).

Определение полукольца с единицей

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

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

Примеры полуколец с единицей

Зачем нужны полукольца с единицей?

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

Отличие полукольца с единицей от полукольца

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

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

Полукольцо с единицей - это полукольцо, в котором существует нейтральный элемент по умножению (называемый единицей): \(\exists 1 \in S \quad \forall a \in S \quad a * 1 = 1 * a = a\).

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

, а также закон тождественности по умножению:

Код

trait SemiringWithUnity[A] extends Semiring[A]:
  def one: A

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

(Z, +, *)

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

Законы

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

def checkRightTimesIdentity[A](x: A)(using
    su: SemiringWithUnity[A]
): ValidatedNel[String, Unit] =
  Either.cond[String, Unit](
    su.times(x, su.one) == x,
    (),
    "Не соблюдается существование единичного элемента справа: x * 1 = x"
  ).toValidatedNel

def checkLeftTimesIdentity[A](x: A)(using
    su: SemiringWithUnity[A]
): ValidatedNel[String, Unit] =
  Either.cond[String, Unit](
    su.times(su.one, x) == x,
    (),
    "Не соблюдается существование единичного элемента слева: 1 * x = 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 SemiringWithUnity~A~{
        +one() A
    }
    Semiring <|-- SemiringWithUnity

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

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

import spire.algebra.Rig
import spire.math.Rational

Rig.plus(Rational(1, 2), Rational(1, 3))
// val res0: spire.math.Rational = 5/6
Rig.times(Rational(1, 2), Rational(1, 3))
// val res1: spire.math.Rational = 1/6
Rig.pow(Rational(1, 2), 3)
// val res2: spire.math.Rational = 1/8
Rig.zero[Rational]
// val res3: spire.math.Rational = 0
Rig.one[Rational]
// val res4: spire.math.Rational = 1

Ссылки: