Полукольцо с единицей
Полукольцо с единицей - это полукольцо, в котором существует нейтральный элемент по умножению (называемый единицей): \(\exists 1 \in S \quad \forall a \in S \quad a * 1 = 1 * a = a\).
Для полукольца с единицей должны соблюдаться все законы полукольца:
- Замыкание сложения (closure): для \(\forall x, y \in S\) выполняется \(x + y \in S\).
- Ассоциативность сложения (associativity): для \(\forall x, y, z \in S\) выполняется \((x + y) + z = x + (y + z)\).
- Существование нулевого элемента: существует \(\exists 0 \in S\) такой, что для \(\forall x \in S\) выполняется \(0 + x = x + 0 = x\)
- Коммутативность сложения (commutative): для \(\forall x, y \in S\) выполняется \(x + y = y + x\).
- Замыкание умножения (closure): для \(\forall x, y \in S\) выполняется \(x * y \in S\).
- Ассоциативность умножения (associativity): для \(\forall x, y, z \in S\) выполняется \((x * y) * z = x * (y * z)\).
- Дистрибутивность (distributivus, распределительный закон): для \(\forall x, y, z \in S\) выполняется \(x * (y + z) = x * y + x * z\) и \((x + y) * z = x * z + y * z\).
- Мультипликативное свойство нуля: \(a * 0 = 0 * a = 0\)
, а также закон тождественности по умножению:
- Существование единичного элемента: \(\exists 1 \in S \quad \forall x \in S \quad x * 1 = 1 * x = x\)
Код
trait Rig[A] extends Semiring[A]:
def one: A
Законы
- Законы полукольца
-
Проверка существования единичного элемента.
Единичный элемент (
su.one) — это такой элемент, который при умножении на любой другой элементxне изменяет его значение. Это можно выразить двумя способами:- Если умножить
xна единичный элемент (su.one), результат будет равенx:su.times(x, su.one) == x - Если умножить единичный элемент (
su.one) наx, результат также будет равенx:su.times(su.one, x) == x
- Если умножить
Схема
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 Rig~A~{
+one() A
}
Semiring <|-- Rig
Реализация в библиотеках
Реализация в Spire
Rig[A] обеспечивает +, zero, * и one.
Rig[A] расширяет Semiring[A] и MultiplicativeMonoid[A].
zero: аддитивное тождествоone: мультипликативное тождество (такой элемент, что для любогоxиз множестваx * one = x)
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
Ссылки: