17 #ifndef MATRIX_FIELD_ZP_OPERATOR_H_
18 #define MATRIX_FIELD_ZP_OPERATOR_H_
27 namespace persistence_fields {
38 template <
typename Unsigned_integer_type =
unsigned int,
39 class = std::enable_if_t<std::is_unsigned_v<Unsigned_integer_type> > >
46 using isSignedInteger = std::enable_if_t<std::is_signed_v<T> >;
63 : characteristic_(toCopy.characteristic_), inverse_(toCopy.inverse_) {}
70 : characteristic_(std::exchange(toMove.characteristic_, 0)), inverse_(std::move(toMove.inverse_)) {}
78 if (characteristic <= 1)
79 throw std::invalid_argument(
"Characteristic must be strictly positive and a prime number.");
81 inverse_.resize(characteristic);
83 for (
unsigned int i = 1; i < characteristic; ++i) {
85 unsigned int mult = inv * i;
86 while ((mult % characteristic) != 1) {
88 if (mult == characteristic)
throw std::invalid_argument(
"Characteristic must be a prime number.");
94 characteristic_ = characteristic;
119 template <
typename Signed_
integer_type,
class = isSignedInteger<Signed_
integer_type> >
121 if (e < -
static_cast<Signed_integer_type
>(characteristic_)) e = e % characteristic_;
122 if (e < 0)
return e += characteristic_;
123 return e < static_cast<Signed_integer_type>(characteristic_) ? e : e % characteristic_;
339 std::swap(characteristic_, other.characteristic_);
340 inverse_.swap(other.inverse_);
347 std::swap(f1.characteristic_, f2.characteristic_);
348 f1.inverse_.swap(f2.inverse_);
353 std::vector<element_type> inverse_;
356 if (UINT_MAX - e1 < e2) {
359 e1 -= characteristic;
364 if (e1 >= characteristic) e1 -= characteristic;
370 e1 += characteristic;
383 if (e2 >= characteristic - e1) e1 -= characteristic;
389 if (e2 >= characteristic - e2) temp_b -= characteristic;
Class defining operators for the field for any prime number .
Definition: Zp_field_operators.h:41
static constexpr element_type get_multiplicative_identity()
Returns the multiplicative identity of the field.
Definition: Zp_field_operators.h:321
void substract_inplace_back(element_type e1, element_type &e2) const
Stores in the second element the substraction in the field of the first element by the second element...
Definition: Zp_field_operators.h:176
Zp_field_operators(characteristic_type characteristic=0)
Default constructor. If a non-zero characteristic is given, initializes the field with it....
Definition: Zp_field_operators.h:54
Zp_field_operators(const Zp_field_operators &toCopy)
Copy constructor.
Definition: Zp_field_operators.h:62
Zp_field_operators(Zp_field_operators &&toMove) noexcept
Move constructor.
Definition: Zp_field_operators.h:69
element_type multiply(element_type e1, element_type e2) const
Returns the multiplication of two elements in the field.
Definition: Zp_field_operators.h:187
Unsigned_integer_type element_type
Definition: Zp_field_operators.h:43
element_type multiply_and_add(element_type e, element_type m, element_type a) const
Multiplies the first element with the second one and adds the third one. Returns the result in the fi...
Definition: Zp_field_operators.h:212
void multiply_inplace(element_type &e1, element_type e2) const
Stores in the first element the multiplication of two given elements in the field,...
Definition: Zp_field_operators.h:198
element_type add(element_type e1, element_type e2) const
Returns the sum of two elements in the field.
Definition: Zp_field_operators.h:133
static constexpr element_type get_additive_identity()
Returns the additive identity of the field.
Definition: Zp_field_operators.h:315
void set_characteristic(characteristic_type characteristic)
Sets the characteristic of the field.
Definition: Zp_field_operators.h:77
void multiply_and_add_inplace_front(element_type &e, element_type m, element_type a) const
Multiplies the first element with the second one and adds the third one, that is (e * m + a) % charac...
Definition: Zp_field_operators.h:224
static constexpr element_type get_partial_multiplicative_identity([[maybe_unused]] characteristic_type productOfCharacteristics)
For interface purposes with multi-fields. Returns the multiplicative identity of the field.
Definition: Zp_field_operators.h:328
void substract_inplace_front(element_type &e1, element_type e2) const
Stores in the first element the substraction in the field of the first element by the second element,...
Definition: Zp_field_operators.h:166
element_type add_and_multiply(element_type e, element_type a, element_type m) const
Adds the first element to the second one and multiplies the third one with it. Returns the result in ...
Definition: Zp_field_operators.h:252
void add_and_multiply_inplace_front(element_type &e, element_type a, element_type m) const
Adds the first element to the second one and multiplies the third one with it, that is ((e + a) * m) ...
Definition: Zp_field_operators.h:264
element_type get_inverse(element_type e) const
Returns the inverse of the given element in the field.
Definition: Zp_field_operators.h:297
element_type substract(element_type e1, element_type e2) const
Returns the substraction in the field of the first element by the second element.
Definition: Zp_field_operators.h:155
void add_and_multiply_inplace_back(element_type e, element_type a, element_type &m) const
Adds the first element to the second one and multiplies the third one with it, that is ((e + a) * m) ...
Definition: Zp_field_operators.h:277
void multiply_and_add_inplace_back(element_type e, element_type m, element_type &a) const
Multiplies the first element with the second one and adds the third one, that is (e * m + a) % charac...
Definition: Zp_field_operators.h:237
const characteristic_type & get_characteristic() const
Returns the current characteristic.
Definition: Zp_field_operators.h:101
element_type get_value(element_type e) const
Returns the value of an integer in the field. That is the positive value of the integer modulo the cu...
Definition: Zp_field_operators.h:110
friend void swap(Zp_field_operators &f1, Zp_field_operators &f2)
Swap operator.
Definition: Zp_field_operators.h:346
element_type characteristic_type
Definition: Zp_field_operators.h:44
bool are_equal(element_type e1, element_type e2) const
Returns true if the two given elements are equal in the field, false otherwise.
Definition: Zp_field_operators.h:289
void add_inplace(element_type &e1, element_type e2) const
Stores in the first element the sum of two given elements in the field, that is (e1 + e2) % character...
Definition: Zp_field_operators.h:144
Zp_field_operators & operator=(Zp_field_operators other)
Assign operator.
Definition: Zp_field_operators.h:338
element_type get_value(Signed_integer_type e) const
Returns the value of an integer in the field. That is the positive value of the integer modulo the cu...
Definition: Zp_field_operators.h:120
std::pair< element_type, characteristic_type > get_partial_inverse(element_type e, characteristic_type productOfCharacteristics) const
For interface purposes with multi-fields. Returns the inverse together with the second argument.
Definition: Zp_field_operators.h:305
Gudhi namespace.
Definition: SimplicialComplexForAlpha.h:14