scalabook
Коммутативное кольцо
Формальное определение
Коммутативное кольцо - кольцо, коммутативное относительно умножения.
Для коммутативного кольца должны соблюдаться все законы кольца:
- Замыкание сложения (closure): для \(\forall x, y \in R\) выполняется \(x + y \in R\).
- Ассоциативность сложения (associativity): для \(\forall x, y, z \in R\) выполняется \((x + y) + z = x + (y + z)\).
- Существование нулевого элемента: существует \(\exists 0 \in R\) такой, что для \(\forall x \in R\) выполняется \(0 + x = x + 0 = x\)
- Обратимость сложения: для \(\forall x \in R\) существует \((-x)\) такой, что \(x + (-x) = (-x) + x = 0\)
- Коммутативность сложения (commutative): для \(\forall x, y \in R\) выполняется \(x + y = y + x\).
- Замыкание умножения (closure): для \(\forall x, y \in R\) выполняется \(x * y \in R\).
- Ассоциативность умножения (associativity): для \(\forall x, y, z \in R\) выполняется \((x * y) * z = x * (y * z)\).
- Дистрибутивность (distributivus, распределительный закон): для \(\forall x, y, z \in R\) выполняется \(x * (y + z) = x * y + x * z\) и \((x + y) * z = x * z + y * z\).
, а также закон коммутативности умножения:
- Коммутативность умножения: для \(\forall x, y \in R\) выполняется \(x * y = y * x\).
Определение в виде кода на Scala
trait CRing[A] extends Ring[A]
Законы в виде кода на Scala
trait CRingLaw extends RingLaw: def checkCRingLaw[A: CRing](x: A, y: A, z: A): ValidatedNel[String, Unit] = checkRingLaw(x, y, z) combine check( CRing[A].times(x, y) == CRing[A].times(y, x), "times commutative: x * y = y * x" )
Примеры
Числа относительно сложения с 0 и умножения
(Z, +, *)
given CRing[Int] with val empty = 0 def combine(x: Int, y: Int): Int = x + y def times(x: Int, y: Int): Int = x * y extension (a: Int) override def inverse: Int = -a
Реализация
Реализация в Spire
import spire.algebra.CRingimport spire.math.Rational
CRing.plus(Rational(1, 2), Rational(1, 3))// val res0: spire.math.Rational = 5/6CRing.times(Rational(1, 2), Rational(1, 3))// val res1: spire.math.Rational = 1/6CRing.pow(Rational(1, 2), 3)// val res2: spire.math.Rational = 1/8CRing.negate(Rational(1, 2))// val res3: spire.math.Rational = -1/2CRing.minus(Rational(1, 2), Rational(1, 3))// val res4: spire.math.Rational = 1/6CRing.zero[Rational]// val res5: spire.math.Rational = 0
Ссылки: