static void add1Dmats4dim(FHESecKey& sKey, long i, long keyID) { const FHEcontext &context = sKey.getContext(); long m = context.zMStar.getM(); computeParams(context,m,i); // defines vars: native, ord, gi, g2md, giminv, g2mdminv /* MAUTO vector<long> vals; */ for (long j=1,val=gi; j < ord; j++) { // From s(X^val) to s(X) sKey.GenKeySWmatrix(1, val, keyID, keyID); if (!native) { // also from s(X^{g^{i-ord}}) to s(X) long val2 = MulModPrecon(val,g2md,m,g2mdminv); sKey.GenKeySWmatrix(1, val2, keyID, keyID); /* MAUTO vals.push_back(val2); */ } /* MAUTO vals.push_back(val); */ val = MulModPrecon(val, gi, m, giminv); // val *= g mod m (= g^{j+1}) } if (!native) { sKey.GenKeySWmatrix(1, context.zMStar.genToPow(i, -ord), keyID, keyID); } /* MAUTO sKey.resetTree(i,keyID); // remove existing tree, if any sKey.add2tree(i, 1, vals, keyID); */ }
static void addSome1Dmats4dim(FHESecKey& sKey, long i, long bound, long keyID) { const FHEcontext &context = sKey.getContext(); long m = context.zMStar.getM(); computeParams(context,m,i); // defines vars: native, ord, gi, g2md, giminv, g2mdminv long baby, giant; std::tie(baby,giant) = computeSteps(ord, bound, native); for (long j=1,val=gi; j<=baby; j++) { // Add matrices for baby steps sKey.GenKeySWmatrix(1, val, keyID, keyID); if (!native) { long val2 = MulModPrecon(val,g2md,m,g2mdminv); sKey.GenKeySWmatrix(1, val2, keyID, keyID); } val = MulModPrecon(val, gi, m, giminv); // val *= g mod m (= g^{j+1}) } long gb = PowerMod(gi,baby,m); // g^baby NTL::mulmod_precon_t gbminv = PrepMulModPrecon(gb, m); for (long j=2,val=gb; j < giant; j++) { // Add matrices for giant steps val = MulModPrecon(val, gb, m, gbminv); // val = g^{(j+1)*baby} sKey.GenKeySWmatrix(1, val, keyID, keyID); } if (!native) { sKey.GenKeySWmatrix(1, context.zMStar.genToPow(i, -ord), keyID, keyID); } // VJS: experimantal feature...because the replication code // uses rotations by -1, -2, -4, -8, we add a few // of these as well...only the small ones are important, // and we only need them if SameOrd(i)... // Note: we do indeed get a nontrivial speed-up if (native && i<context.zMStar.numOfGens()) { for (long k = 1; k < giant; k = 2*k) { long j = ord - k; long val = PowerMod(gi, j, m); // val = g^j sKey.GenKeySWmatrix(1, val, keyID, keyID); } } #if 0 MAUTO // build the tree for this dimension, the internal nodes are 1 and // (subset of) gi^{giant}, gi^{2*giant}, ..., gi^{baby*giant}. We MAUTO sKey.resetTree(i,keyID); // remove existing tree, if any // keep a list of all the elements that are covered by the tree so far, // initialized to only the root (=1). std::unordered_set<long> covered({1}); // Make a list of the automorphisms for this dimension std::vector<long> autos; for (long j=1,val=gi; j<ord; j++) { // Do we have matrices for val and/or val/gi^{di}? if (!native) { long val2 = MulModPrecon(val, g2md, m, g2mdminv); if (sKey.haveKeySWmatrix(1,val2,keyID,keyID)) { autos.push_back(val2); } } if (sKey.haveKeySWmatrix(1,val,keyID,keyID)) { autos.push_back(val); } val = MulModPrecon(val, gi, m, giminv); // g^{j+1} } // Insert internal nodes and their children to tree for (long j=0,fromVal=1; j<giant; j++) { NTL::mulmod_precon_t fromminv = PrepMulModPrecon(fromVal, m); vector<long> children; for (long k: autos) { long toVal = MulModPrecon(k, fromVal, m, fromminv); if (covered.count(toVal)==0) { // toVal not covered yet covered.insert(toVal); children.push_back(toVal); } } if (!children.empty()) { // insert fromVal with its children sKey.add2tree(i, fromVal, children, keyID); } fromVal = MulModPrecon(fromVal, gb, m, gbminv); // g^{(j+1)*baby} } // Sanity-check, did we cover everything? long toCover = native? ord: (2*ord-1); if (covered.size()<toCover) cerr << "**Warning: order-"<<ord<<" dimension, covered "<<covered.size() << " of "<<toCover<<endl; #endif }
NedLine3::NedLine3(NedLinePoint *start, NedLinePoint *mid, NedLinePoint *end) : NedLine(start, end), m_line_mid_point(mid), m_intermediate_staves1(NULL), m_intermediate_staves2(NULL) { mid->setLine(this); computeParams(); }