42 constexpr std::array<int, N>
decode(uint64_t binary_representation) {
44 for (
int i = 0; i < N; ++i) result[i] = (binary_representation >> (8 * i)) & 0xFFull;
59 constexpr uint64_t
encode(std::array<int, N>
const &a) {
61 for (
int i = 0; i < N; ++i) {
62 EXPECTS(0 <= a[i] and a[i] <= 255);
63 result += (
static_cast<uint64_t
>(a[i]) << (8 * i));
72namespace nda::permutations {
90 template <std::
integral Int,
size_t N>
91 constexpr bool is_valid(std::array<Int, N>
const &p) {
94 if (idx < 0 or idx > N - 1 or idx_counts[idx] > 0)
return false;
112 template <std::
integral Int,
size_t N>
113 constexpr std::array<Int, N>
compose(std::array<Int, N>
const &p1, std::array<Int, N>
const &p2) {
117 for (
int u = 0; u < N; ++u) result[u] = p1[p2[u]];
132 template <std::
integral Int,
size_t N>
133 constexpr std::array<Int, N>
inverse(std::array<Int, N>
const &p) {
136 for (
int u = 0; u < N; ++u) result[p[u]] = u;
152 template <
typename T, std::
integral Int,
size_t N>
153 constexpr std::array<T, N>
apply_inverse(std::array<Int, N>
const &p, std::array<T, N>
const &a) {
156 for (
int u = 0; u < N; ++u) result[p[u]] = a[u];
173 template <
typename T, std::
integral Int,
size_t N>
174 constexpr std::array<T, N>
apply(std::array<Int, N>
const &p, std::array<T, N>
const &a) {
177 for (
int u = 0; u < N; ++u) result[u] = a[p[u]];
190 for (
int i = 0; i < N; ++i) result[i] = i;
203 for (
int i = 0; i < N; ++i) result[i] = N - 1 - i;
237 constexpr std::array<int, N>
cycle(
int p,
int pos = N) {
239 pos = std::clamp(pos, 0,
static_cast<int>(N));
240 for (
int i = 0; i < N; ++i) result[i] = (i < pos ? (pos + i - p) % pos : i);
Provides utility functions for std::array.
constexpr std::array< int, N > transposition(int i, int j)
Get the permutation representing a single given transposition.
constexpr std::array< Int, N > inverse(std::array< Int, N > const &p)
Inverse of a permutation.
constexpr std::array< int, N > decode(uint64_t binary_representation)
Decode a uint64_t into a std::array<int, N>.
constexpr bool is_valid(std::array< Int, N > const &p)
Check if a given array is a valid permutation.
constexpr std::array< T, N > apply_inverse(std::array< Int, N > const &p, std::array< T, N > const &a)
Apply the inverse of a permutation to a std::array.
constexpr std::array< int, N > identity()
Get the identity permutation.
constexpr uint64_t encode(std::array< int, N > const &a)
Encode a std::array<int, N> in a uint64_t.
constexpr std::array< int, N > reverse_identity()
Get the reverse identity permutation.
constexpr std::array< int, N > cycle(int p, int pos=N)
Perform a forward (partial) cyclic permutation of the identity p times.
constexpr std::array< Int, N > compose(std::array< Int, N > const &p1, std::array< Int, N > const &p2)
Composition of two permutations.
constexpr std::array< T, N > apply(std::array< Int, N > const &p, std::array< T, N > const &a)
Apply a permutation to a std::array.
constexpr std::array< T, R > make_initialized_array(T v)
Create a new std::array object initialized with a specific value.
Macros used in the nda library.
Provides missing concepts for older compiler versions.