[bugfix] integer_cra: check if arguments contain at least 2 moduli
authorAlexei Sheplyakov <varg@theor.jinr.ru>
Thu, 23 Oct 2008 13:48:14 +0000 (17:48 +0400)
committerAlexei Sheplyakov <varg@theor.jinr.ru>
Wed, 5 Nov 2008 13:55:33 +0000 (16:55 +0300)
While at it, also fix exam_cra so it does not produce pointless inputs.

check/exam_cra.cpp
ginac/polynomial/cra_garner.cpp

index 2c6163e..6e24770 100644 (file)
@@ -102,12 +102,14 @@ make_random_moduli(const cln::cl_I& limit)
        std::vector<cln::cl_I> moduli;
        cln::cl_I prod(1);
        cln::cl_I next = random_I(std::min(limit >> 1, cln::cl_I(128)));
+       unsigned count = 0;
        do {
                cln::cl_I tmp = nextprobprime(next);
                next = tmp + random_I(cln::cl_I(10)) + 1;
                prod = prod*tmp;
                moduli.push_back(tmp);
-       } while (prod < limit);
+               ++count;
+       } while (prod < limit || (count < 2));
        return moduli;
 }
 
index b400adb..76d1e07 100644 (file)
@@ -3,6 +3,7 @@
 #include <vector>
 #include <cstddef>
 #include "cra_garner.hpp"
+#include "compiler.h"
 
 namespace cln
 {
@@ -73,6 +74,8 @@ mixed_radix_2_ordinary(const vector<cl_I>& mixed_radix_coeffs,
 cl_I integer_cra(const vector<cl_I>& residues,
                 const vector<cl_I>& moduli)
 {
+       if (unlikely(moduli.size() < 2))
+               throw std::invalid_argument("integer_cra: need at least 2 moduli");
 
        vector<cl_MI> recips(moduli.size() - 1);
        compute_recips(recips, moduli);