43 constexpr std::array<int, N>
decode(uint64_t binary_representation) {
45 for (
int i = 0; i < N; ++i) result[i] = (binary_representation >> (4 * i)) & 0b1111ull;
60 constexpr uint64_t
encode(std::array<int, N>
const &a) {
62 for (
int i = 0; i < N; ++i) {
63 EXPECTS(0 <= a[i] and a[i] <= 15);
64 result += (
static_cast<uint64_t
>(a[i]) << (4 * i));
73namespace nda::permutations {
91 template <std::
integral Int,
size_t N>
92 constexpr bool is_valid(std::array<Int, N>
const &p) {
95 if (idx < 0 or idx > N - 1 or idx_counts[idx] > 0)
return false;
113 template <std::
integral Int,
size_t N>
114 constexpr std::array<Int, N>
compose(std::array<Int, N>
const &p1, std::array<Int, N>
const &p2) {
118 for (
int u = 0; u < N; ++u) result[u] = p1[p2[u]];
133 template <std::
integral Int,
size_t N>
134 constexpr std::array<Int, N>
inverse(std::array<Int, N>
const &p) {
137 for (
int u = 0; u < N; ++u) result[p[u]] = u;
153 template <
typename T, std::
integral Int,
size_t N>
154 constexpr std::array<T, N>
apply_inverse(std::array<Int, N>
const &p, std::array<T, N>
const &a) {
157 for (
int u = 0; u < N; ++u) result[p[u]] = a[u];
174 template <
typename T, std::
integral Int,
size_t N>
175 constexpr std::array<T, N>
apply(std::array<Int, N>
const &p, std::array<T, N>
const &a) {
178 for (
int u = 0; u < N; ++u) result[u] = a[p[u]];
191 for (
int i = 0; i < N; ++i) result[i] = i;
204 for (
int i = 0; i < N; ++i) result[i] = N - 1 - i;
238 constexpr std::array<int, N>
cycle(
int p,
int pos = N) {
240 pos = std::clamp(pos, 0,
static_cast<int>(N));
241 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.