summaryrefslogtreecommitdiff
path: root/src/Persistent_cohomology/include/gudhi/Persistent_cohomology/Field_Zp.h
diff options
context:
space:
mode:
authorHind-M <hind.montassif@gmail.com>2021-07-01 15:56:11 +0200
committerHind-M <hind.montassif@gmail.com>2021-07-01 15:56:11 +0200
commit62b63fd55442b152b934dc0c9ed662970ddb32dc (patch)
tree2761d546ba943a40a2973b499e884e7d21442c07 /src/Persistent_cohomology/include/gudhi/Persistent_cohomology/Field_Zp.h
parent68031184fb94cf19c8b3c6f0de122db447693847 (diff)
Move primality test to Field_Zp::init
Throw exception when not prime Add tests
Diffstat (limited to 'src/Persistent_cohomology/include/gudhi/Persistent_cohomology/Field_Zp.h')
-rw-r--r--src/Persistent_cohomology/include/gudhi/Persistent_cohomology/Field_Zp.h19
1 files changed, 18 insertions, 1 deletions
diff --git a/src/Persistent_cohomology/include/gudhi/Persistent_cohomology/Field_Zp.h b/src/Persistent_cohomology/include/gudhi/Persistent_cohomology/Field_Zp.h
index 0673625c..4bfd95c0 100644
--- a/src/Persistent_cohomology/include/gudhi/Persistent_cohomology/Field_Zp.h
+++ b/src/Persistent_cohomology/include/gudhi/Persistent_cohomology/Field_Zp.h
@@ -13,6 +13,8 @@
#include <utility>
#include <vector>
+#include <stdexcept>
+#include <cmath>
namespace Gudhi {
@@ -34,15 +36,30 @@ class Field_Zp {
void init(int charac) {
assert(charac > 0); // division by zero + non negative values
+
Prime = charac;
+
+ // Check for primality
+ if ((Prime == 0) || (Prime == 1) || ((Prime > 3) && ((Prime % 2 == 0) || (Prime % 3 == 0))))
+ throw std::invalid_argument("homology_coeff_field must be a prime number");
+
inverse_.clear();
inverse_.reserve(charac);
inverse_.push_back(0);
for (int i = 1; i < Prime; ++i) {
int inv = 1;
- while (((inv * i) % Prime) != 1)
+ int mult = inv * i;
+ while ( (mult % Prime) != 1) {
++inv;
+ if(mult == Prime)
+ throw std::invalid_argument("homology_coeff_field must be a prime number");
+ mult = inv * i;
+ }
inverse_.push_back(inv);
+ if ( (i <= std::sqrt(Prime)) && (((i-5)%6) == 0) ) {
+ if ((Prime % i == 0) || (Prime % (i + 2) == 0))
+ throw std::invalid_argument("homology_coeff_field must be a prime number");
+ }
}
}