Поле

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

Поля расширяют Евклидово кольцо, добавляя операцию обратную умножению для всех элементов, за исключением нуля по сложению.

Field[A] поддерживает следующие операции:

Формально, поле — алгебра над множеством \(\mathbf{F}\), образующая коммутативную группу по сложению \(\mathbf{+}\) над \(\mathbf{F}\) с нейтральным элементом \(\mathbf{0}\) и коммутативную группу по умножению \(\mathbf{*}\) над ненулевыми элементами \(\mathbf{F} \backslash \begin{Bmatrix} \mathbf{0} \end{Bmatrix}\), при выполняющемся свойстве дистрибутивности умножения относительно сложения. Подразумевается также применимость операции \(\mathbf{*}\) к нулевому элементу по сложению с сохранением свойства дистрибутивности на всём множестве \(\mathbf{F}\).

Если раскрыть определение, то множество \(\mathbf{F}\) с введёнными на нём алгебраическими операциями сложения \(\mathbf{+}\) и умножения \(\mathbf{*}\) (\(\mathbf{+}\colon \mathbf{F} \times \mathbf{F} \to \mathbf{F},\mathbf{*}\colon \mathbf{F} \times \mathbf{F} \to \mathbf{F}\), то есть \(\forall a, b \in F \quad (a + b) \in F, (a * b) \in F\) называется полем \(\left< F, +, * \right>\), если выполнены следующие аксиомы:

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

trait Field[A] extends EuclideanRing[A]:
  extension (a: A) def reciprocal: A

  def div(x: A, y: A): A = times(x, y.reciprocal)

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

trait FieldLaw extends EuclideanRingLaw:
  def checkFieldLaw[A: Field](x: A, y: A, z: A): ValidatedNel[String, Unit] =
    checkEuclideanRingLaw(x, y, z) combine
      check(
        x == Field[A].empty || Field[A].times(x, x.reciprocal) == Field[A].one,
        "x * x^{-1} = 1"
      )

Примеры

Рациональные числа со сложением и умножением

import spire.math.Rational

given Field[Rational] with
  val empty: Rational = Rational(0)
  val one: Rational   = Rational(1)
  def combine(x: Rational, y: Rational): Rational = x + y
  def times(x: Rational, y: Rational): Rational = x * y
  def gcd(x: Rational, y: Rational): Rational = one
  def lcm(x: Rational, y: Rational): Rational = times(x, y)
  def quot(x: Rational, y: Rational): Rational = x / y
  def mod(x: Rational, y: Rational): Rational = empty

  extension (a: Rational)
    def inverse: Rational    = Rational(-a.numerator, a.denominator)
    def reciprocal: Rational = Rational(a.denominator, a.numerator)
end given

Реализация

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

import spire.math.Real.apply

15.reciprocal
// val res0: spire.math.Real = 1/15
15 / 3
// val res1: Int = 5
15.24.ceil
// val res2: spire.math.Real = 16
15.24.floor
// val res3: spire.math.Real = 15
15.24.round
// val res4: spire.math.Real = 15

Ссылки: