static long nfislocalpower_i(GEN nf, GEN pr, GEN a, GEN n) { long v, e, t; GEN p, G; a = nf_to_scalar_or_basis(nf,a); checkprid(pr); if (!signe(n)) return isint1(a); v = nfvalrem(nf, a, pr, &a); p = pr_get_p(pr); if (!dvdsi(v, n)) return 0; v = Z_pvalrem(n, p, &n); if (!equali1(n)) { GEN T, modpr = zk_to_Fq_init(nf, &pr, &T, &p); GEN ap = nf_to_Fq(nf, a, modpr); if (!Fq_ispower(ap, n, T, p)) return 0; } if (!v) return 1; e = pr_get_e(pr); if (v == 1) /* optimal formula */ t = itos( divii(mului(e,p), subiu(p,1)) ) + 1; else /* straight Hensel */ t = 2 * e * v + 1; G = Idealstarprk(nf, pr, t, nf_INIT); return (ZV_pval(ideallog(nf, a, G), p) >= v); }
m = addis(mulis(m, B), smodis(n, B)); n = divis(n, B); if (low_stack(st_lim, stack_lim(btop, 1))) gerepileall(btop, 2, &m, &n); } m = gerepilecopy(av, m); return m; } // Return value: Did the user break out of the loop? // Not stack clean. int palhelper(long digits, GEN a, GEN b, GEN code) { GEN p10 = powuu(10, (digits+1)>>1); GEN aLeft = divii(a, p10); GEN bLeft = divii(b, p10); GEN cur; // TODO: Handle case of digits odd (middle digit) pari_sp btop = avma, lim = stack_lim(btop,1); cur = addii(mulii(aLeft, p10), rev(aLeft, 10)); if (cmpii(cur, a) < 0) { aLeft = addis(aLeft, 1); cur = addii(mulii(aLeft, p10), rev(aLeft, 10)); } push_lex(cur, code); while (cmpii(aLeft, bLeft) < 0) {