While at it, also fix exam_cra so it does not produce pointless inputs.
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;
}
#include <vector>
#include <cstddef>
#include "cra_garner.hpp"
+#include "compiler.h"
namespace cln
{
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);