Поле
Формальное определение
Поля расширяют Евклидово кольцо, добавляя операцию обратную умножению для всех элементов, за исключением нуля по сложению.
Field[A]
поддерживает следующие операции:
reciprocal
(a.reciprocal
): обратная операция умножению. Мультипликативный обратныйa
, т.е.one/a
.div
(/
,a / b
): делениеa
наb
.
Формально, поле — алгебра над множеством \(\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>\), если выполнены следующие аксиомы:
- Ассоциативность сложения: для \(\forall x, y, z \in F\) выполняется \((x + y) + z = x + (y + z)\).
- Существование нулевого элемента: существует \(\exists 0 \in F\) такой, что для \(\forall x \in F\) выполняется \(0 + x = x + 0 = x\)
- Обратимость сложения: для \(\forall x \in F\) существует \((-x)\) такой, что \(x + (-x) = (-x) + x = 0\)
- Коммутативность сложения: для \(\forall x, y \in F\) выполняется \(x + y = y + x\).
- Ассоциативность умножения: для \(\forall x, y, z \in F\) выполняется \((x * y) * z = x * (y * z)\).
- Существование единичного элемента: \(\exists 1 \in F \quad \forall x \in F \quad x * 1 = 1 * x = x\)
- Коммутативность умножения: для \(\forall x, y \in F\) выполняется \(x * y = y * x\).
- Существование обратного элемента для ненулевых элементов: \((\forall x \in F: x \neq 0) \quad \exists x^{-1} \in F: \quad x * x^{-1} = 1\).
- Дистрибутивность умножения относительно сложения: для \(\forall x, y, z \in F\) выполняется \(x * (y + z) = x * y + x * z\) и \((x + y) * z = x * z + y * z\).
Определение в виде кода на 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
Ссылки: