X-Git-Url: https://git.distorted.org.uk/u/mdw/catacomb/blobdiff_plain/fcdaa1806c38c703a6e72b87e189396a05d165e4..2685767a6125c1620719c7de6234aedf41857b7e:/prim.c diff --git a/prim.c b/prim.c index bdad98b..752da9f 100644 --- a/prim.c +++ b/prim.c @@ -1,6 +1,6 @@ /* -*-c-*- * - * $Id: prim.c,v 1.1 1999/12/22 15:58:59 mdw Exp $ + * $Id: prim.c,v 1.3 2000/10/08 12:11:22 mdw Exp $ * * Finding primitive elements * @@ -30,6 +30,14 @@ /*----- Revision history --------------------------------------------------* * * $Log: prim.c,v $ + * Revision 1.3 2000/10/08 12:11:22 mdw + * Use @MP_EQ@ instead of @MP_CMP@. + * + * Revision 1.2 2000/07/29 09:57:42 mdw + * Improve primitive-element testing a lot. Now much more sensible and + * orthogonal: you can find a generator for any given subgroup order by + * putting in the appropriate parameters. + * * Revision 1.1 1999/12/22 15:58:59 mdw * Search for primitive elements using prime-search equipment. * @@ -57,27 +65,37 @@ int prim_test(int rq, pgen_event *ev, void *p) case PGEN_BEGIN: return (PGEN_TRY); case PGEN_TRY: { - mp *x = MP_NEW; - mp *f = c->f; + mp *x; rc = PGEN_FAIL; - x = mpmont_exp(&c->mm, x, ev->m, f); - if (MP_CMP(x, ==, MP_ONE)) - goto done; - if (c->n == 0) { - mp_drop(ev->m); - ev->m = MP_COPY(x); - } else { - size_t n = c->n - 1; - f++; + if (!c->exp) + x = mp_copy(ev->m); + else { + x = mpmont_exp(&c->mm, MP_NEW, ev->m, c->exp); + if (MP_EQ(x, MP_ONE)) + goto done; + } + if (c->n == 0) + goto ok; + else { + size_t n = c->n; + mp **f = c->f; + mp *y = MP_NEW; while (n) { - x = mpmont_exp(&c->mm, x, ev->m, f); - if (MP_CMP(x, ==, MP_ONE)) + y = mpmont_exp(&c->mm, y, x, *f); + if (MP_EQ(y, MP_ONE)) { + mp_drop(y); goto done; + } n--; f++; } + mp_drop(y); } + ok: rc = PGEN_DONE; + mp_drop(ev->m); + ev->m = x; + break; done: mp_drop(x); } break;