X-Git-Url: https://git.distorted.org.uk/u/mdw/catacomb/blobdiff_plain/10217a5c148f63def6fc564960a9f28ae42d52dc..2685767a6125c1620719c7de6234aedf41857b7e:/limlee.c diff --git a/limlee.c b/limlee.c index 60f6bb5..3f8435b 100644 --- a/limlee.c +++ b/limlee.c @@ -1,6 +1,6 @@ /* -*-c-*- * - * $Id: limlee.c,v 1.5 2000/08/18 19:16:51 mdw Exp $ + * $Id: limlee.c,v 1.8 2001/02/03 11:59:07 mdw Exp $ * * Generate Lim-Lee primes * @@ -30,6 +30,16 @@ /*----- Revision history --------------------------------------------------* * * $Log: limlee.c,v $ + * Revision 1.8 2001/02/03 11:59:07 mdw + * Don't use the @pgen@ random number generator for generating primes: it's + * only for testing them. Use a caller-supplied one instead. + * + * Revision 1.7 2001/01/25 21:40:44 mdw + * Remove dead code now that the new stepper structure is trustworthy. + * + * Revision 1.6 2001/01/25 21:16:20 mdw + * Boring cosmetic stuff. + * * Revision 1.5 2000/08/18 19:16:51 mdw * New stepper interface for constructing Lim-Lee primes. * @@ -150,8 +160,7 @@ again: static void llfree(limlee_factor *f, limlee_stepctx *l) { - if (f->p) - mp_drop(f->p); + mp_drop(f->p); } static const limlee_primeops primeops_simple = { llgen, llfree }; @@ -205,7 +214,6 @@ static int init(pgen_event *ev, limlee_stepctx *l) /* --- Other bits of initialization --- */ l->seq = 0; - l->r = ev->r; dstr_create(&l->d); if (!l->pops) { l->pops = &primeops_simple; @@ -240,9 +248,7 @@ static int next(int rq, pgen_event *ev, limlee_stepctx *l) mp *p; int rc; - if (ev->m) - mp_drop(ev->m); - l->r = ev->r; + mp_drop(ev->m); for (;;) { size_t i; @@ -393,209 +399,6 @@ mp *limlee(const char *name, mp *d, mp *newp, pgen_proc *iev, void *iec, size_t *nf, mp ***f) { -#ifdef notdef - dstr dn = DSTR_INIT; - unsigned qql; - mp *qq = 0; - unsigned nn; - unsigned mm; - mp **v; - octet *c; - unsigned i; - unsigned long seq = 0; - pgen_event ev; - unsigned ntest; - rabin rb; - pgen_filterctx pf; - - /* --- First of all, decide on a number of factors to make --- */ - - nn = pl/ql; - qql = pl%ql; - if (!nn) - return (0); - else if (qql && nn > 1) { - nn--; - qql += ql; - } - - /* --- Now decide on how many primes I'll actually generate --- * - * - * The formula %$m = \max(3 n + 5, 25)$% comes from GPG's prime generation - * library. - */ - - mm = nn * 3 + 5; - if (mm < 25) - mm = 25; - - /* --- Now allocate the working memory --- */ - - v = xmalloc(mm * sizeof(mp *)); - c = xmalloc(mm); - - /* --- Initialize everything and try to find a prime --- */ - - ev.name = name; - ev.m = 0; - ev.steps = on; - ev.tests = ntest = rabin_iters(pl); - ev.r = r; - - if (oev && oev(PGEN_BEGIN, &ev, oec) == PGEN_ABORT) - goto fail; - - pf.step = 2; - if (qql) { - dstr_putf(&dn, "%s*", name); - qq = mprand(d, qql, r, 1); - qq = pgen(dn.buf, qq, qq, iev, iec, - 0, pgen_filter, &pf, rabin_iters(qql), pgen_test, &rb); - } - -again: - comb_init(c, mm, nn); - for (i = 0; i < mm; i++) - v[i] = 0; - - /* --- The main combinations loop --- */ - - do { - mpmul mmul = MPMUL_INIT; - - /* --- Multiply a bunch of primes together --- */ - - if (qq) { - mpmul_add(&mmul, qq); - } - for (i = 0; i < mm; i++) { - if (!c[i]) - continue; - if (!v[i]) { - mp *z; - - DRESET(&dn); - dstr_putf(&dn, "%s_%lu] = ", name, seq++); - z = mprand(newp, ql, ev.r, 1); - z = pgen(dn.buf, z, z, iev, iec, - 0, pgen_filter, &pf, rabin_iters(ql), pgen_test, &rb); - v[i] = z; - } - mpmul_add(&mmul, v[i]); - } - - /* --- Now do some testing --- */ - - { - mp *p = mpmul_done(&mmul); - mp *g; - int rc; - - /* --- Check for small factors --- */ - - p = mp_lsl(p, p, 1); - p = mp_add(p, p, MP_ONE); - rc = pfilt_smallfactor(p); - if (rc == PGEN_FAIL) { - mp_drop(p); - continue; - } - - /* --- Send an event out --- */ - - ev.m = p; - if (oev && oev(PGEN_TRY, &ev, oec) == PGEN_ABORT) { - mp_drop(p); - goto fail; - } - - /* --- Do the Rabin testing --- */ - - rabin_create(&rb, p); - g = MP_NEW; - do { - g = mprand_range(g, p, ev.r, 1); - rc = rabin_test(&rb, g); - if (rc == PGEN_PASS) { - ev.tests--; - if (!ev.tests) - rc = PGEN_DONE; - } - if (oev &&oev(rc, &ev, oec) == PGEN_ABORT) - rc = PGEN_ABORT; - } while (rc == PGEN_PASS); - - rabin_destroy(&rb); - mp_drop(g); - if (rc == PGEN_DONE) - d = p; - else - mp_drop(p); - if (rc == PGEN_ABORT) - goto fail; - if (rc == PGEN_DONE) - goto done; - ev.tests = ntest; - ev.m = 0; - } - } while (comb_next(c, mm, nn)); - - /* --- That failed --- */ - - if (ev.steps) { - ev.steps--; - if (!ev.steps) { - if (oev) - oev(PGEN_ABORT, &ev, &oec); - goto fail; - } - } - - for (i = 0; i < mm; i++) - mp_drop(v[i]); - goto again; - - /* --- We did it! --- */ - -done: { - mp **vv = 0; - if (f) { - if (qq) - nn++; - *nf = nn; - *f = vv = xmalloc(nn * sizeof(mp *)); - } - - for (i = 0; i < mm; i++) { - if (c[i] && vv) - *vv++ = v[i]; - else if (v[i]) - mp_drop(v[i]); - } - if (qq) { - if (vv) - *vv++ = qq; - else - mp_drop(qq); - } - xfree(v); - xfree(c); - dstr_destroy(&dn); - return (d); - } - - /* --- We blew it --- */ - -fail: - for (i = 0; i < mm; i++) - mp_drop(v[i]); - if (qq) - mp_drop(qq); - xfree(v); - xfree(c); - dstr_destroy(&dn); - return (0); -#else limlee_stepctx l; rabin rr; @@ -605,6 +408,7 @@ fail: l.pops = 0; l.iev = iev; l.iec = iec; + l.r = r; d = pgen(name, d, 0, oev, oec, on, limlee_step, &l, rabin_iters(pl), pgen_test, &rr); @@ -621,7 +425,6 @@ fail: } return (d); -#endif } /*----- That's all, folks -------------------------------------------------*/