long group_ident(GEN G, GEN S) { pari_sp av = avma; long idx = group_ident_i(G, S); if (idx < 0) pari_err_TYPE("group_ident [not a group]", G); if (!idx) pari_err_IMPL("galoisidentify for groups of order > 127"); avma = av; return idx; }
static long check_proto(const char *code) { long arity = 0; const char *s = code, *old; if (*s == 'l' || *s == 'v' || *s == 'i' || *s == 'm' || *s == 'u') s++; while (*s && *s != '\n') switch (*s++) { case '&': case 'C': case 'G': case 'I': case 'J': case 'U': case 'L': case 'M': case 'P': case 'W': case 'f': case 'n': case 'p': case 'r': case 'x': arity++; break; case 'E': case 's': if (*s == '*') s++; arity++; break; case 'D': if (*s == 'G' || *s == '&' || *s == 'n' || *s == 'I' || *s == 'E' || *s == 'V' || *s == 'P' || *s == 's' || *s == 'r') { if (*s != 'V') arity++; s++; break; } old = s; while (*s && *s != ',') s++; if (*s != ',') pari_err(e_SYNTAX, "missing comma", old, code); break; case 'V': case '=': case ',': break; case '\n': break; /* Before the mnemonic */ case 'm': case 'l': case 'i': case 'v': pari_err(e_SYNTAX, "this code has to come first", s-1, code); default: pari_err(e_SYNTAX, "unknown parser code", s-1, code); } if (arity > 20) pari_err_IMPL("functions with more than 20 parameters"); return arity; }
long group_ident_trans(GEN G, GEN S) { const long tab[]={ 4, 1, 2, -1, 6, 2, 1, -1, 8, 1, 2, 4, 5, 3, -1, 9, 1, 2, -1, 10, 2, 1, -1, 12, 5, 1, 4, 3, 2, -1, 14, 2, 1, -1, 15, 1, -1, 16, 1, 4, 10, 8, 5, 6, 13, 12, 14, 2, 9, 7, 11, 3, -1, 18, 5, 1, 3, 4, 2, -1, 20, 2, 1, 5, 4, 3, -1, 21, 2, 1, -1, 22, 2, 1, -1, 24, 8, 1, 7, 5, 12, 13, 6, 14, 2, 15, 4, 10, 9, 11, 3, -1, 25, 1, 2, -1, 26, 2, 1, -1, 27, 1, 2, 3, 5, 4, -1, 28, 3, 1, 4, 2, -1, 30, 2, 4, 3, 1, -1, -1}; long n = group_order(G), s; const long *t; if (n == 1) return 1; /* N.B. known up to 32 (Cannon-Holt) */ if (n > 30) pari_err_IMPL("group_ident_trans [n > 30]"); if (uisprime(n)) return 1; s = group_ident(G,S); for(t=tab;*t>=0;t++) { if (t[0]==n) return t[s]; while (*t>=0) t++; } return 0; /*NOT REACHED*/ }
/* [L:K] = ell^k; return 1 if L/K is locally cyclotomic at ell, 0 otherwise */ long rnfislocalcyclo(GEN rnf) { pari_sp av = avma; GEN K, L, S, SK, TK, SLs, SL2, TL, ell; ulong ll; long i, j, k, lk, lSK; checkrnf(rnf); lk = rnf_get_degree(rnf); if (lk == 1) return 1; k = uisprimepower(lk, &ll); if (!k) pari_err_IMPL("rnfislocalcyclo for non-l-extensions"); ell = utoi(ll); K = rnf_get_nf(rnf); L = rnf_build_nfabs(rnf, nf_get_prec(K)); S = rnfidealprimedec(rnf, ell); SK = gel(S,1); SLs = gel(S,2); SL2 = shallowconcat1(SLs); TK = padicfact(K, SK, 100); lSK = lg(SK); TL = padicfact(L, SL2, 100); for (i = 1; i < lSK; i++) { long eK = etilde(K, gel(SK,i), gel(TK,i)); GEN SL = gel(SLs,i); long lSL = lg(SL); for (j = 1; j < lSL; j++) { long iS = gen_search(SL2, gel(SL,j), 0, (void*)&cmp_prime_over_p, &cmp_nodata); long eL = etilde(L, gel(SL,j), gel(TL,iS)); if (dvdui(eL/eK, ell)) { avma = av; return 0; } } }; avma = av; return 1; }