static long FindTrinom(long n) { if (n < 2) Error("tri--bad n"); long k; for (k = 1; k <= n/2; k++) if (IterIrredTest(1 + GF2X(k,1) + GF2X(n,1))) return k; return 0; }
static long FindPent(long n, long& kk2, long& kk1) { if (n < 4) Error("pent--bad n"); long k1, k2, k3; for (k3 = 3; k3 < n; k3++) for (k2 = 2; k2 < k3; k2++) for (k1 = 1; k1 < k2; k1++) if (IterIrredTest(1+GF2X(k1,1)+GF2X(k2,1)+GF2X(k3,1)+GF2X(n,1))) { kk2 = k2; kk1 = k1; return k3; } return 0; }
void buildLinPolyMatrix(mat_GF2E& M, long p) { assert(p == 2); long d = GF2E::degree(); M.SetDims(d, d); for (long j = 0; j < d; j++) conv(M[0][j], GF2X(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(GF2E& beta, const vec_GF2E& C, const GF2E& alpha, long p) { long d = GF2E::degree(); assert(d == C.length()); GF2E gamma, res; gamma = to_GF2E(GF2X(1, 1)); res = C[0]*alpha; for (long i = 1; i < d; i++) { gamma = power(gamma, p); res += C[i]*to_GF2E(CompMod(rep(alpha), rep(gamma), GF2E::modulus())); } beta = res; }