scalabook

Форк
0
91 строка · 3.8 Кб

Кольцо

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

Кольцо (Ring) - это полукольцо, являющееся абелевой группой по сложению.

Учитывая множество R

и операции +
и *
, мы говорим, что (R, +, *)
- это кольцо, если оно удовлетворяет следующим свойствам:

  • (R, +)
    является абелевой группой
  • Для любых x
    и y ∈ R
    : x * y ∈ R
    .
  • Для любых x
    , y
    и z ∈ R
    : (x * y) * z = x * (y * z)
    .
  • Для любых x
    , y
    и z ∈ R
    : x * (y + z) = x * y + x * z
    и (x + y) * z = x * z + y * z
    .

Законы кольца:

  • Замыкание сложения (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\).

Определение в виде кода на Scala

trait Ring[A] extends AbGroup[A], Semiring[A]

Законы в виде кода на Scala

trait RingLaw extends AbGroupLaw, SemiringLaw:
def checkRingLaw[A: Ring](x: A, y: A, z: A): ValidatedNel[String, Unit] =
checkAbGroupLaw(x, y, z) combine
checkSemiringLaw(x, y, z)

Примеры

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

(Z, +, *)

given Ring[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.Rng
import spire.math.Rational
Rng.plus(Rational(1, 2), Rational(1, 3))
// val res0: spire.math.Rational = 5/6
Rng.times(Rational(1, 2), Rational(1, 3))
// val res1: spire.math.Rational = 1/6
Rng.pow(Rational(1, 2), 3)
// val res2: spire.math.Rational = 1/8
Rng.negate(Rational(1, 2))
// val res3: spire.math.Rational = -1/2
Rng.minus(Rational(1, 2), Rational(1, 3))
// val res4: spire.math.Rational = 1/6
Rng.zero[Rational]
// val res5: spire.math.Rational = 0

Ссылки:

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.