Поле

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

Определение поля

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

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

Примеры полей

Свойства полей

Зачем нужны поля?

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

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

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

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>\), если выполнены следующие аксиомы:

Код

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

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

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

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

Законы

Законы наследуются от Евклидова кольца.

Кроме того:

... // Законы Евклидова кольца

def checkReciprocal[A](x: A)(using fi: Field[A]): ValidatedNel[String, Unit] =
  Either.cond[String, Unit](
    x == fi.empty || fi.times(x, x.reciprocal) == fi.one,
    (),
    "Не соблюдается закон существования обратного по умножению числа: x * x^{-1} = 1"
  ).toValidatedNel

Схема

classDiagram
    class Semigroup~A~{
        +combine(x: A, y: A) A
    }  
    class Monoid~A~{
        +empty() A
    }
    Semigroup <|-- Monoid
    class CommutativeSemigroup~A~
    Semigroup <|-- CommutativeSemigroup  
    class Group~A~{
      +inverse(x: A) A
    }  
    Monoid <|-- Group 
    class CommutativeMonoid~A~
    Monoid <|-- CommutativeMonoid
    CommutativeSemigroup <|-- CommutativeMonoid
    class AbelianGroup~A~
    Group <|-- AbelianGroup
    CommutativeMonoid <|-- AbelianGroup
    class Semiring~A~
    CommutativeMonoid <|-- Semiring
    class MultiplicativeSemigroup~A~{
        +times(x: A, y: A) A
    }
    MultiplicativeSemigroup <|-- Semiring
    Semigroup .. MultiplicativeSemigroup
    class Ring~A~
    AbelianGroup <|-- Ring
    Semiring <|-- Ring
    class CommutativeSemiring~A~
    Semiring <|-- CommutativeSemiring
    class SemiringWithUnity~A~{
        +one() A
    }
    Semiring <|-- SemiringWithUnity
    class CommutativeRing~A~
    Ring <|-- CommutativeRing
    CommutativeSemiring <|-- CommutativeRing
    class RingWithUnity~A~
    Ring <|-- RingWithUnity
    SemiringWithUnity <|-- RingWithUnity
    class CommutativeRingWithUnity~A~
    CommutativeRing <|-- CommutativeRingWithUnity
    RingWithUnity <|-- CommutativeRingWithUnity
    class GCDRing~A~{
        +gcd(x: A, y: A) A
        +lcm(x: A, y: A) A
    }
    CommutativeRingWithUnity <|-- GCDRing
    class EuclideanRing~A~{
        +quot(x: A, y: A) A
        +mod(x: A, y: A) A
    }
    GCDRing <|-- EuclideanRing
    class Field~A~{
        +reciprocal(x: A) A
        +div(x: A, y: A) A
    }
    EuclideanRing <|-- Field

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

Реализация в 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

Ссылки: