Clearmatics Libsnark  0.1
C++ library for zkSNARK proofs
integer_permutation.cpp
Go to the documentation of this file.
1 
15 #include <algorithm>
16 #include <cassert>
18 #include <numeric>
19 #include <unordered_set>
20 
21 namespace libsnark
22 {
23 
25  : min_element(0), max_element(size - 1)
26 {
27  contents.resize(size);
28  std::iota(contents.begin(), contents.end(), 0);
29 }
30 
32  const size_t min_element, const size_t max_element)
33  : min_element(min_element), max_element(max_element)
34 {
35  assert(min_element <= max_element);
36  const size_t size = max_element - min_element + 1;
37  contents.resize(size);
38  std::iota(contents.begin(), contents.end(), min_element);
39 }
40 
42 {
43  return max_element - min_element + 1;
44 }
45 
47 {
48  return (
49  this->min_element == other.min_element &&
50  this->max_element == other.max_element &&
51  this->contents == other.contents);
52 }
53 
54 void integer_permutation::set(const size_t position, const size_t value)
55 {
56  assert(min_element <= position && position <= max_element);
57  contents[position - min_element] = value;
58 }
59 
60 size_t integer_permutation::get(const size_t position) const
61 {
62  assert(min_element <= position && position <= max_element);
63  return contents[position - min_element];
64 }
65 
67 {
68  std::unordered_set<size_t> elems;
69 
70  for (auto &el : contents) {
71  if (el < min_element || el > max_element ||
72  elems.find(el) != elems.end()) {
73  return false;
74  }
75 
76  elems.insert(el);
77  }
78 
79  return true;
80 }
81 
83 {
85 
86  for (size_t position = min_element; position <= max_element; ++position) {
87  result.contents[this->contents[position - min_element] - min_element] =
88  position;
89  }
90 
91 #ifdef DEBUG
92  assert(result.is_valid());
93 #endif
94 
95  return result;
96 }
97 
99  const size_t slice_min_element, const size_t slice_max_element) const
100 {
101  assert(
102  min_element <= slice_min_element &&
103  slice_min_element <= slice_max_element &&
104  slice_max_element <= max_element);
105  integer_permutation result(slice_min_element, slice_max_element);
106  std::copy(
107  this->contents.begin() + (slice_min_element - min_element),
108  this->contents.begin() + (slice_max_element - min_element) + 1,
109  result.contents.begin());
110 #ifdef DEBUG
111  assert(result.is_valid());
112 #endif
113 
114  return result;
115 }
116 
118 {
119  return std::next_permutation(contents.begin(), contents.end());
120 }
121 
123 {
124  return std::random_shuffle(contents.begin(), contents.end());
125 }
126 
127 } // namespace libsnark
libsnark::integer_permutation::inverse
integer_permutation inverse() const
Definition: integer_permutation.cpp:82
libsnark::integer_permutation::is_valid
bool is_valid() const
Definition: integer_permutation.cpp:66
libsnark
Definition: accumulation_vector.hpp:18
libsnark::integer_permutation::max_element
size_t max_element
Definition: integer_permutation.hpp:29
libsnark::integer_permutation::random_shuffle
void random_shuffle()
Definition: integer_permutation.cpp:122
libsnark::integer_permutation::min_element
size_t min_element
Definition: integer_permutation.hpp:28
integer_permutation.hpp
libsnark::integer_permutation::get
size_t get(const size_t position) const
Definition: integer_permutation.cpp:60
libsnark::integer_permutation::set
void set(const size_t position, const size_t value)
Definition: integer_permutation.cpp:54
libsnark::integer_permutation::integer_permutation
integer_permutation(const size_t size=0)
Definition: integer_permutation.cpp:24
libsnark::integer_permutation::next_permutation
bool next_permutation()
Definition: integer_permutation.cpp:117
libsnark::integer_permutation::size
size_t size() const
Definition: integer_permutation.cpp:41
libsnark::integer_permutation
Definition: integer_permutation.hpp:22
libsnark::integer_permutation::slice
integer_permutation slice(const size_t slice_min_element, const size_t slice_max_element) const
Definition: integer_permutation.cpp:98
libsnark::integer_permutation::operator==
bool operator==(const integer_permutation &other) const
Definition: integer_permutation.cpp:46