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)));
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)));
do {
cln::cl_I tmp = nextprobprime(next);
next = tmp + random_I(cln::cl_I(10)) + 1;
prod = prod*tmp;
moduli.push_back(tmp);
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));
#include <vector>
#include <cstddef>
#include "cra_garner.hpp"
#include <vector>
#include <cstddef>
#include "cra_garner.hpp"
cl_I integer_cra(const vector<cl_I>& residues,
const vector<cl_I>& moduli)
{
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);
vector<cl_MI> recips(moduli.size() - 1);
compute_recips(recips, moduli);