Example #1
0
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);
}
Example #2
0
        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)
    {