Понятие<EuclideanRing>представляет собой коммутативное<Ring>, которое также может быть наделено алгоритмом деления.
Кольцо определяет двоичную операцию, часто называемуюумножением, которая может быть использована для объединения двух элементов кольца в новый элемент кольца.Евклидово кольцо, также называемое евклидовым доменом, добавляет способность определять специальную функцию, обобщающую евклидово деление целых чисел.
Однако евклидово кольцо должно также удовлетворять еще одному свойству, которое заключается в отсутствии ненулевых делителей. В Кольце<(R, +, *)>из аксиом довольно легко следует, что<x * 0 == 0>для любого кольцевого элемента<x>. Однако ничто не обязывает<0>быть единственным кольцевым элементом, посылающим другие элементы<0>. Следовательно, в некоторых Кольцах можно иметь элементы<x>и<y>так, что<x * y == 0>при отсутствии<x == 0>или<y == 0>. Мы называем эти элементы делителями нуля или нулевыми делителями. Например, такая ситуация возникает в Кольце целых чисел modulo 4 (множество<{0, 1, 2, 3}>) с добавлением и умножением<mod 4>в виде двоичных операций. В данном случае мы имеем
Следуя этой линии мысли, евклидово кольцо требует своего единственного нулевого делителя. Другими словами, умножение в евклидовом не будет посылать два ненулевых элемента к нулю. Также обратите внимание, что, поскольку умножение в<Ring>не обязательно коммутативное, это не всегда так.
x * y == 0 implies y * x == 0
Чтобы быть строгими, мы должны различать элементы, которые являются нулевыми делителями при умножении направо и налево. К счастью, концепция евклидового кольца требует, чтобы умножение кольца было коммутативным. Поэтому,
x * y == y * x
Мы не должны различать левый и правый нулевые делители.
Типичные примеры евклидовых колец включают целые числа и полиномы над полем. Используемые здесь названия методов относятся к евклидовому кольцу целых чисел при обычных операциях сложения, умножения и деления.
Для упрощения чтения мы будем использовать операторы<+>,<*>,</>и<%>с фиксированным обозначением для обозначения применения соответствующих методов в Monoid, Group, Ring и EuclideanRing. Для всех объектов<a>и<b>из<EuclideanRing><R>должны соблюдаться следующие законы:
Тип данных<T>является интегральным, если<std::is_integral<T>::value>является истинным. Для небулевого интегрального типа данных<T>модель<EuclideanRing>автоматически определяется с помощью модели<Ring>, предусмотренной для арифметических типов данных и настройки.
Generalized integer modulus.Given two elements of an EuclideanRing x and y, with y nonzero, mod returns the modulus of the division of x by y. In other words, mod can be seen as an equivalent to %. More...
Метод<div>«перегружен» для обработки различных типов данных с определенными свойствами. В частности,<div>определяется дляразличныхтипов данных<A>и<B>, так что
AиBимеют общий тип данныхC, определяемый метафункциейcommon.
A,BиC— всеEuclideanRing, взятые индивидуально.
to<C> : A -> Bиto<C> : B -> CявляютсяRingвстроенными, как определеноis_embeddingметафункцией.
Обобщенный целочисленный модуль. При наличии двух элементов евклидового кольца<x>и<y>с ненулевым<y>,<mod>возвращает модуль деления<x>на<y>. Иными словами,<mod>можно рассматривать как эквивалент<%>.
Cross-type version of the method
Метод<mod>«перегружен» для обработки различных типов данных с определенными свойствами. В частности,<mod>определяется дляразличныхтипов данных<A>и<B>, так что
AиBимеют общий тип данныхC, определяемый метафункциейcommon.
A,BиC— всеEuclideanRing, взятые индивидуально.
to<C> : A -> Bиto<C> : B -> CявляютсяRingвстроенными, как определеноis_embeddingметафункцией.
Статья Boost.Hana: Euclidean Ring раздела может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.