![]() |
libsemigroups
v3.0.0
C++ library for semigroups and monoids
|
Defined in schreier-sims.hpp
.
This is a traits class for use with the class template SchreierSims.
This traits class contains stateless types which are used to adapt any class representing a permutation for the implementation of the Schreier-Sims algorithm in the SchreierSims class template.
N | the largest point not fixed by the permutations in the permutation group to be represented by a SchreierSims instance. |
Point | the type of the points acted on. |
Element | the type of the group elements acting on Point . |
Public Types | |
using | Action = libsemigroups::ImageRightAction<element_type, Point> |
Adapter for the value of a right action. | |
using | Degree = libsemigroups::Degree<element_type> |
Adapter for the degree of an element. | |
using | domain_type = detail::IntRange<Point> |
Type of the object containing all points acted on. | |
using | element_type = Element |
Type of the elements. | |
using | EqualTo = libsemigroups::EqualTo<element_type> |
Adapter for testing equality. | |
using | index_type = size_t |
The type of indices to be used by a SchreierSims instance. | |
using | Inverse = libsemigroups::Inverse<element_type> |
Adapter for increasing the degree of an element. | |
using | One = libsemigroups::One<element_type> |
Adapter for the identity element of the given type. | |
using | point_type = Point |
Type of the points acted on. | |
using | Product = libsemigroups::Product<element_type> |
Adapter for the product of two elements. | |
using | Swap = libsemigroups::Swap<element_type> |
Adapter for swapping. | |
using Action = libsemigroups::ImageRightAction<element_type, Point> |
Defined in adapters.hpp
.
Specialisations of this struct should be stateless trivially default constructible with a call operator of signature:
void operator()(Point&, Element const&, Point const&) const
(possibly noexcept
, inline
and/or constexpr
also); orPoint operator()(Element const&, Point const&) const
(possibly noexcept
, inline
and/or constexpr
also).In form (1): the call operator should change res
in-place to contain the image of the point pt
under the right action of the element x
. The purpose of the 1st parameter is to avoid repeated allocations of memory to hold temporary points that are discarded soon after they are created.
In form (2): the call operator should return the image of the point pt
under the right action of the element x
.
Element | the type of the elements of a semigroup. |
Point | the type of the points acted on. |
The third template parameter exists for SFINAE.
using Degree = libsemigroups::Degree<element_type> |
Defined in adapters.hpp
.
Specialisations of this struct should be stateless trivially default constructible with a call operator of signature size_t operator()(Element const& x) const
(possibly noexcept
, inline
and/or constexpr
also).
The return value of the call operator ought to indicate the degree of a Element
instance which may or may not depend on the parameter x
. The degree of a permutation, for instance, would be the the number of points it acts on, the degree of a matrix is its dimension, and so on. This is used, for example, by SchreierSimsTraits in some member functions to determine whether it is known a priori that a permutation does not belong to the object, because it acts on too many points.
Element | the type of the elements of a semigroup. |
The second template parameter exists for SFINAE.
using domain_type = detail::IntRange<Point> |
Type of the object containing all points acted on.
using element_type = Element |
Type of the elements.
using EqualTo = libsemigroups::EqualTo<element_type> |
Defined in adapters.hpp
.
This type should be a stateless trivially default constructible with a call operator of signature bool operator()(Value const&, Value const&)
(possibly noexcept
, inline
and/or constexpr
also) for use with, for example, std::unordered_map.
Value | the type of objects to compare. |
The second template parameter exists for SFINAE.
using index_type = size_t |
The type of indices to be used by a SchreierSims instance.
using Inverse = libsemigroups::Inverse<element_type> |
Defined in adapters.hpp
.
Specialisations of this struct should be stateless trivially default constructible with a call operator of signature void operator()(Element& x, size_t n) const
(possibly noexcept
, inline
and/or constexpr
also).
The call operator should change the first argument in-place so that if m = Degree<Element>()(x)
, then after the call to IncreaseDegree<Element>()(x, n)
, Degree<Element>()(x)
returns m + n
. This only makes sense for certain types of elements, such as permutations, transformations, or matrices, and not for other types of object. In the latter case, the call operator should simply do nothing. This is used, for example, in the member function FroidurePin::closure, when one of the generators being added has degree larger than the existing generators.
Element | the type of the elements of a semigroup. |
The second template parameter exists for SFINAE.
using One = libsemigroups::One<element_type> |
Specialisations of this struct should be stateless trivially default constructible with two call operator of signatures:
Element operator()(size_t n) const
(possibly noexcept
, inline
and/or constexpr
also) returning a multiplicative identity element for the category Element
and with Degree<Element>()(x)
equal to the parameter n
. For example, if Element
is a type of n x n matrices, then this should return the n x n identity matrix.Element operator()(T const&) const
(possibly noexcept
, inline
and/or constexpr
also). This could be implemented as: Element | the type of the elements of a semigroup. |
The second template parameter exists for SFINAE.
using point_type = Point |
The type of the points acted on by the group represented by this
, which is the same as the template parameter Point
.
using Product = libsemigroups::Product<element_type> |
Defined in adapters.hpp
.
Specialisations of this struct should be stateless trivially default constructible with a call operator of signature void operator()(Element&, Element const&, Element const&, size_t = 0)
(possibly noexcept
, inline
and/or constexpr
also).
The call operator should change xy
in-place to be the product of x
and y
. The 4th parameter is optional and it can be used as an index for static thread local storage, that might be required for forming the product of x
and y
. The purpose of the 1st parameter is to avoid repeated allocations of memory to hold temporary products that are discarded soon after they are created.
Element | the type of the elements of a semigroup. |
The second template parameter exists for SFINAE.
using Swap = libsemigroups::Swap<element_type> |
Defined in adapters.hpp
.
This type should be a stateless trivially default constructible with a call operator of signature void operator()(Value&, Value&)
(possibly noexcept
, inline
and/or constexpr
also) which swaps its arguments.
Value | the type of objects to swap. |
The second template parameter exists for SFINAE.