17#ifndef MATRIX_FIELD_MULTI_SMALL_OPERATORS_H_
18#define MATRIX_FIELD_MULTI_SMALL_OPERATORS_H_
26#include <gudhi/Debug_utils.h>
77 if (maximum < 2)
throw std::invalid_argument(
"Characteristic must be strictly positive");
78 if (minimum > maximum)
throw std::invalid_argument(
"The given interval is not valid.");
79 if (minimum == maximum && !_is_prime(minimum))
80 throw std::invalid_argument(
"The given interval does not contain a prime number.");
82 productOfAllCharacteristics_ = 1;
84 for (
unsigned int i = minimum; i <= static_cast<unsigned int>(maximum); ++i) {
85 if (_is_prime(
static_cast<int>(i))) {
87 productOfAllCharacteristics_ *= i;
91 if (primes_.empty())
throw std::invalid_argument(
"The given interval does not contain a prime number.");
93 partials_.resize(primes_.size());
94 for (
unsigned int i = 0; i < primes_.size(); ++i) {
95 unsigned int p = primes_[i];
97 unsigned int exp = p - 1;
102 if (exp & 1) partials_[i] = _multiply(partials_[i], base, productOfAllCharacteristics_);
105 base = _multiply(base, base, productOfAllCharacteristics_);
132 return e < productOfAllCharacteristics_ ? e : e % productOfAllCharacteristics_;
329 GUDHI_CHECK(productOfCharacteristics >= 0 && productOfCharacteristics <= productOfAllCharacteristics_,
330 std::invalid_argument(
331 "The given product is not the product of a subset of the current Multi-field characteristics."));
342 res = _multiply(res, inv_qt, productOfAllCharacteristics_);
371 GUDHI_CHECK(productOfCharacteristics >= 0 && productOfCharacteristics <= productOfAllCharacteristics_,
372 std::invalid_argument(
373 "The given product is not the product of a subset of the current Multi-field characteristics."));
375 if (productOfCharacteristics ==
nullCharacteristic || productOfCharacteristics == productOfAllCharacteristics_) {
379 for (
unsigned int idx = 0; idx < primes_.size(); ++idx) {
380 if ((productOfCharacteristics % primes_[idx]) == 0) {
381 multIdentity = _add(multIdentity, partials_[idx], productOfAllCharacteristics_);
393 f1.primes_.swap(f2.primes_);
394 std::swap(f1.productOfAllCharacteristics_, f2.productOfAllCharacteristics_);
395 f1.partials_.swap(f2.partials_);
399 std::vector<unsigned int> primes_;
401 std::vector<Characteristic> partials_;
407 if (UINT_MAX - element < v) {
410 element -= characteristic;
415 if (element >= characteristic) element -= characteristic;
423 element += characteristic;
435 if (b < a) std::swap(a, b);
440 if (b >= characteristic - res) res -= characteristic;
447 if (b >= characteristic - b) temp_b -= characteristic;
458 long int y = 0, x = 1;
461 int quotient = A / M;
467 y = x - quotient * y;
476 static constexpr bool _is_prime(
const int p)
478 if (p <= 1)
return false;
479 if (p <= 3)
return true;
480 if (p % 2 == 0 || p % 3 == 0)
return false;
482 for (
long i = 5; i * i <= p; i = i + 6)
483 if (p % i == 0 || p % (i + 2) == 0)
return false;
Element subtract(Element e1, Element e2) const
Returns the subtraction in the field of the first element by the second element.
Definition Multi_field_small_operators.h:166
Element Characteristic
Definition Multi_field_small_operators.h:43
Element multiply_and_add(Element e, Element m, Element a) const
Multiplies the first element with the second one and adds the third one. Returns the result in the fi...
Definition Multi_field_small_operators.h:229
Element multiply(Element e1, Element e2) const
Returns the multiplication of two elements in the field.
Definition Multi_field_small_operators.h:202
Element add_and_multiply(Element e, Element a, Element m) const
Adds the first element to the second one and multiplies the third one with it. Returns the result in ...
Definition Multi_field_small_operators.h:268
static const Characteristic nullCharacteristic
Definition Multi_field_small_operators.h:45
Element get_partial_multiplicative_identity(const Characteristic &productOfCharacteristics) const
Returns the partial multiplicative identity of the multi-field from the given product....
Definition Multi_field_small_operators.h:369
Element get_value(Element e) const
Returns the value of an element in the field. That is the positive value of the integer modulo the cu...
Definition Multi_field_small_operators.h:130
static constexpr Element get_multiplicative_identity()
Returns the multiplicative identity of a field.
Definition Multi_field_small_operators.h:359
bool are_equal(Element e1, Element e2) const
Returns true if the two given elements are equal in the field, false otherwise.
Definition Multi_field_small_operators.h:304
Multi_field_operators_with_small_characteristics(int minCharacteristic, int maxCharacteristic)
Constructor setting the characteristics to all prime numbers between the two given integers....
Definition Multi_field_small_operators.h:61
static constexpr Element get_additive_identity()
Returns the additive identity of a field.
Definition Multi_field_small_operators.h:352
void add_and_multiply_inplace_front(Element &e, Element a, Element m) const
Adds the first element to the second one and multiplies the third one with it, that is ((e + a) * m) ...
Definition Multi_field_small_operators.h:281
friend void swap(Multi_field_operators_with_small_characteristics &f1, Multi_field_operators_with_small_characteristics &f2) noexcept
Swap operator.
Definition Multi_field_small_operators.h:390
Element add(Element e1, Element e2) const
Returns the sum of two elements in the field.
Definition Multi_field_small_operators.h:142
void set_characteristic(int minimum, int maximum)
Set the characteristics of the field, which are stored in a single value as a product of all of them....
Definition Multi_field_small_operators.h:75
std::pair< Element, Characteristic > get_partial_inverse(const Element &e, const Characteristic &productOfCharacteristics) const
Returns the inverse of the given element in the multi-field corresponding to the given sub-product of...
Definition Multi_field_small_operators.h:326
void add_and_multiply_inplace_back(Element e, Element a, Element &m) const
Adds the first element to the second one and multiplies the third one with it, that is ((e + a) * m) ...
Definition Multi_field_small_operators.h:294
void subtract_inplace_back(Element e1, Element &e2) const
Stores in the second element the subtraction in the field of the first element by the second element,...
Definition Multi_field_small_operators.h:190
unsigned int Element
Definition Multi_field_small_operators.h:42
void multiply_and_add_inplace_back(Element e, Element m, Element &a) const
Multiplies the first element with the second one and adds the third one, that is (e * m + a) % produc...
Definition Multi_field_small_operators.h:255
void multiply_inplace(Element &e1, Element e2) const
Stores in the first element the multiplication of two given elements in the field,...
Definition Multi_field_small_operators.h:214
void subtract_inplace_front(Element &e1, Element e2) const
Stores in the first element the subtraction in the field of the first element by the second element,...
Definition Multi_field_small_operators.h:178
void add_inplace(Element &e1, Element e2) const
Stores in the first element the sum of two given elements in the field, that is (e1 + e2) % productOf...
Definition Multi_field_small_operators.h:154
Element get_inverse(const Element &e) const
Returns the inverse of the given element in the sense of boissonnat:hal-00922572 with respect to the ...
Definition Multi_field_small_operators.h:313
void multiply_and_add_inplace_front(Element &e, Element m, Element a) const
Multiplies the first element with the second one and adds the third one, that is (e * m + a) % produc...
Definition Multi_field_small_operators.h:242
Multi_field_operators_with_small_characteristics()
Default constructor, sets the product of all characteristics to 0.
Definition Multi_field_small_operators.h:50
const Characteristic & get_characteristic() const
Returns the current characteristics as the product of all of them.
Definition Multi_field_small_operators.h:121
Field namespace.
Definition Intro_field_elements_and_operators.h:16
Gudhi namespace.
Definition SimplicialComplexForAlpha.h:14