/* Usage: Test_EvalMap_x.exe [ name=value ]... * p plaintext base [ default=2 ] * r lifting [ default=1 ] * c number of columns in the key-switching matrices [ default=2 ] * k security parameter [ default=80 ] * L # of bits in the modulus chain * s minimum number of slots [ default=0 ] * seed PRG seed [ default=0 ] * mvec use specified factorization of m * e.g., mvec='[5 3 187]' * gens use specified vector of generators * e.g., gens='[562 1871 751]' * ords use specified vector of orders * e.g., ords='[4 2 -4]', negative means 'bad' */ int main(int argc, char *argv[]) { ArgMapping amap; long p=2; amap.arg("p", p, "plaintext base"); long r=1; amap.arg("r", r, "lifting"); long c=2; amap.arg("c", c, "number of columns in the key-switching matrices"); long k=80; amap.arg("k", k, "security parameter"); long L=300; amap.arg("L", L, "# of bits in the modulus chain"); long s=0; amap.arg("s", s, "minimum number of slots"); long seed=0; amap.arg("seed", seed, "PRG seed"); Vec<long> mvec; amap.arg("mvec", mvec, "use specified factorization of m", NULL); amap.note("e.g., mvec='[7 3 221]'"); Vec<long> gens; amap.arg("gens", gens, "use specified vector of generators", NULL); amap.note("e.g., gens='[3979 3095 3760]'"); Vec<long> ords; amap.arg("ords", ords, "use specified vector of orders", NULL); amap.note("e.g., ords='[6 2 -8]', negative means 'bad'"); amap.arg("dry", dry, "a dry-run flag to check the noise"); long nthreads=1; amap.arg("nthreads", nthreads, "number of threads"); amap.arg("noPrint", noPrint, "suppress printouts"); long useCache=0; amap.arg("useCache", useCache, "0: zzX cache, 2: DCRT cache"); amap.parse(argc, argv); SetNumThreads(nthreads); SetSeed(conv<ZZ>(seed)); TestIt(p, r, c, k, L, mvec, gens, ords, useCache); }
int main(int argc, char *argv[]) { ArgMapping amap; bool dry=false; amap.arg("dry", dry, "dry=1 for a dry-run"); long m=2047; amap.arg("m", m, "cyclotomic ring"); long p=2; amap.arg("p", p, "plaintext base"); long r=1; amap.arg("r", r, "lifting"); long d=1; amap.arg("d", d, "degree of the field extension"); amap.note("d == 0 => factors[0] defines extension"); long L=3; amap.arg("L", L, "# of levels in the modulus chain", "heuristic"); long bnd = 64; amap.arg("bnd", bnd, "recursion bound for replication"); long B = 0; amap.arg("B", B, "bound for # of replications", "all"); amap.parse(argc, argv); setDryRun(dry); TestIt(m, p, r, d, L, bnd, B); cout << endl; }
int main(int argc, char *argv[]) { ArgMapping amap; long p=2; long r=1; long c=3; long L=600; long N=0; long t=0; long nthreads=1; long seed=0; long useCache=1; amap.arg("p", p, "plaintext base"); amap.arg("r", r, "exponent"); amap.note("p^r is the plaintext-space modulus"); amap.arg("c", c, "number of columns in the key-switching matrices"); amap.arg("L", L, "# of levels in the modulus chain"); amap.arg("N", N, "lower-bound on phi(m)"); amap.arg("t", t, "Hamming weight of recryption secret key", "heuristic"); amap.arg("dry", dry, "dry=1 for a dry-run"); amap.arg("nthreads", nthreads, "number of threads"); amap.arg("seed", seed, "random number seed"); amap.arg("noPrint", noPrint, "suppress printouts"); amap.arg("useCache", useCache, "0: zzX cache, 1: DCRT cache"); amap.arg("force_bsgs", fhe_test_force_bsgs); amap.arg("force_hoist", fhe_test_force_hoist); // amap.arg("disable_intFactor", fhe_disable_intFactor); amap.arg("chen_han", fhe_force_chen_han); amap.arg("debug", debug, "generate debugging output"); amap.arg("scale", scale, "scale parameter"); amap.parse(argc, argv); if (seed) SetSeed(ZZ(seed)); SetNumThreads(nthreads); for (long i=0; i<(long)num_mValues; i++) if (mValues[i][0]==p && mValues[i][1]>=N) { TestIt(i,p,r,L,c,t,useCache); break; } return 0; }
int main(int argc, char *argv[]) { ArgMapping amap; long m=17; amap.arg("m", m, "cyclotomic index"); amap.note("e.g., m=2047"); long p=2; amap.arg("p", p, "plaintext base"); long r=1; amap.arg("r", r, "lifting"); Vec<long> gens0; amap.arg("gens", gens0, "use specified vector of generators", NULL); amap.note("e.g., gens='[562 1871 751]'"); Vec<long> ords0; amap.arg("ords", ords0, "use specified vector of orders", NULL); amap.note("e.g., ords='[4 2 -4]', negative means 'bad'"); amap.parse(argc, argv); cout << "m = " << m << ", p = " << p << ", r = " << r << endl; vector<long> f; factorize(f,m); cout << "factoring "<<m<<" gives ["; for (unsigned long i=0; i<f.size(); i++) cout << f[i] << " "; cout << "]\n"; vector<long> gens1, ords1; convert(gens1, gens0); convert(ords1, ords0); PAlgebra al(m, p, gens1, ords1); al.printout(); cout << "\n"; PAlgebraMod almod(al, r); FHEcontext context(m, p, r); buildModChain(context, 5, 2); stringstream s1; writeContextBase(s1, context); s1 << context; string s2 = s1.str(); cout << s2 << endl; stringstream s3(s2); unsigned long m1, p1, r1; vector<long> gens, ords; readContextBase(s3, m1, p1, r1, gens, ords); FHEcontext c1(m1, p1, r1, gens, ords); s3 >> c1; if (context == c1) cout << "equal\n"; else cout << "not equal\n"; return 0; }
int main(int argc, char *argv[]) { // Commandline setup ArgMapping amap; long m=16; long r=8; long L=0; double epsilon=0.01; // Accepted accuracy long R=1; long seed=0; bool debug = false; amap.arg("m", m, "Cyclotomic index"); amap.note("e.g., m=1024, m=2047"); amap.arg("r", r, "Bits of precision"); amap.arg("R", R, "number of rounds"); amap.arg("L", L, "Number of bits in modulus", "heuristic"); amap.arg("ep", epsilon, "Accepted accuracy"); amap.arg("seed", seed, "PRG seed"); amap.arg("verbose", verbose, "more printouts"); amap.arg("debug", debug, "for debugging"); amap.parse(argc, argv); if (seed) NTL::SetSeed(ZZ(seed)); if (R<=0) R=1; if (R<=2) L = 100*R; else L = 220*(R-1); if (verbose) { cout << "** m="<<m<<", #rounds="<<R<<", |q|="<<L << ", epsilon="<<epsilon<<endl; } epsilon /= R; try{ // FHE setup keys, context, SKMs, etc FHEcontext context(m, /*p=*/-1, r); context.scale=4; buildModChain(context, L, /*c=*/2); FHESecKey secretKey(context); secretKey.GenSecKey(); // A +-1/0 secret key addSome1DMatrices(secretKey); // compute key-switching matrices const FHEPubKey publicKey = secretKey; const EncryptedArrayCx& ea = context.ea->getCx(); if (verbose) { ea.getPAlgebra().printout(); cout << "r = " << context.alMod.getR() << endl; cout << "ctxtPrimes="<<context.ctxtPrimes << ", specialPrimes="<<context.specialPrimes<<endl<<endl; } if (debug) { dbgKey = & secretKey; dbgEa = (EncryptedArray*) context.ea; } // Run the tests. testBasicArith(publicKey, secretKey, ea, epsilon); testComplexArith(publicKey, secretKey, ea, epsilon); testRotsNShifts(publicKey, secretKey, ea, epsilon); testGeneralOps(publicKey, secretKey, ea, epsilon*R, R); } catch (exception& e) { cerr << e.what() << endl; cerr << "***Major FAIL***" << endl; } return 0; }
int main(int argc, char *argv[]) { ArgMapping amap; amap.arg("noPrint", noPrint, "suppress printouts"); long m=16; amap.arg("m", m, "cyclotomic index"); amap.note("e.g., m=1024, m=2047"); long r=8; amap.arg("r", r, "bit of precision"); amap.parse(argc, argv); if (!noPrint) { vector<long> f; factorize(f,m); cout << "r="<<r<<", factoring "<<m<<" gives ["; for (unsigned long i=0; i<f.size(); i++) cout << f[i] << " "; cout << "]\n"; } FHEcontext context(m, /*p=*/-1, r); buildModChain(context, 5, 2); const EncryptedArrayCx& ea = context.ea->getCx(); if (!noPrint) ea.getPAlgebra().printout(); #ifdef DEBUG_PRINTOUT vector<cx_double> vc1; ea.random(vc1); cout << "random complex vc1="; printVec(cout,vc1,8)<<endl; vector<double> vd; ea.random(vd); cout << "random real vd="; printVec(cout,vd,8)<<endl; #endif vector<double> vl; ea.random(vl); vl[1] = -1; // ensure that this is not the zero vector #ifdef DEBUG_PRINTOUT cout << "random int v="; printVec(cout,vl,8)<<endl; #endif zzX poly; double factor = ea.encode(poly, vl, 1.0); if (!noPrint) { ZZX poly2; convert(poly2, poly); cout << " encoded into a degree-"<<NTL::deg(poly2)<<" polynomial\n"; } vector<double> vd2; ea.decode(vd2, poly, factor); #ifdef DEBUG_PRINTOUT cout << " decoded into vd2="; printVec(cout,vd2,8)<<endl; #endif assert(lsize(vl)==lsize(vd2)); double maxDiff = 0.0; for (long i=0; i<lsize(vl); i++) { double diffAbs = std::abs(vl[i]-vd2[i]); if (diffAbs > maxDiff) maxDiff = diffAbs; } cout << ((maxDiff>0.1)? "BAD?" : "GOOD?") << " max |v-vd2|_{infty}="<<maxDiff << endl; return 0; }