int inc(zz_pE& x) { long d = deg(x.modulus()), i; zz_pE tee = to_zz_pE(zz_pX(1,1)), tee_to_i = to_zz_pE(zz_pX(0,1)); i = 0; do { x += tee_to_i; tee_to_i *= tee; } while (coeff(x.LoopHole(),i) == 0 && ++i < d); return (i >= d) ? 1 : 0; }
void buildLinPolyMatrix(mat_zz_pE& M, long p) { long d = zz_pE::degree(); M.SetDims(d, d); for (long j = 0; j < d; j++) conv(M[0][j], zz_pX(j, 1)); for (long i = 1; i < d; i++) for (long j = 0; j < d; j++) M[i][j] = power(M[i-1][j], p); }
void applyLinPoly(zz_pE& beta, const vec_zz_pE& C, const zz_pE& alpha, long p) { long d = zz_pE::degree(); assert(d == C.length()); zz_pE gamma, res; gamma = to_zz_pE(zz_pX(1, 1)); res = C[0]*alpha; for (long i = 1; i < d; i++) { gamma = power(gamma, p); res += C[i]*to_zz_pE(CompMod(rep(alpha), rep(gamma), zz_pE::modulus())); } beta = res; }
int main(int argc, char *argv[]) { argmap_t argmap; argmap["p"] = "5"; argmap["m"] = "101"; argmap["r"] = "1"; if (!parseArgs(argc, argv, argmap)) usage(argv[0]); long p = atoi(argmap["p"]); long m = atoi(argmap["m"]); long r = atoi(argmap["r"]); cout << "p=" << p << ", m=" << m << ", r=" << r << "\n"; ZZX phimx = Cyclotomic(m); zz_p::init(p); zz_pX phimx_modp = to_zz_pX(phimx); vec_zz_pX factors = SFCanZass(phimx_modp); vec_ZZX FFactors; MultiLift(FFactors, factors, phimx, r); zz_p::init(power_long(p, r)); vec_zz_pX Factors; Factors.SetLength(FFactors.length()); for (long i = 0; i < Factors.length(); i++) conv(Factors[i], FFactors[i]); zz_pX G = Factors[0]; long d = deg(G); cout << "d=" << d << "\n"; zz_pE::init(G); // L selects the even coefficients vec_zz_pE L; L.SetLength(d); for (long j = 0; j < d; j++) { if (j % 2 == 0) L[j] = to_zz_pE(zz_pX(j, 1)); } vec_zz_pE C; buildLinPolyCoeffs(C, L, p, r); zz_pE alpha, beta; random(alpha); applyLinPoly(beta, C, alpha, p); cout << alpha << "\n"; cout << beta << "\n"; }