Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

Boost.Hana: Euclidean Ring

Boost , ,

Boost.Hana  1.0.1
Your standard library for metaprogramming
Понятие<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>в виде двоичных операций. В данном случае мы имеем

2 * 2 == 4
== 0 (mod 4)

Хотя<2 != 0 (mod 4)>.

Следуя этой линии мысли, евклидово кольцо требует своего единственного нулевого делителя. Другими словами, умножение в евклидовом не будет посылать два ненулевых элемента к нулю. Также обратите внимание, что, поскольку умножение в<Ring>не обязательно коммутативное, это не всегда так.

x * y == 0 implies y * x == 0

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

x * y == y * x

Мы не должны различать левый и правый нулевые делители.

Типичные примеры евклидовых колец включают целые числа и полиномы над полем. Используемые здесь названия методов относятся к евклидовому кольцу целых чисел при обычных операциях сложения, умножения и деления.

Minimal complete definition

<div>и<mod>удовлетворяющие нижеприведенным законам

Laws

Для упрощения чтения мы будем использовать операторы<+>,<*>,</>и<%>с фиксированным обозначением для обозначения применения соответствующих методов в Monoid, Group, Ring и EuclideanRing. Для всех объектов<a>и<b>из<EuclideanRing><R>должны соблюдаться следующие законы:

a * b == b * a // commutativity
(a / b) * b + a % b == a if b is non-zero
zero<R>() % b == zero<R>() if b is non-zero

Refined concepts

<Monoid>,<Group>,<Ring>

Concrete models

<hana::integral_constant>

Free model for non-boolean integral data types

Тип данных<T>является интегральным, если<std::is_integral<T>::value>является истинным. Для небулевого интегрального типа данных<T>модель<EuclideanRing>автоматически определяется с помощью модели<Ring>, предусмотренной для арифметических типов данных и настройки.

div(x, y) = (x / y)
mod(x, y) = (x % y)
Note
The rationale for not providing an EuclideanRing model for bool is the same as for not providing Monoid, Group and Ring models.

Variables

constexpr auto boost::hana::div
 Generalized integer division. More...
 
constexpr auto boost::hana::mod
 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...
 

Variable Documentation

constexpr auto boost::hana::div

<#include <boost/hana/fwd/div.hpp>>

Initial value:
= [](auto&& x, auto&& y) -> decltype(auto) {
return tag-dispatched;
}

Обобщенное целое деление.

Cross-type version of the method

Метод<div>«перегружен» для обработки различных типов данных с определенными свойствами. В частности,<div>определяется дляразличныхтипов данных<A>и<B>, так что

  1. AиBимеют общий тип данныхC, определяемый метафункциейcommon.
  2. A,BиC— всеEuclideanRing, взятые индивидуально.
  3. to<C> : A -> Bиto<C> : B -> CявляютсяRingвстроенными, как определеноis_embeddingметафункцией.

В этом случае<div>метод определяется как

div(x, y) = div(to<C>(x), to<C>(y))

Example

// Copyright Louis Dionne 2013-2016
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
namespace hana = boost::hana;
BOOST_HANA_CONSTANT_CHECK(hana::div(hana::int_c<6>, hana::int_c<3>) == hana::int_c<2>);
BOOST_HANA_CONSTANT_CHECK(hana::div(hana::int_c<6>, hana::int_c<4>) == hana::int_c<1>);
static_assert(hana::div(6, 3) == 2, "");
static_assert(hana::div(6, 4) == 1, "");
int main() { }
constexpr auto boost::hana::mod

<#include <boost/hana/fwd/mod.hpp>>

Initial value:
= [](auto&& x, auto&& y) -> decltype(auto) {
return tag-dispatched;
}

Обобщенный целочисленный модуль. При наличии двух элементов евклидового кольца<x>и<y>с ненулевым<y>,<mod>возвращает модуль деления<x>на<y>. Иными словами,<mod>можно рассматривать как эквивалент<%>.

Cross-type version of the method

Метод<mod>«перегружен» для обработки различных типов данных с определенными свойствами. В частности,<mod>определяется дляразличныхтипов данных<A>и<B>, так что

  1. AиBимеют общий тип данныхC, определяемый метафункциейcommon.
  2. A,BиC— всеEuclideanRing, взятые индивидуально.
  3. to<C> : A -> Bиto<C> : B -> CявляютсяRingвстроенными, как определеноis_embeddingметафункцией.

В этом случае<mod>определяется как

mod(x, y) = mod(to<C>(x), to<C>(y))

Example

// Copyright Louis Dionne 2013-2016
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
namespace hana = boost::hana;
BOOST_HANA_CONSTANT_CHECK(hana::mod(hana::int_c<6>, hana::int_c<4>) == hana::int_c<2>);
BOOST_HANA_CONSTANT_CHECK(hana::mod(hana::int_c<-6>, hana::int_c<4>) == hana::int_c<-2>);
static_assert(hana::mod(6, 4) == 2, "");
int main() { }

Статья Boost.Hana: Euclidean Ring раздела может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-20 01:17:09/0.0061800479888916/1