// expand index set by s1. // it is assumed that s1 is disjoint from the current index set. void DoubleCRT::addPrimes(const IndexSet& s1) { if (empty(s1)) return; // nothing to do assert( disjoint(s1,map.getIndexSet()) ); // s1 is disjoint from *this ZZX poly; toPoly(poly); // recover in coefficient representation map.insert(s1); // add new rows to the map if (dryRun) return; // fill in new rows for (long i = s1.first(); i <= s1.last(); i = s1.next(i)) { context.ithModulus(i).FFT(map[i], poly); // reduce mod p_i and store FFT image } }
void SingleCRT::addPrimes(const IndexSet& s1) { assert(card(s1 & map.getIndexSet()) == 0); ZZX poly, poly1; toPoly(poly); // recover in coefficient representation map.insert(s1); // add new rows to the map // fill in new rows for (long i = s1.first(); i <= s1.last(); i = s1.next(i)) { ZZ pi = to_ZZ(context.ithPrime(i)); poly1 = poly; PolyRed(poly1,pi,true); // the flag true means reduce to [0,pi-1) map[i] = poly; } }
void SingleCRT::toPoly(ZZX& p) const { const IndexSet& s = map.getIndexSet(); toPoly(p, s); }